From 42b15dfc57e16ea9410688b48b49e9ba608b7c28 Mon Sep 17 00:00:00 2001 From: Lionello Lunesu Date: Wed, 3 Jul 2024 14:56:13 -0700 Subject: [PATCH] wip: keep compose as-is --- src/cmd/cli/command/commands.go | 11 +- src/cmd/cli/command/deploymentinfo.go | 21 +- src/cmd/cli/command/deploymentinfo_test.go | 61 + src/pkg/cli/cert.go | 20 +- src/pkg/cli/client/byoc/aws/byoc.go | 75 +- src/pkg/cli/client/byoc/aws/byoc_test.go | 10 +- src/pkg/cli/client/byoc/do/byoc.go | 30 +- src/pkg/cli/client/client.go | 2 +- src/pkg/cli/client/playground.go | 29 +- src/pkg/cli/composeRestart.go | 5 +- src/pkg/cli/getServices.go | 2 +- src/pkg/cli/restart.go | 5 +- src/pkg/quota/quota.go | 55 +- src/pkg/quota/quota_test.go | 169 +- .../v1/defangv1connect/fabric.connect.go | 35 + src/protos/io/defang/v1/fabric.pb.go | 1635 +++++++++-------- src/protos/io/defang/v1/fabric.proto | 43 +- 17 files changed, 1220 insertions(+), 988 deletions(-) create mode 100644 src/cmd/cli/command/deploymentinfo_test.go diff --git a/src/cmd/cli/command/commands.go b/src/cmd/cli/command/commands.go index 28d8b617d..ca903fe27 100644 --- a/src/cmd/cli/command/commands.go +++ b/src/cmd/cli/command/commands.go @@ -27,9 +27,6 @@ import ( "github.com/spf13/cobra" ) -const DEFANG_PORTAL_HOST = "portal.defang.dev" -const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" - const authNeeded = "auth-needed" // annotation to indicate that a command needs authorization var authNeededAnnotation = map[string]string{authNeeded: ""} @@ -886,11 +883,11 @@ var composeRestartCmd = &cobra.Command{ Args: cobra.NoArgs, // TODO: takes optional list of service names Short: "Reads a Compose file and restarts its services", RunE: func(cmd *cobra.Command, args []string) error { - etag, err := cli.ComposeRestart(cmd.Context(), client) + err := cli.ComposeRestart(cmd.Context(), client) if err != nil { return err } - term.Info("Restarted services with deployment ID", etag) + term.Info("Restarted services") return nil }, } @@ -1020,11 +1017,11 @@ var restartCmd = &cobra.Command{ Args: cobra.MinimumNArgs(1), Short: "Restart one or more services", RunE: func(cmd *cobra.Command, args []string) error { - etag, err := cli.Restart(cmd.Context(), client, args...) + err := cli.Restart(cmd.Context(), client, args...) if err != nil { return err } - term.Info("Restarted service", args, "with deployment ID", etag) + term.Info("Restarted service", args) return nil }, } diff --git a/src/cmd/cli/command/deploymentinfo.go b/src/cmd/cli/command/deploymentinfo.go index 84cf34c02..55af4d554 100644 --- a/src/cmd/cli/command/deploymentinfo.go +++ b/src/cmd/cli/command/deploymentinfo.go @@ -1,7 +1,7 @@ package command import ( - "fmt" + "strings" "github.com/DefangLabs/defang/src/pkg/cli" cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" @@ -9,12 +9,15 @@ import ( defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" ) +const DEFANG_PORTAL_HOST = "portal.defang.dev" +const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" + func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) { // We can only show services deployed to the prod1 defang SaaS environment. if provider == cliClient.ProviderDefang && cluster == cli.DefaultCluster { term.Info("Monitor your services' status in the defang portal") for _, serviceInfo := range serviceInfos { - fmt.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) + term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) } } } @@ -26,17 +29,17 @@ func printEndpoints(serviceInfos []*defangv1.ServiceInfo) { andEndpoints = "and will be available at:" } term.Info("Service", serviceInfo.Service.Name, "is in state", serviceInfo.Status, andEndpoints) - for i, endpoint := range serviceInfo.Endpoints { - if serviceInfo.Service.Ports[i].Mode == defangv1.Mode_INGRESS { - endpoint = "https://" + endpoint + for _, endpoint := range serviceInfo.Endpoints { + if url, ok := strings.CutSuffix(endpoint, ":443"); ok { + endpoint = "https://" + url } - fmt.Println(" -", endpoint) + term.Println(" -", endpoint) } - if serviceInfo.Service.Domainname != "" { + if serviceInfo.Domainname != "" { if serviceInfo.ZoneId != "" { - fmt.Println(" -", "https://"+serviceInfo.Service.Domainname) + term.Println(" -", "https://"+serviceInfo.Domainname) } else { - fmt.Println(" -", "https://"+serviceInfo.Service.Domainname+" (after `defang cert generate` to get a TLS certificate)") + term.Println(" -", "https://"+serviceInfo.Domainname+" (after `defang cert generate` to get a TLS certificate)") } } } diff --git a/src/cmd/cli/command/deploymentinfo_test.go b/src/cmd/cli/command/deploymentinfo_test.go new file mode 100644 index 000000000..cdc874ea9 --- /dev/null +++ b/src/cmd/cli/command/deploymentinfo_test.go @@ -0,0 +1,61 @@ +package command + +import ( + "bytes" + "testing" + + "github.com/DefangLabs/defang/src/pkg/cli" + cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" +) + +func TestPrintPlaygroundPortalServiceURLs(t *testing.T) { + defaultTerm := term.DefaultTerm + t.Cleanup(func() { + term.DefaultTerm = defaultTerm + }) + + var stdout, stderr bytes.Buffer + term.DefaultTerm = term.NewTerm(&stdout, &stderr) + + provider = cliClient.ProviderDefang + cluster = cli.DefaultCluster + printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{ + { + Service: &defangv1.ServiceID{Name: "service1"}, + }}) + const want = ` * Monitor your services' status in the defang portal + - https://portal.defang.dev/service/service1 +` + if got := stdout.String(); got != want { + t.Errorf("got %q, want %q", got, want) + } +} + +func TestPrintEndpoints(t *testing.T) { + defaultTerm := term.DefaultTerm + t.Cleanup(func() { + term.DefaultTerm = defaultTerm + }) + + var stdout, stderr bytes.Buffer + term.DefaultTerm = term.NewTerm(&stdout, &stderr) + + printEndpoints([]*defangv1.ServiceInfo{ + { + Service: &defangv1.ServiceID{Name: "service1"}, + Status: "UNKNOWN", + Endpoints: []string{ + "example.com:443", + "service1.internal", + }, + }}) + const want = ` * Service service1 is in state UNKNOWN and will be available at: + - https://example.com + - service1.internal +` + if got := stdout.String(); got != want { + t.Errorf("got %q, want %q", got, want) + } +} diff --git a/src/pkg/cli/cert.go b/src/pkg/cli/cert.go index a2b3c12d5..f2019caaf 100644 --- a/src/pkg/cli/cert.go +++ b/src/pkg/cli/cert.go @@ -14,9 +14,9 @@ import ( "github.com/DefangLabs/defang/src/pkg" cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/dns" + "github.com/DefangLabs/defang/src/pkg/quota" "github.com/DefangLabs/defang/src/pkg/spinner" "github.com/DefangLabs/defang/src/pkg/term" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" ) type HTTPClient interface { @@ -27,11 +27,11 @@ var resolver dns.Resolver = dns.RootResolver{} var httpClient HTTPClient = http.DefaultClient func GenerateLetsEncryptCert(ctx context.Context, client cliClient.Client) error { - projectName, err := client.LoadProjectName(ctx) + project, err := client.LoadProject(ctx) if err != nil { return err } - term.Debugf("Generating TLS cert for project %q", projectName) + term.Debugf("Generating TLS cert for project %q", project.Name) services, err := client.GetServices(ctx) if err != nil { @@ -39,17 +39,17 @@ func GenerateLetsEncryptCert(ctx context.Context, client cliClient.Client) error } cnt := 0 - for _, service := range services.Services { - if service.Service != nil && service.Service.Domainname != "" && service.ZoneId == "" { + for _, serviceInfo := range services.Services { + if service, ok := project.Services[serviceInfo.Service.Name]; ok && service.DomainName != "" && serviceInfo.ZoneId == "" { cnt++ - targets := []string{service.PublicFqdn} - for i, endpoint := range service.Endpoints { - if service.Service.Ports[i].Mode == defangv1.Mode_INGRESS { + targets := []string{serviceInfo.PublicFqdn} + for i, endpoint := range serviceInfo.Endpoints { + if service.Ports[i].Mode == quota.Mode_INGRESS { targets = append(targets, endpoint) } } - term.Debugf("Found service %v with domain %v and targets %v", service.Service.Name, service.Service.Domainname, targets) - generateCert(ctx, service.Service.Domainname, targets) + term.Debugf("Found service %v with domain %v and targets %v", service.Name, service.DomainName, targets) + generateCert(ctx, service.DomainName, targets) } } if cnt == 0 { diff --git a/src/pkg/cli/client/byoc/aws/byoc.go b/src/pkg/cli/client/byoc/aws/byoc.go index 8f9fc9d0b..eeeb50f8a 100644 --- a/src/pkg/cli/client/byoc/aws/byoc.go +++ b/src/pkg/cli/client/byoc/aws/byoc.go @@ -20,6 +20,7 @@ import ( "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs/cfn" "github.com/DefangLabs/defang/src/pkg/http" + "github.com/DefangLabs/defang/src/pkg/quota" "github.com/DefangLabs/defang/src/pkg/term" "github.com/DefangLabs/defang/src/pkg/types" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" @@ -31,6 +32,8 @@ import ( "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/smithy-go/ptr" "github.com/bufbuild/connect-go" + "github.com/compose-spec/compose-go/v2/loader" + compose "github.com/compose-spec/compose-go/v2/types" "google.golang.org/protobuf/proto" ) @@ -116,12 +119,18 @@ func (b *ByocAws) Deploy(ctx context.Context, req *defangv1.DeployRequest) (*def return nil, err } + p, err := loader.LoadWithContext(ctx, compose.ConfigDetails{ConfigFiles: []compose.ConfigFile{{Content: []byte(req.Compose)}}}) + if err != nil { + return nil, err + } + etag := pkg.RandomID() - if len(req.Services) > b.Quota.Services { + if len(p.Services) > b.Quota.Services { return nil, errors.New("maximum number of services reached") } + serviceInfos := []*defangv1.ServiceInfo{} - for _, service := range req.Services { + for _, service := range p.Services { serviceInfo, err := b.update(ctx, service) if err != nil { return nil, err @@ -185,7 +194,7 @@ func (b *ByocAws) Deploy(ctx context.Context, req *defangv1.DeployRequest) (*def for _, si := range serviceInfos { if si.UseAcmeCert { - term.Infof("To activate TLS certificate for %v, run 'defang cert gen'", si.Service.Domainname) + term.Infof("To activate TLS certificate for %v, run 'defang cert gen'", si.Service.Name) } } @@ -504,23 +513,26 @@ func (b *ByocAws) Tail(ctx context.Context, req *defangv1.TailRequest) (client.S } // This function was copied from Fabric controller and slightly modified to work with BYOC -func (b *ByocAws) update(ctx context.Context, service *defangv1.Service) (*defangv1.ServiceInfo, error) { - if err := b.Quota.Validate(service); err != nil { +func (b *ByocAws) update(ctx context.Context, service compose.ServiceConfig) (*defangv1.ServiceInfo, error) { + if err := b.Quota.Validate(&service); err != nil { return nil, err } - // Check to make sure all required secrets are present in the secrets store - missing, err := b.checkForMissingSecrets(ctx, service.Secrets) + // Check to make sure all required configs are present in the configs store + var configs []string + for config, value := range service.Environment { + if value == nil { + configs = append(configs, config) + } + } + err := b.checkForMissingSecrets(ctx, configs) if err != nil { return nil, err } - if missing != nil { - return nil, fmt.Errorf("missing config %q", missing) // retryable CodeFailedPrecondition - } ensure(b.PulumiProject != "", "pulumiProject not set") si := &defangv1.ServiceInfo{ - Service: service, + Service: &defangv1.ServiceID{Name: service.Name}, Project: b.PulumiProject, // was: tenant Etag: pkg.RandomID(), // TODO: could be hash for dedup/idempotency } @@ -528,11 +540,11 @@ func (b *ByocAws) update(ctx context.Context, service *defangv1.Service) (*defan hasHost := false hasIngress := false fqn := service.Name - if service.StaticFiles == nil { + if sf := service.Extensions["x-defang-static-files"]; sf == nil { for _, port := range service.Ports { - hasIngress = hasIngress || port.Mode == defangv1.Mode_INGRESS - hasHost = hasHost || port.Mode == defangv1.Mode_HOST - si.Endpoints = append(si.Endpoints, b.getEndpoint(fqn, port)) + hasIngress = hasIngress || port.Mode == quota.Mode_INGRESS + hasHost = hasHost || port.Mode == quota.Mode_HOST + si.Endpoints = append(si.Endpoints, b.getEndpoint(fqn, &port)) } } else { si.PublicFqdn = b.getPublicFqdn(fqn) @@ -546,14 +558,15 @@ func (b *ByocAws) update(ctx context.Context, service *defangv1.Service) (*defan si.PrivateFqdn = b.getPrivateFqdn(fqn) } - if service.Domainname != "" { - if !hasIngress && service.StaticFiles == nil { + if service.DomainName != "" { + if !hasIngress && service.Extensions["x-defang-static-files"] == nil { return nil, errors.New("domainname requires at least one ingress port") // retryable CodeFailedPrecondition } - // Do a DNS lookup for Domainname and confirm it's indeed a CNAME to the service's public FQDN - cname, _ := net.LookupCNAME(service.Domainname) + // Do a DNS lookup for DomainName and confirm it's indeed a CNAME to the service's public FQDN + cname, _ := net.LookupCNAME(service.DomainName) if strings.TrimSuffix(cname, ".") != si.PublicFqdn { - zoneId, err := b.findZone(ctx, service.Domainname, service.DnsRole) + dnsRole, _ := service.Extensions["x-defang-dns-role"].(string) + zoneId, err := b.findZone(ctx, service.DomainName, dnsRole) if err != nil { return nil, err } @@ -569,29 +582,29 @@ func (b *ByocAws) update(ctx context.Context, service *defangv1.Service) (*defan si.NatIps = b.publicNatIps // TODO: even internal services use NAT now si.Status = "UPDATE_QUEUED" - if si.Service.Build != nil { + if service.Build != nil { si.Status = "BUILD_QUEUED" // in SaaS, this gets overwritten by the ECS events for "kaniko" } return si, nil } // This function was copied from Fabric controller and slightly modified to work with BYOC -func (b *ByocAws) checkForMissingSecrets(ctx context.Context, secrets []*defangv1.Secret) (*defangv1.Secret, error) { +func (b *ByocAws) checkForMissingSecrets(ctx context.Context, secrets []string) error { if len(secrets) == 0 { - return nil, nil // no secrets to check + return nil // no secrets to check } prefix := b.getSecretID("") sorted, err := b.driver.ListSecretsByPrefix(ctx, prefix) if err != nil { - return nil, err + return err } for _, secret := range secrets { - fqn := b.getSecretID(secret.Source) + fqn := b.getSecretID(secret) if !searchSecret(sorted, fqn) { - return secret, nil // secret not found + return fmt.Errorf("missing config %q", secret) } } - return nil, nil // all secrets found + return nil // all secrets found } // This function was copied from Fabric controller @@ -605,8 +618,8 @@ func searchSecret(sorted []qualifiedName, fqn qualifiedName) bool { type qualifiedName = string // legacy // This function was copied from Fabric controller and slightly modified to work with BYOC -func (b *ByocAws) getEndpoint(fqn qualifiedName, port *defangv1.Port) string { - if port.Mode == defangv1.Mode_HOST { +func (b *ByocAws) getEndpoint(fqn qualifiedName, port *compose.ServicePortConfig) string { + if port.Mode == quota.Mode_HOST { privateFqdn := b.getPrivateFqdn(fqn) return fmt.Sprintf("%s:%d", privateFqdn, port.Target) } @@ -675,8 +688,8 @@ func (b *ByocAws) DeleteConfig(ctx context.Context, secrets *defangv1.Secrets) e return nil } -func (b *ByocAws) Restart(ctx context.Context, names ...string) (types.ETag, error) { - return "", client.ErrNotImplemented("not yet implemented for BYOC; please use the AWS ECS dashboard") // FIXME: implement this for BYOC +func (b *ByocAws) Restart(ctx context.Context, names ...string) error { + return client.ErrNotImplemented("not yet implemented for BYOC; please use the AWS ECS dashboard") // FIXME: implement this for BYOC } func (b *ByocAws) BootstrapList(ctx context.Context) ([]string, error) { diff --git a/src/pkg/cli/client/byoc/aws/byoc_test.go b/src/pkg/cli/client/byoc/aws/byoc_test.go index 0b56fa5df..1476b24eb 100644 --- a/src/pkg/cli/client/byoc/aws/byoc_test.go +++ b/src/pkg/cli/client/byoc/aws/byoc_test.go @@ -5,20 +5,20 @@ import ( "testing" "github.com/DefangLabs/defang/src/pkg/cli/client" + "github.com/DefangLabs/defang/src/pkg/quota" "github.com/DefangLabs/defang/src/pkg/types" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" compose "github.com/compose-spec/compose-go/v2/types" ) func TestDomainMultipleProjectSupport(t *testing.T) { - port80 := &defangv1.Port{Mode: defangv1.Mode_INGRESS, Target: 80} - port8080 := &defangv1.Port{Mode: defangv1.Mode_INGRESS, Target: 8080} - hostModePort := &defangv1.Port{Mode: defangv1.Mode_HOST, Target: 80} + port80 := &compose.ServicePortConfig{Mode: quota.Mode_INGRESS, Target: 80} + port8080 := &compose.ServicePortConfig{Mode: quota.Mode_INGRESS, Target: 8080} + hostModePort := &compose.ServicePortConfig{Mode: quota.Mode_HOST, Target: 80} tests := []struct { ProjectName string TenantID types.TenantID Fqn string - Port *defangv1.Port + Port *compose.ServicePortConfig EndPoint string PublicFqdn string PrivateFqdn string diff --git a/src/pkg/cli/client/byoc/do/byoc.go b/src/pkg/cli/client/byoc/do/byoc.go index ad80c7f71..b67bd1d43 100644 --- a/src/pkg/cli/client/byoc/do/byoc.go +++ b/src/pkg/cli/client/byoc/do/byoc.go @@ -128,7 +128,7 @@ func (b *ByocDo) Deploy(ctx context.Context, req *defangv1.DeployRequest) (*defa func (b *ByocDo) BootstrapCommand(ctx context.Context, command string) (string, error) { - return "", nil + return "", client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) BootstrapList(ctx context.Context) ([]string, error) { @@ -151,7 +151,7 @@ func (b *ByocDo) CreateUploadURL(ctx context.Context, req *defangv1.UploadURLReq } func (b *ByocDo) Delete(ctx context.Context, req *defangv1.DeleteRequest) (*defangv1.DeleteResponse, error) { - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) Destroy(ctx context.Context) (string, error) { @@ -159,27 +159,27 @@ func (b *ByocDo) Destroy(ctx context.Context) (string, error) { } func (b *ByocDo) DeleteConfig(ctx context.Context, secrets *defangv1.Secrets) error { - return nil + return client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) GetService(ctx context.Context, s *defangv1.ServiceID) (*defangv1.ServiceInfo, error) { - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) GetServices(ctx context.Context) (*defangv1.ListServicesResponse, error) { - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) ListConfig(ctx context.Context) (*defangv1.Secrets, error) { - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) PutConfig(ctx context.Context, secret *defangv1.SecretValue) error { - return nil + return client.ErrNotImplemented("not implemented for ByocDo") } -func (b *ByocDo) Restart(ctx context.Context, names ...string) (types.ETag, error) { - return "", nil +func (b *ByocDo) Restart(ctx context.Context, names ...string) error { + return client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) ServiceDNS(name string) string { @@ -191,17 +191,16 @@ func (b *ByocDo) Subscribe(ctx context.Context, req *defangv1.SubscribeRequest) } func (b *ByocDo) Tail(ctx context.Context, req *defangv1.TailRequest) (client.ServerStream[defangv1.TailResponse], error) { - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) TearDown(ctx context.Context) error { - return nil + return client.ErrNotImplemented("not implemented for ByocDo") //return b.Driver.TearDown(ctx) } func (b *ByocDo) WhoAmI(ctx context.Context) (*defangv1.WhoAmIResponse, error) { - - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) GetVersion(context.Context) (*defangv1.Version, error) { @@ -210,8 +209,7 @@ func (b *ByocDo) GetVersion(context.Context) (*defangv1.Version, error) { } func (b *ByocDo) Get(ctx context.Context, s *defangv1.ServiceID) (*defangv1.ServiceInfo, error) { - - return nil, nil + return nil, client.ErrNotImplemented("not implemented for ByocDo") } func (b *ByocDo) runCdCommand(ctx context.Context, cmd ...string) (string, error) { @@ -250,7 +248,7 @@ func (b *ByocDo) environment() map[string]string { func (b *ByocDo) update(ctx context.Context, service *defangv1.Service) (*defangv1.ServiceInfo, error) { si := &defangv1.ServiceInfo{ - Service: service, + Service: &defangv1.ServiceID{Name: service.Name}, Project: b.PulumiProject, Etag: pkg.RandomID(), } diff --git a/src/pkg/cli/client/client.go b/src/pkg/cli/client/client.go index fe1192007..6408b23c1 100644 --- a/src/pkg/cli/client/client.go +++ b/src/pkg/cli/client/client.go @@ -49,7 +49,7 @@ type Client interface { GetServices(context.Context) (*defangv1.ListServicesResponse, error) ListConfig(context.Context) (*defangv1.Secrets, error) PutConfig(context.Context, *defangv1.SecretValue) error - Restart(context.Context, ...string) (types.ETag, error) + Restart(context.Context, ...string) error ServiceDNS(name string) string Subscribe(context.Context, *defangv1.SubscribeRequest) (ServerStream[defangv1.SubscribeResponse], error) Tail(context.Context, *defangv1.TailRequest) (ServerStream[defangv1.TailResponse], error) diff --git a/src/pkg/cli/client/playground.go b/src/pkg/cli/client/playground.go index 8291fa96f..0b0586371 100644 --- a/src/pkg/cli/client/playground.go +++ b/src/pkg/cli/client/playground.go @@ -3,7 +3,6 @@ package client import ( "context" "errors" - "fmt" "github.com/DefangLabs/defang/src/pkg/term" "github.com/DefangLabs/defang/src/pkg/types" @@ -94,31 +93,9 @@ func (g *PlaygroundClient) BootstrapList(context.Context) ([]string, error) { return nil, errors.New("this command is not valid for the Defang playground; did you forget --provider?") } -func (g *PlaygroundClient) Restart(ctx context.Context, names ...string) (types.ETag, error) { - // For now, we'll just get the service info and pass it back to Deploy as-is. - resp, err := g.GetServices(ctx) - if err != nil { - return "", err - } - existingServices := make(map[string]*defangv1.Service) - for _, serviceInfo := range resp.Services { - existingServices[serviceInfo.Service.Name] = serviceInfo.Service - } - - servicesToUpdate := make([]*defangv1.Service, 0, len(names)) - for _, name := range names { - service, ok := existingServices[name] - if !ok { - return "", fmt.Errorf("service %s not found", name) - } - servicesToUpdate = append(servicesToUpdate, service) - } - - dr, err := g.Deploy(ctx, &defangv1.DeployRequest{Project: resp.Project, Services: servicesToUpdate}) - if err != nil { - return "", err - } - return dr.Etag, nil +func (g *PlaygroundClient) Restart(ctx context.Context, names ...string) error { + _, err := g.client.Restart(ctx, connect.NewRequest(&defangv1.RestartRequest{Services: names})) + return err } func (g PlaygroundClient) ServiceDNS(name string) string { diff --git a/src/pkg/cli/composeRestart.go b/src/pkg/cli/composeRestart.go index 8a41b2f26..bb907028a 100644 --- a/src/pkg/cli/composeRestart.go +++ b/src/pkg/cli/composeRestart.go @@ -5,13 +5,12 @@ import ( "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/cli/compose" - "github.com/DefangLabs/defang/src/pkg/types" ) -func ComposeRestart(ctx context.Context, client client.Client) (types.ETag, error) { +func ComposeRestart(ctx context.Context, client client.Client) error { project, err := client.LoadProject(ctx) if err != nil { - return "", err + return err } names := make([]string, 0, len(project.Services)) for _, service := range project.Services { diff --git a/src/pkg/cli/getServices.go b/src/pkg/cli/getServices.go index f3fcd188f..6bdebc83f 100644 --- a/src/pkg/cli/getServices.go +++ b/src/pkg/cli/getServices.go @@ -22,7 +22,7 @@ func GetServices(ctx context.Context, client client.Client, long bool) error { if !long { for _, si := range serviceList.Services { - *si = defangv1.ServiceInfo{Service: &defangv1.Service{Name: si.Service.Name}} + *si = defangv1.ServiceInfo{Service: &defangv1.ServiceID{Name: si.Service.Name}} } } diff --git a/src/pkg/cli/restart.go b/src/pkg/cli/restart.go index 9bed8aa24..37db6abbb 100644 --- a/src/pkg/cli/restart.go +++ b/src/pkg/cli/restart.go @@ -5,14 +5,13 @@ import ( "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/term" - "github.com/DefangLabs/defang/src/pkg/types" ) -func Restart(ctx context.Context, client client.Client, names ...string) (types.ETag, error) { +func Restart(ctx context.Context, client client.Client, names ...string) error { term.Debug("Restarting service", names) if DoDryRun { - return "", ErrDryRun + return ErrDryRun } return client.Restart(ctx, names...) diff --git a/src/pkg/quota/quota.go b/src/pkg/quota/quota.go index 9b8bd1186..ddcf2934d 100644 --- a/src/pkg/quota/quota.go +++ b/src/pkg/quota/quota.go @@ -6,9 +6,18 @@ import ( "net/url" "strings" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" + compose "github.com/compose-spec/compose-go/v2/types" ) +const Mode_INGRESS = "ingress" +const Mode_HOST = "host" + +const Protocol_TCP = "tcp" +const Protocol_UDP = "udp" +const Protocol_HTTP = "http" + +const MiB = 1024 * 1024 + type Quotas struct { Cpus float32 Gpus uint32 @@ -18,7 +27,7 @@ type Quotas struct { ShmSizeMiB float32 } -func (q Quotas) Validate(service *defangv1.Service) error { +func (q Quotas) Validate(service *compose.ServiceConfig) error { if service.Name == "" { return errors.New("service name is required") // CodeInvalidArgument } @@ -27,7 +36,7 @@ func (q Quotas) Validate(service *defangv1.Service) error { if service.Build.Context == "" { return errors.New("build.context is required") // CodeInvalidArgument } - if service.Build.ShmSize > q.ShmSizeMiB || service.Build.ShmSize < 0 { + if float32(service.Build.ShmSize)/MiB > q.ShmSizeMiB || service.Build.ShmSize < 0 { return fmt.Errorf("build.shm_size exceeds quota (max %v MiB)", q.ShmSizeMiB) // CodeInvalidArgument } } else { @@ -43,8 +52,8 @@ func (q Quotas) Validate(service *defangv1.Service) error { if port.Target < 1 || port.Target > 32767 { return fmt.Errorf("port %d is out of range", port.Target) // CodeInvalidArgument } - if port.Mode == defangv1.Mode_INGRESS { - if port.Protocol == defangv1.Protocol_TCP || port.Protocol == defangv1.Protocol_UDP { + if port.Mode == Mode_INGRESS { + if port.Protocol == Protocol_TCP || port.Protocol == Protocol_UDP { return fmt.Errorf("mode:INGRESS is not supported by protocol:%s", port.Protocol) // CodeInvalidArgument } } @@ -52,26 +61,26 @@ func (q Quotas) Validate(service *defangv1.Service) error { return fmt.Errorf("duplicate port %d", port.Target) // CodeInvalidArgument } // hasHost = hasHost || port.Mode == v1.Mode_HOST - hasIngress = hasIngress || port.Mode == defangv1.Mode_INGRESS + hasIngress = hasIngress || port.Mode == Mode_INGRESS uniquePorts[port.Target] = true } - if service.Healthcheck != nil && len(service.Healthcheck.Test) > 0 { + if service.HealthCheck != nil && len(service.HealthCheck.Test) > 0 { // Technically this should test for <= but both interval and timeout have 30s as the default value in compose spec - if service.Healthcheck.Interval > 0 && service.Healthcheck.Interval < service.Healthcheck.Timeout { + if service.HealthCheck.Interval != nil && *service.HealthCheck.Interval > 0 && *service.HealthCheck.Interval < *service.HealthCheck.Timeout { return errors.New("invalid healthcheck: timeout must be less than the interval") } - switch service.Healthcheck.Test[0] { + switch service.HealthCheck.Test[0] { case "CMD": if hasIngress { // For ingress ports, we derive the target group healthcheck path/port from the service healthcheck - if len(service.Healthcheck.Test) < 3 { + if len(service.HealthCheck.Test) < 3 { return errors.New("invalid CMD healthcheck: expected a command and URL") } - if !strings.HasSuffix(service.Healthcheck.Test[1], "curl") && !strings.HasSuffix(service.Healthcheck.Test[1], "wget") { + if !strings.HasSuffix(service.HealthCheck.Test[1], "curl") && !strings.HasSuffix(service.HealthCheck.Test[1], "wget") { return errors.New("invalid CMD healthcheck: expected curl or wget") } hasHttpUrl := false - for _, arg := range service.Healthcheck.Test[2:] { + for _, arg := range service.HealthCheck.Test[2:] { if u, err := url.Parse(arg); err == nil && u.Scheme == "http" { hasHttpUrl = true break @@ -82,7 +91,7 @@ func (q Quotas) Validate(service *defangv1.Service) error { } } case "NONE": - if len(service.Healthcheck.Test) != 1 { + if len(service.HealthCheck.Test) != 1 { return errors.New("invalid NONE healthcheck; expected no arguments") } fallthrough // OK iff there are no ingress ports @@ -91,19 +100,19 @@ func (q Quotas) Validate(service *defangv1.Service) error { return fmt.Errorf("ingress port requires a CMD healthcheck") } default: - return fmt.Errorf("unsupported healthcheck: %v", service.Healthcheck.Test) + return fmt.Errorf("unsupported healthcheck: %v", service.HealthCheck.Test) } } if service.Deploy != nil { - if service.Deploy.Replicas > q.Replicas { + if uint32(getOrZero(service.Deploy.Replicas)) > q.Replicas { return fmt.Errorf("replicas exceeds quota (max %d)", q.Replicas) // CodeInvalidArgument } - if service.Deploy.Resources != nil && service.Deploy.Resources.Reservations != nil { - if service.Deploy.Resources.Reservations.Cpus > q.Cpus || service.Deploy.Resources.Reservations.Cpus < 0 { + if service.Deploy.Resources.Reservations != nil { + if float32(service.Deploy.Resources.Reservations.NanoCPUs) > q.Cpus || service.Deploy.Resources.Reservations.NanoCPUs < 0 { return fmt.Errorf("cpus exceeds quota (max %v vCPU)", q.Cpus) // CodeInvalidArgument } - if service.Deploy.Resources.Reservations.Memory > q.MemoryMiB || service.Deploy.Resources.Reservations.Memory < 0 { + if float32(service.Deploy.Resources.Reservations.MemoryBytes)/MiB > q.MemoryMiB || service.Deploy.Resources.Reservations.MemoryBytes < 0 { return fmt.Errorf("memory exceeds quota (max %v MiB)", q.MemoryMiB) // CodeInvalidArgument } for _, device := range service.Deploy.Resources.Reservations.Devices { @@ -113,7 +122,7 @@ func (q Quotas) Validate(service *defangv1.Service) error { if device.Driver != "" && device.Driver != "nvidia" { return errors.New("only nvidia GPU devices are supported") // CodeInvalidArgument } - if q.Gpus == 0 || device.Count > q.Gpus { + if q.Gpus == 0 || uint32(device.Count) > q.Gpus { return fmt.Errorf("gpu count exceeds quota (max %d)", q.Gpus) // CodeInvalidArgument } } @@ -122,3 +131,11 @@ func (q Quotas) Validate(service *defangv1.Service) error { return nil } + +func getOrZero[T any](v *T) T { + if v == nil { + var zero T + return zero + } + return *v +} diff --git a/src/pkg/quota/quota_test.go b/src/pkg/quota/quota_test.go index 1a094ca2a..f75e56c9e 100644 --- a/src/pkg/quota/quota_test.go +++ b/src/pkg/quota/quota_test.go @@ -3,75 +3,76 @@ package quota import ( "testing" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" + "github.com/aws/smithy-go/ptr" + compose "github.com/compose-spec/compose-go/v2/types" ) func TestValidate(t *testing.T) { tests := []struct { name string - service *defangv1.Service + service *compose.ServiceConfig wantErr string }{ { name: "empty service", - service: &defangv1.Service{}, + service: &compose.ServiceConfig{}, wantErr: "service name is required", }, { name: "no image, no build", - service: &defangv1.Service{Name: "test"}, + service: &compose.ServiceConfig{Name: "test"}, wantErr: "missing image or build", }, { name: "empty build", - service: &defangv1.Service{Name: "test", Build: &defangv1.Build{}}, + service: &compose.ServiceConfig{Name: "test", Build: &compose.BuildConfig{}}, wantErr: "build.context is required", }, { name: "shm size exceeds quota", - service: &defangv1.Service{Name: "test", Build: &defangv1.Build{Context: ".", ShmSize: 30721}}, + service: &compose.ServiceConfig{Name: "test", Build: &compose.BuildConfig{Context: ".", ShmSize: 30721 * MiB}}, wantErr: "build.shm_size exceeds quota (max 30720 MiB)", }, { name: "port 0 out of range", - service: &defangv1.Service{Name: "test", Image: "asdf", Ports: []*defangv1.Port{{Target: 0}}}, + service: &compose.ServiceConfig{Name: "test", Image: "asdf", Ports: []compose.ServicePortConfig{{Target: 0}}}, wantErr: "port 0 is out of range", }, { name: "port out of range", - service: &defangv1.Service{Name: "test", Image: "asdf", Ports: []*defangv1.Port{{Target: 33333}}}, + service: &compose.ServiceConfig{Name: "test", Image: "asdf", Ports: []compose.ServicePortConfig{{Target: 33333}}}, wantErr: "port 33333 is out of range", }, { name: "ingress with UDP", - service: &defangv1.Service{Name: "test", Image: "asdf", Ports: []*defangv1.Port{{Target: 53, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_UDP}}}, - wantErr: "mode:INGRESS is not supported by protocol:UDP", + service: &compose.ServiceConfig{Name: "test", Image: "asdf", Ports: []compose.ServicePortConfig{{Target: 53, Mode: Mode_INGRESS, Protocol: Protocol_UDP}}}, + wantErr: "mode:INGRESS is not supported by protocol:udp", }, { name: "ingress with UDP", - service: &defangv1.Service{Name: "test", Image: "asdf", Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_TCP}}}, - wantErr: "mode:INGRESS is not supported by protocol:TCP", + service: &compose.ServiceConfig{Name: "test", Image: "asdf", Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_TCP}}}, + wantErr: "mode:INGRESS is not supported by protocol:tcp", }, { name: "invalid healthcheck interval", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Healthcheck: &defangv1.HealthCheck{ + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD-SHELL", "echo 1"}, - Interval: 1, - Timeout: 2, + Interval: duration(1), + Timeout: duration(2), }, }, wantErr: "invalid healthcheck: timeout must be less than the interval", }, { name: "invalid CMD healthcheck", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD", "echo 1"}, }, }, @@ -79,11 +80,11 @@ func TestValidate(t *testing.T) { }, { name: "CMD without curl or wget", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD", "echo", "1"}, }, }, @@ -91,11 +92,11 @@ func TestValidate(t *testing.T) { }, { name: "CMD without HTTP URL", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD", "curl", "1"}, }, }, @@ -103,10 +104,10 @@ func TestValidate(t *testing.T) { }, { name: "NONE with arguments", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Healthcheck: &defangv1.HealthCheck{ + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"NONE", "echo", "1"}, }, }, @@ -114,11 +115,11 @@ func TestValidate(t *testing.T) { }, { name: "CMD-SHELL with ingress", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD-SHELL", "echo 1"}, }, }, @@ -126,11 +127,11 @@ func TestValidate(t *testing.T) { }, { name: "NONE with ingress", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"NONE"}, }, }, @@ -138,10 +139,10 @@ func TestValidate(t *testing.T) { }, { name: "unsupported healthcheck test", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Healthcheck: &defangv1.HealthCheck{ + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"BLAH"}, }, }, @@ -149,24 +150,24 @@ func TestValidate(t *testing.T) { }, { name: "too many replicas", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Replicas: 100, + Deploy: &compose.DeployConfig{ + Replicas: ptr.Int(100), }, }, wantErr: "replicas exceeds quota (max 16)", }, { name: "too many CPUs", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Cpus: 100, + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + NanoCPUs: 100, }, }, }, @@ -175,13 +176,13 @@ func TestValidate(t *testing.T) { }, { name: "negative cpus", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Cpus: -1, + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + NanoCPUs: -1, }, }, }, @@ -190,13 +191,13 @@ func TestValidate(t *testing.T) { }, { name: "too much memory", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Memory: 200000, + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + MemoryBytes: MiB * 200000, }, }, }, @@ -205,13 +206,13 @@ func TestValidate(t *testing.T) { }, { name: "negative memory", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Memory: -1, + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + MemoryBytes: MiB * -1, }, }, }, @@ -220,13 +221,13 @@ func TestValidate(t *testing.T) { }, { name: "only GPU", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Devices: []*defangv1.Device{ + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + Devices: []compose.DeviceRequest{ {Capabilities: []string{"tpu"}}, }, }, @@ -237,13 +238,13 @@ func TestValidate(t *testing.T) { }, { name: "only nvidia GPU", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Devices: []*defangv1.Device{ + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + Devices: []compose.DeviceRequest{ {Capabilities: []string{"gpu"}, Driver: "amd"}, }, }, @@ -254,13 +255,13 @@ func TestValidate(t *testing.T) { }, { name: "too many GPUs", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Devices: []*defangv1.Device{ + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + Devices: []compose.DeviceRequest{ {Capabilities: []string{"gpu"}, Driver: "nvidia", Count: 100}, }, }, @@ -271,19 +272,19 @@ func TestValidate(t *testing.T) { }, { name: "valid service", - service: &defangv1.Service{ + service: &compose.ServiceConfig{ Name: "test", Image: "asdf", - Ports: []*defangv1.Port{{Target: 80, Mode: defangv1.Mode_INGRESS, Protocol: defangv1.Protocol_HTTP}}, - Healthcheck: &defangv1.HealthCheck{ + Ports: []compose.ServicePortConfig{{Target: 80, Mode: Mode_INGRESS, Protocol: Protocol_HTTP}}, + HealthCheck: &compose.HealthCheckConfig{ Test: []string{"CMD", "curl", "http://localhost"}, }, - Deploy: &defangv1.Deploy{ - Resources: &defangv1.Resources{ - Reservations: &defangv1.Resource{ - Cpus: 1, - Memory: 1024, - Devices: []*defangv1.Device{ + Deploy: &compose.DeployConfig{ + Resources: compose.Resources{ + Reservations: &compose.Resource{ + NanoCPUs: 1, + MemoryBytes: MiB * 1024, + Devices: []compose.DeviceRequest{ { Capabilities: []string{"gpu"}, Driver: "nvidia", @@ -316,3 +317,7 @@ func TestValidate(t *testing.T) { }) } } + +func duration(d compose.Duration) *compose.Duration { + return &d +} diff --git a/src/protos/io/defang/v1/defangv1connect/fabric.connect.go b/src/protos/io/defang/v1/defangv1connect/fabric.connect.go index 26b2a4ce6..effb20859 100644 --- a/src/protos/io/defang/v1/defangv1connect/fabric.connect.go +++ b/src/protos/io/defang/v1/defangv1connect/fabric.connect.go @@ -66,6 +66,9 @@ const ( // FabricControllerGetServicesProcedure is the fully-qualified name of the FabricController's // GetServices RPC. FabricControllerGetServicesProcedure = "/io.defang.v1.FabricController/GetServices" + // FabricControllerRestartProcedure is the fully-qualified name of the FabricController's Restart + // RPC. + FabricControllerRestartProcedure = "/io.defang.v1.FabricController/Restart" // FabricControllerGenerateFilesProcedure is the fully-qualified name of the FabricController's // GenerateFiles RPC. FabricControllerGenerateFilesProcedure = "/io.defang.v1.FabricController/GenerateFiles" @@ -115,14 +118,17 @@ type FabricControllerClient interface { Token(context.Context, *connect_go.Request[v1.TokenRequest]) (*connect_go.Response[v1.TokenResponse], error) RevokeToken(context.Context, *connect_go.Request[emptypb.Empty]) (*connect_go.Response[emptypb.Empty], error) Tail(context.Context, *connect_go.Request[v1.TailRequest]) (*connect_go.ServerStreamForClient[v1.TailResponse], error) + // Deprecated: do not use. Update(context.Context, *connect_go.Request[v1.Service]) (*connect_go.Response[v1.ServiceInfo], error) Deploy(context.Context, *connect_go.Request[v1.DeployRequest]) (*connect_go.Response[v1.DeployResponse], error) Get(context.Context, *connect_go.Request[v1.ServiceID]) (*connect_go.Response[v1.ServiceInfo], error) + // Deprecated: do not use. Delete(context.Context, *connect_go.Request[v1.DeleteRequest]) (*connect_go.Response[v1.DeleteResponse], error) Publish(context.Context, *connect_go.Request[v1.PublishRequest]) (*connect_go.Response[emptypb.Empty], error) Subscribe(context.Context, *connect_go.Request[v1.SubscribeRequest]) (*connect_go.ServerStreamForClient[v1.SubscribeResponse], error) // rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); GetServices(context.Context, *connect_go.Request[emptypb.Empty]) (*connect_go.Response[v1.ListServicesResponse], error) + Restart(context.Context, *connect_go.Request[v1.RestartRequest]) (*connect_go.Response[emptypb.Empty], error) GenerateFiles(context.Context, *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) StartGenerate(context.Context, *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.StartGenerateResponse], error) GenerateStatus(context.Context, *connect_go.Request[v1.GenerateStatusRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) @@ -213,6 +219,11 @@ func NewFabricControllerClient(httpClient connect_go.HTTPClient, baseURL string, connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), connect_go.WithClientOptions(opts...), ), + restart: connect_go.NewClient[v1.RestartRequest, emptypb.Empty]( + httpClient, + baseURL+FabricControllerRestartProcedure, + opts..., + ), generateFiles: connect_go.NewClient[v1.GenerateFilesRequest, v1.GenerateFilesResponse]( httpClient, baseURL+FabricControllerGenerateFilesProcedure, @@ -305,6 +316,7 @@ type fabricControllerClient struct { publish *connect_go.Client[v1.PublishRequest, emptypb.Empty] subscribe *connect_go.Client[v1.SubscribeRequest, v1.SubscribeResponse] getServices *connect_go.Client[emptypb.Empty, v1.ListServicesResponse] + restart *connect_go.Client[v1.RestartRequest, emptypb.Empty] generateFiles *connect_go.Client[v1.GenerateFilesRequest, v1.GenerateFilesResponse] startGenerate *connect_go.Client[v1.GenerateFilesRequest, v1.StartGenerateResponse] generateStatus *connect_go.Client[v1.GenerateStatusRequest, v1.GenerateFilesResponse] @@ -347,6 +359,8 @@ func (c *fabricControllerClient) Tail(ctx context.Context, req *connect_go.Reque } // Update calls io.defang.v1.FabricController.Update. +// +// Deprecated: do not use. func (c *fabricControllerClient) Update(ctx context.Context, req *connect_go.Request[v1.Service]) (*connect_go.Response[v1.ServiceInfo], error) { return c.update.CallUnary(ctx, req) } @@ -362,6 +376,8 @@ func (c *fabricControllerClient) Get(ctx context.Context, req *connect_go.Reques } // Delete calls io.defang.v1.FabricController.Delete. +// +// Deprecated: do not use. func (c *fabricControllerClient) Delete(ctx context.Context, req *connect_go.Request[v1.DeleteRequest]) (*connect_go.Response[v1.DeleteResponse], error) { return c.delete.CallUnary(ctx, req) } @@ -381,6 +397,11 @@ func (c *fabricControllerClient) GetServices(ctx context.Context, req *connect_g return c.getServices.CallUnary(ctx, req) } +// Restart calls io.defang.v1.FabricController.Restart. +func (c *fabricControllerClient) Restart(ctx context.Context, req *connect_go.Request[v1.RestartRequest]) (*connect_go.Response[emptypb.Empty], error) { + return c.restart.CallUnary(ctx, req) +} + // GenerateFiles calls io.defang.v1.FabricController.GenerateFiles. func (c *fabricControllerClient) GenerateFiles(ctx context.Context, req *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) { return c.generateFiles.CallUnary(ctx, req) @@ -458,14 +479,17 @@ type FabricControllerHandler interface { Token(context.Context, *connect_go.Request[v1.TokenRequest]) (*connect_go.Response[v1.TokenResponse], error) RevokeToken(context.Context, *connect_go.Request[emptypb.Empty]) (*connect_go.Response[emptypb.Empty], error) Tail(context.Context, *connect_go.Request[v1.TailRequest], *connect_go.ServerStream[v1.TailResponse]) error + // Deprecated: do not use. Update(context.Context, *connect_go.Request[v1.Service]) (*connect_go.Response[v1.ServiceInfo], error) Deploy(context.Context, *connect_go.Request[v1.DeployRequest]) (*connect_go.Response[v1.DeployResponse], error) Get(context.Context, *connect_go.Request[v1.ServiceID]) (*connect_go.Response[v1.ServiceInfo], error) + // Deprecated: do not use. Delete(context.Context, *connect_go.Request[v1.DeleteRequest]) (*connect_go.Response[v1.DeleteResponse], error) Publish(context.Context, *connect_go.Request[v1.PublishRequest]) (*connect_go.Response[emptypb.Empty], error) Subscribe(context.Context, *connect_go.Request[v1.SubscribeRequest], *connect_go.ServerStream[v1.SubscribeResponse]) error // rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); GetServices(context.Context, *connect_go.Request[emptypb.Empty]) (*connect_go.Response[v1.ListServicesResponse], error) + Restart(context.Context, *connect_go.Request[v1.RestartRequest]) (*connect_go.Response[emptypb.Empty], error) GenerateFiles(context.Context, *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) StartGenerate(context.Context, *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.StartGenerateResponse], error) GenerateStatus(context.Context, *connect_go.Request[v1.GenerateStatusRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) @@ -552,6 +576,11 @@ func NewFabricControllerHandler(svc FabricControllerHandler, opts ...connect_go. connect_go.WithIdempotency(connect_go.IdempotencyNoSideEffects), connect_go.WithHandlerOptions(opts...), ) + fabricControllerRestartHandler := connect_go.NewUnaryHandler( + FabricControllerRestartProcedure, + svc.Restart, + opts..., + ) fabricControllerGenerateFilesHandler := connect_go.NewUnaryHandler( FabricControllerGenerateFilesProcedure, svc.GenerateFiles, @@ -653,6 +682,8 @@ func NewFabricControllerHandler(svc FabricControllerHandler, opts ...connect_go. fabricControllerSubscribeHandler.ServeHTTP(w, r) case FabricControllerGetServicesProcedure: fabricControllerGetServicesHandler.ServeHTTP(w, r) + case FabricControllerRestartProcedure: + fabricControllerRestartHandler.ServeHTTP(w, r) case FabricControllerGenerateFilesProcedure: fabricControllerGenerateFilesHandler.ServeHTTP(w, r) case FabricControllerStartGenerateProcedure: @@ -738,6 +769,10 @@ func (UnimplementedFabricControllerHandler) GetServices(context.Context, *connec return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("io.defang.v1.FabricController.GetServices is not implemented")) } +func (UnimplementedFabricControllerHandler) Restart(context.Context, *connect_go.Request[v1.RestartRequest]) (*connect_go.Response[emptypb.Empty], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("io.defang.v1.FabricController.Restart is not implemented")) +} + func (UnimplementedFabricControllerHandler) GenerateFiles(context.Context, *connect_go.Request[v1.GenerateFilesRequest]) (*connect_go.Response[v1.GenerateFilesResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("io.defang.v1.FabricController.GenerateFiles is not implemented")) } diff --git a/src/protos/io/defang/v1/fabric.pb.go b/src/protos/io/defang/v1/fabric.pb.go index f94e81709..3df030473 100644 --- a/src/protos/io/defang/v1/fabric.pb.go +++ b/src/protos/io/defang/v1/fabric.pb.go @@ -226,6 +226,61 @@ func (Network) EnumDescriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{3} } +type RestartRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Services []string `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` + Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` // defaults to tenant ID +} + +func (x *RestartRequest) Reset() { + *x = RestartRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_io_defang_v1_fabric_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestartRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestartRequest) ProtoMessage() {} + +func (x *RestartRequest) ProtoReflect() protoreflect.Message { + mi := &file_io_defang_v1_fabric_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestartRequest.ProtoReflect.Descriptor instead. +func (*RestartRequest) Descriptor() ([]byte, []int) { + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{0} +} + +func (x *RestartRequest) GetServices() []string { + if x != nil { + return x.Services + } + return nil +} + +func (x *RestartRequest) GetProject() string { + if x != nil { + return x.Project + } + return "" +} + type TrackRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -241,7 +296,7 @@ type TrackRequest struct { func (x *TrackRequest) Reset() { *x = TrackRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[0] + mi := &file_io_defang_v1_fabric_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -254,7 +309,7 @@ func (x *TrackRequest) String() string { func (*TrackRequest) ProtoMessage() {} func (x *TrackRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[0] + mi := &file_io_defang_v1_fabric_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -267,7 +322,7 @@ func (x *TrackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrackRequest.ProtoReflect.Descriptor instead. func (*TrackRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{0} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{1} } func (x *TrackRequest) GetAnonId() string { @@ -310,14 +365,16 @@ type DeployRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` + // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. + Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // deprecated; use compose Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + Compose string `protobuf:"bytes,3,opt,name=compose,proto3" json:"compose,omitempty"` } func (x *DeployRequest) Reset() { *x = DeployRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[1] + mi := &file_io_defang_v1_fabric_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -330,7 +387,7 @@ func (x *DeployRequest) String() string { func (*DeployRequest) ProtoMessage() {} func (x *DeployRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[1] + mi := &file_io_defang_v1_fabric_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -343,9 +400,10 @@ func (x *DeployRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeployRequest.ProtoReflect.Descriptor instead. func (*DeployRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{1} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{2} } +// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. func (x *DeployRequest) GetServices() []*Service { if x != nil { return x.Services @@ -360,6 +418,13 @@ func (x *DeployRequest) GetProject() string { return "" } +func (x *DeployRequest) GetCompose() string { + if x != nil { + return x.Compose + } + return "" +} + type DeployResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -372,7 +437,7 @@ type DeployResponse struct { func (x *DeployResponse) Reset() { *x = DeployResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[2] + mi := &file_io_defang_v1_fabric_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -385,7 +450,7 @@ func (x *DeployResponse) String() string { func (*DeployResponse) ProtoMessage() {} func (x *DeployResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[2] + mi := &file_io_defang_v1_fabric_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -398,7 +463,7 @@ func (x *DeployResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeployResponse.ProtoReflect.Descriptor instead. func (*DeployResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{2} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{3} } func (x *DeployResponse) GetServices() []*ServiceInfo { @@ -426,7 +491,7 @@ type DeleteRequest struct { func (x *DeleteRequest) Reset() { *x = DeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[3] + mi := &file_io_defang_v1_fabric_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -439,7 +504,7 @@ func (x *DeleteRequest) String() string { func (*DeleteRequest) ProtoMessage() {} func (x *DeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[3] + mi := &file_io_defang_v1_fabric_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -452,7 +517,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead. func (*DeleteRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{3} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{4} } func (x *DeleteRequest) GetNames() []string { @@ -473,7 +538,7 @@ type DeleteResponse struct { func (x *DeleteResponse) Reset() { *x = DeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[4] + mi := &file_io_defang_v1_fabric_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -486,7 +551,7 @@ func (x *DeleteResponse) String() string { func (*DeleteResponse) ProtoMessage() {} func (x *DeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[4] + mi := &file_io_defang_v1_fabric_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -499,7 +564,7 @@ func (x *DeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteResponse.ProtoReflect.Descriptor instead. func (*DeleteResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{4} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{5} } func (x *DeleteResponse) GetEtag() string { @@ -522,7 +587,7 @@ type GenerateFilesRequest struct { func (x *GenerateFilesRequest) Reset() { *x = GenerateFilesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[5] + mi := &file_io_defang_v1_fabric_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -535,7 +600,7 @@ func (x *GenerateFilesRequest) String() string { func (*GenerateFilesRequest) ProtoMessage() {} func (x *GenerateFilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[5] + mi := &file_io_defang_v1_fabric_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -548,7 +613,7 @@ func (x *GenerateFilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateFilesRequest.ProtoReflect.Descriptor instead. func (*GenerateFilesRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{5} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{6} } func (x *GenerateFilesRequest) GetPrompt() string { @@ -584,7 +649,7 @@ type File struct { func (x *File) Reset() { *x = File{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[6] + mi := &file_io_defang_v1_fabric_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -597,7 +662,7 @@ func (x *File) String() string { func (*File) ProtoMessage() {} func (x *File) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[6] + mi := &file_io_defang_v1_fabric_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -610,7 +675,7 @@ func (x *File) ProtoReflect() protoreflect.Message { // Deprecated: Use File.ProtoReflect.Descriptor instead. func (*File) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{6} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{7} } func (x *File) GetName() string { @@ -638,7 +703,7 @@ type GenerateFilesResponse struct { func (x *GenerateFilesResponse) Reset() { *x = GenerateFilesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[7] + mi := &file_io_defang_v1_fabric_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -651,7 +716,7 @@ func (x *GenerateFilesResponse) String() string { func (*GenerateFilesResponse) ProtoMessage() {} func (x *GenerateFilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[7] + mi := &file_io_defang_v1_fabric_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -664,7 +729,7 @@ func (x *GenerateFilesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateFilesResponse.ProtoReflect.Descriptor instead. func (*GenerateFilesResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{7} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{8} } func (x *GenerateFilesResponse) GetFiles() []*File { @@ -685,7 +750,7 @@ type StartGenerateResponse struct { func (x *StartGenerateResponse) Reset() { *x = StartGenerateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[8] + mi := &file_io_defang_v1_fabric_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -698,7 +763,7 @@ func (x *StartGenerateResponse) String() string { func (*StartGenerateResponse) ProtoMessage() {} func (x *StartGenerateResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[8] + mi := &file_io_defang_v1_fabric_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -711,7 +776,7 @@ func (x *StartGenerateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartGenerateResponse.ProtoReflect.Descriptor instead. func (*StartGenerateResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{8} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{9} } func (x *StartGenerateResponse) GetUuid() string { @@ -732,7 +797,7 @@ type GenerateStatusRequest struct { func (x *GenerateStatusRequest) Reset() { *x = GenerateStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[9] + mi := &file_io_defang_v1_fabric_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -745,7 +810,7 @@ func (x *GenerateStatusRequest) String() string { func (*GenerateStatusRequest) ProtoMessage() {} func (x *GenerateStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[9] + mi := &file_io_defang_v1_fabric_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -758,7 +823,7 @@ func (x *GenerateStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateStatusRequest.ProtoReflect.Descriptor instead. func (*GenerateStatusRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{9} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{10} } func (x *GenerateStatusRequest) GetUuid() string { @@ -779,7 +844,7 @@ type UploadURLRequest struct { func (x *UploadURLRequest) Reset() { *x = UploadURLRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[10] + mi := &file_io_defang_v1_fabric_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -792,7 +857,7 @@ func (x *UploadURLRequest) String() string { func (*UploadURLRequest) ProtoMessage() {} func (x *UploadURLRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[10] + mi := &file_io_defang_v1_fabric_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -805,7 +870,7 @@ func (x *UploadURLRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadURLRequest.ProtoReflect.Descriptor instead. func (*UploadURLRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{10} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{11} } func (x *UploadURLRequest) GetDigest() string { @@ -826,7 +891,7 @@ type UploadURLResponse struct { func (x *UploadURLResponse) Reset() { *x = UploadURLResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[11] + mi := &file_io_defang_v1_fabric_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -839,7 +904,7 @@ func (x *UploadURLResponse) String() string { func (*UploadURLResponse) ProtoMessage() {} func (x *UploadURLResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[11] + mi := &file_io_defang_v1_fabric_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -852,7 +917,7 @@ func (x *UploadURLResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadURLResponse.ProtoReflect.Descriptor instead. func (*UploadURLResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{11} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{12} } func (x *UploadURLResponse) GetUrl() string { @@ -867,25 +932,26 @@ type ServiceInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + Service *ServiceID `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` Endpoints []string `protobuf:"bytes,2,rep,name=endpoints,proto3" json:"endpoints,omitempty"` // list of endpoints, one for each port Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"` // was: tenant; defaults to tenant ID Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` NatIps []string `protobuf:"bytes,6,rep,name=nat_ips,json=natIps,proto3" json:"nat_ips,omitempty"` // comma-separated list of NAT IPs - LbIps []string `protobuf:"bytes,7,rep,name=lb_ips,json=lbIps,proto3" json:"lb_ips,omitempty"` // comma-separated list of internal CIDR for the load-balancer + LbIps []string `protobuf:"bytes,7,rep,name=lb_ips,json=lbIps,proto3" json:"lb_ips,omitempty"` // comma-separated list of internal CIDRs for the load-balancer PrivateFqdn string `protobuf:"bytes,8,opt,name=private_fqdn,json=privateFqdn,proto3" json:"private_fqdn,omitempty"` // fully qualified domain name (host) PublicFqdn string `protobuf:"bytes,9,opt,name=public_fqdn,json=publicFqdn,proto3" json:"public_fqdn,omitempty"` // fully qualified domain name (ingress) CreatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` ZoneId string `protobuf:"bytes,12,opt,name=zone_id,json=zoneId,proto3" json:"zone_id,omitempty"` // zone ID for byod domain UseAcmeCert bool `protobuf:"varint,13,opt,name=use_acme_cert,json=useAcmeCert,proto3" json:"use_acme_cert,omitempty"` // If we should setup the facilities to use ACME(let's encrypt) certs + Domainname string `protobuf:"bytes,15,opt,name=domainname,proto3" json:"domainname,omitempty"` // domain name for the service } func (x *ServiceInfo) Reset() { *x = ServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[12] + mi := &file_io_defang_v1_fabric_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -898,7 +964,7 @@ func (x *ServiceInfo) String() string { func (*ServiceInfo) ProtoMessage() {} func (x *ServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[12] + mi := &file_io_defang_v1_fabric_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -911,10 +977,10 @@ func (x *ServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInfo.ProtoReflect.Descriptor instead. func (*ServiceInfo) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{12} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{13} } -func (x *ServiceInfo) GetService() *Service { +func (x *ServiceInfo) GetService() *ServiceID { if x != nil { return x.Service } @@ -1005,6 +1071,13 @@ func (x *ServiceInfo) GetUseAcmeCert() bool { return false } +func (x *ServiceInfo) GetDomainname() string { + if x != nil { + return x.Domainname + } + return "" +} + type Secrets struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1017,7 +1090,7 @@ type Secrets struct { func (x *Secrets) Reset() { *x = Secrets{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[13] + mi := &file_io_defang_v1_fabric_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1030,7 +1103,7 @@ func (x *Secrets) String() string { func (*Secrets) ProtoMessage() {} func (x *Secrets) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[13] + mi := &file_io_defang_v1_fabric_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1043,7 +1116,7 @@ func (x *Secrets) ProtoReflect() protoreflect.Message { // Deprecated: Use Secrets.ProtoReflect.Descriptor instead. func (*Secrets) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{13} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{14} } func (x *Secrets) GetNames() []string { @@ -1073,7 +1146,7 @@ type SecretValue struct { func (x *SecretValue) Reset() { *x = SecretValue{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[14] + mi := &file_io_defang_v1_fabric_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1086,7 +1159,7 @@ func (x *SecretValue) String() string { func (*SecretValue) ProtoMessage() {} func (x *SecretValue) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[14] + mi := &file_io_defang_v1_fabric_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1099,7 +1172,7 @@ func (x *SecretValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SecretValue.ProtoReflect.Descriptor instead. func (*SecretValue) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{14} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{15} } func (x *SecretValue) GetName() string { @@ -1139,7 +1212,7 @@ type TokenRequest struct { func (x *TokenRequest) Reset() { *x = TokenRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[15] + mi := &file_io_defang_v1_fabric_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1152,7 +1225,7 @@ func (x *TokenRequest) String() string { func (*TokenRequest) ProtoMessage() {} func (x *TokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[15] + mi := &file_io_defang_v1_fabric_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1165,7 +1238,7 @@ func (x *TokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TokenRequest.ProtoReflect.Descriptor instead. func (*TokenRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{15} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{16} } func (x *TokenRequest) GetTenant() string { @@ -1221,7 +1294,7 @@ type TokenResponse struct { func (x *TokenResponse) Reset() { *x = TokenResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[16] + mi := &file_io_defang_v1_fabric_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1234,7 +1307,7 @@ func (x *TokenResponse) String() string { func (*TokenResponse) ProtoMessage() {} func (x *TokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[16] + mi := &file_io_defang_v1_fabric_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1247,7 +1320,7 @@ func (x *TokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TokenResponse.ProtoReflect.Descriptor instead. func (*TokenResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{16} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{17} } func (x *TokenResponse) GetAccessToken() string { @@ -1268,7 +1341,7 @@ type Status struct { func (x *Status) Reset() { *x = Status{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[17] + mi := &file_io_defang_v1_fabric_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1281,7 +1354,7 @@ func (x *Status) String() string { func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[17] + mi := &file_io_defang_v1_fabric_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1294,7 +1367,7 @@ func (x *Status) ProtoReflect() protoreflect.Message { // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{17} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{18} } func (x *Status) GetVersion() string { @@ -1317,7 +1390,7 @@ type Version struct { func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[18] + mi := &file_io_defang_v1_fabric_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1330,7 +1403,7 @@ func (x *Version) String() string { func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[18] + mi := &file_io_defang_v1_fabric_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1343,7 +1416,7 @@ func (x *Version) ProtoReflect() protoreflect.Message { // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{18} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{19} } func (x *Version) GetFabric() string { @@ -1380,7 +1453,7 @@ type TailRequest struct { func (x *TailRequest) Reset() { *x = TailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[19] + mi := &file_io_defang_v1_fabric_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1393,7 +1466,7 @@ func (x *TailRequest) String() string { func (*TailRequest) ProtoMessage() {} func (x *TailRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[19] + mi := &file_io_defang_v1_fabric_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1406,7 +1479,7 @@ func (x *TailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TailRequest.ProtoReflect.Descriptor instead. func (*TailRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{19} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{20} } func (x *TailRequest) GetServices() []string { @@ -1446,7 +1519,7 @@ type LogEntry struct { func (x *LogEntry) Reset() { *x = LogEntry{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[20] + mi := &file_io_defang_v1_fabric_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1459,7 +1532,7 @@ func (x *LogEntry) String() string { func (*LogEntry) ProtoMessage() {} func (x *LogEntry) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[20] + mi := &file_io_defang_v1_fabric_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1472,7 +1545,7 @@ func (x *LogEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEntry.ProtoReflect.Descriptor instead. func (*LogEntry) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{20} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{21} } func (x *LogEntry) GetMessage() string { @@ -1531,7 +1604,7 @@ type TailResponse struct { func (x *TailResponse) Reset() { *x = TailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[21] + mi := &file_io_defang_v1_fabric_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1544,7 +1617,7 @@ func (x *TailResponse) String() string { func (*TailResponse) ProtoMessage() {} func (x *TailResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[21] + mi := &file_io_defang_v1_fabric_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1557,7 +1630,7 @@ func (x *TailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TailResponse.ProtoReflect.Descriptor instead. func (*TailResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{21} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{22} } func (x *TailResponse) GetEntries() []*LogEntry { @@ -1595,12 +1668,13 @@ type ListServicesResponse struct { Services []*ServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` + Compose string `protobuf:"bytes,3,opt,name=compose,proto3" json:"compose,omitempty"` } func (x *ListServicesResponse) Reset() { *x = ListServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[22] + mi := &file_io_defang_v1_fabric_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1613,7 +1687,7 @@ func (x *ListServicesResponse) String() string { func (*ListServicesResponse) ProtoMessage() {} func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[22] + mi := &file_io_defang_v1_fabric_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1626,7 +1700,7 @@ func (x *ListServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListServicesResponse.ProtoReflect.Descriptor instead. func (*ListServicesResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{22} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{23} } func (x *ListServicesResponse) GetServices() []*ServiceInfo { @@ -1643,6 +1717,13 @@ func (x *ListServicesResponse) GetProject() string { return "" } +func (x *ListServicesResponse) GetCompose() string { + if x != nil { + return x.Compose + } + return "" +} + // TODO: internal message; move to a separate proto file type ProjectUpdate struct { state protoimpl.MessageState @@ -1651,12 +1732,13 @@ type ProjectUpdate struct { Services []*ServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` AlbArn string `protobuf:"bytes,2,opt,name=alb_arn,json=albArn,proto3" json:"alb_arn,omitempty"` + Compose string `protobuf:"bytes,3,opt,name=compose,proto3" json:"compose,omitempty"` } func (x *ProjectUpdate) Reset() { *x = ProjectUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[23] + mi := &file_io_defang_v1_fabric_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1669,7 +1751,7 @@ func (x *ProjectUpdate) String() string { func (*ProjectUpdate) ProtoMessage() {} func (x *ProjectUpdate) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[23] + mi := &file_io_defang_v1_fabric_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1682,7 +1764,7 @@ func (x *ProjectUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectUpdate.ProtoReflect.Descriptor instead. func (*ProjectUpdate) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{23} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{24} } func (x *ProjectUpdate) GetServices() []*ServiceInfo { @@ -1699,6 +1781,13 @@ func (x *ProjectUpdate) GetAlbArn() string { return "" } +func (x *ProjectUpdate) GetCompose() string { + if x != nil { + return x.Compose + } + return "" +} + type ServiceID struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1710,7 +1799,7 @@ type ServiceID struct { func (x *ServiceID) Reset() { *x = ServiceID{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[24] + mi := &file_io_defang_v1_fabric_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1723,7 +1812,7 @@ func (x *ServiceID) String() string { func (*ServiceID) ProtoMessage() {} func (x *ServiceID) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[24] + mi := &file_io_defang_v1_fabric_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1736,7 +1825,7 @@ func (x *ServiceID) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceID.ProtoReflect.Descriptor instead. func (*ServiceID) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{24} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{25} } func (x *ServiceID) GetName() string { @@ -1759,7 +1848,7 @@ type Device struct { func (x *Device) Reset() { *x = Device{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[25] + mi := &file_io_defang_v1_fabric_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1772,7 +1861,7 @@ func (x *Device) String() string { func (*Device) ProtoMessage() {} func (x *Device) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[25] + mi := &file_io_defang_v1_fabric_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1785,7 +1874,7 @@ func (x *Device) ProtoReflect() protoreflect.Message { // Deprecated: Use Device.ProtoReflect.Descriptor instead. func (*Device) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{25} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{26} } func (x *Device) GetCapabilities() []string { @@ -1822,7 +1911,7 @@ type Resource struct { func (x *Resource) Reset() { *x = Resource{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[26] + mi := &file_io_defang_v1_fabric_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1835,7 +1924,7 @@ func (x *Resource) String() string { func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[26] + mi := &file_io_defang_v1_fabric_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1848,7 +1937,7 @@ func (x *Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use Resource.ProtoReflect.Descriptor instead. func (*Resource) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{26} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{27} } func (x *Resource) GetMemory() float32 { @@ -1883,7 +1972,7 @@ type Resources struct { func (x *Resources) Reset() { *x = Resources{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[27] + mi := &file_io_defang_v1_fabric_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1896,7 +1985,7 @@ func (x *Resources) String() string { func (*Resources) ProtoMessage() {} func (x *Resources) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[27] + mi := &file_io_defang_v1_fabric_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1909,7 +1998,7 @@ func (x *Resources) ProtoReflect() protoreflect.Message { // Deprecated: Use Resources.ProtoReflect.Descriptor instead. func (*Resources) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{27} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{28} } func (x *Resources) GetReservations() *Resource { @@ -1931,7 +2020,7 @@ type Deploy struct { func (x *Deploy) Reset() { *x = Deploy{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[28] + mi := &file_io_defang_v1_fabric_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1944,7 +2033,7 @@ func (x *Deploy) String() string { func (*Deploy) ProtoMessage() {} func (x *Deploy) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[28] + mi := &file_io_defang_v1_fabric_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1957,7 +2046,7 @@ func (x *Deploy) ProtoReflect() protoreflect.Message { // Deprecated: Use Deploy.ProtoReflect.Descriptor instead. func (*Deploy) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{28} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{29} } func (x *Deploy) GetReplicas() uint32 { @@ -1987,7 +2076,7 @@ type Port struct { func (x *Port) Reset() { *x = Port{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[29] + mi := &file_io_defang_v1_fabric_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2000,7 +2089,7 @@ func (x *Port) String() string { func (*Port) ProtoMessage() {} func (x *Port) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[29] + mi := &file_io_defang_v1_fabric_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2013,7 +2102,7 @@ func (x *Port) ProtoReflect() protoreflect.Message { // Deprecated: Use Port.ProtoReflect.Descriptor instead. func (*Port) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{29} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{30} } func (x *Port) GetTarget() uint32 { @@ -2048,7 +2137,7 @@ type Secret struct { func (x *Secret) Reset() { *x = Secret{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[30] + mi := &file_io_defang_v1_fabric_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2061,7 +2150,7 @@ func (x *Secret) String() string { func (*Secret) ProtoMessage() {} func (x *Secret) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[30] + mi := &file_io_defang_v1_fabric_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2074,7 +2163,7 @@ func (x *Secret) ProtoReflect() protoreflect.Message { // Deprecated: Use Secret.ProtoReflect.Descriptor instead. func (*Secret) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{30} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{31} } func (x *Secret) GetSource() string { @@ -2099,7 +2188,7 @@ type Build struct { func (x *Build) Reset() { *x = Build{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[31] + mi := &file_io_defang_v1_fabric_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2112,7 +2201,7 @@ func (x *Build) String() string { func (*Build) ProtoMessage() {} func (x *Build) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[31] + mi := &file_io_defang_v1_fabric_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2125,7 +2214,7 @@ func (x *Build) ProtoReflect() protoreflect.Message { // Deprecated: Use Build.ProtoReflect.Descriptor instead. func (*Build) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{31} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{32} } func (x *Build) GetContext() string { @@ -2177,7 +2266,7 @@ type HealthCheck struct { func (x *HealthCheck) Reset() { *x = HealthCheck{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[32] + mi := &file_io_defang_v1_fabric_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2190,7 +2279,7 @@ func (x *HealthCheck) String() string { func (*HealthCheck) ProtoMessage() {} func (x *HealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[32] + mi := &file_io_defang_v1_fabric_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2203,7 +2292,7 @@ func (x *HealthCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheck.ProtoReflect.Descriptor instead. func (*HealthCheck) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{32} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{33} } func (x *HealthCheck) GetTest() []string { @@ -2239,9 +2328,10 @@ type Service struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` - Platform Platform `protobuf:"varint,3,opt,name=platform,proto3,enum=io.defang.v1.Platform" json:"platform,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` + Platform Platform `protobuf:"varint,3,opt,name=platform,proto3,enum=io.defang.v1.Platform" json:"platform,omitempty"` + // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. Internal bool `protobuf:"varint,4,opt,name=internal,proto3" json:"internal,omitempty"` // deprecated: use networks Deploy *Deploy `protobuf:"bytes,5,opt,name=deploy,proto3" json:"deploy,omitempty"` Ports []*Port `protobuf:"bytes,6,rep,name=ports,proto3" json:"ports,omitempty"` @@ -2261,7 +2351,7 @@ type Service struct { func (x *Service) Reset() { *x = Service{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[33] + mi := &file_io_defang_v1_fabric_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2274,7 +2364,7 @@ func (x *Service) String() string { func (*Service) ProtoMessage() {} func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[33] + mi := &file_io_defang_v1_fabric_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2287,7 +2377,7 @@ func (x *Service) ProtoReflect() protoreflect.Message { // Deprecated: Use Service.ProtoReflect.Descriptor instead. func (*Service) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{33} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{34} } func (x *Service) GetName() string { @@ -2311,6 +2401,7 @@ func (x *Service) GetPlatform() Platform { return Platform_LINUX_AMD64 } +// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. func (x *Service) GetInternal() bool { if x != nil { return x.Internal @@ -2421,7 +2512,7 @@ type StaticFiles struct { func (x *StaticFiles) Reset() { *x = StaticFiles{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[34] + mi := &file_io_defang_v1_fabric_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2434,7 +2525,7 @@ func (x *StaticFiles) String() string { func (*StaticFiles) ProtoMessage() {} func (x *StaticFiles) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[34] + mi := &file_io_defang_v1_fabric_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2447,7 +2538,7 @@ func (x *StaticFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use StaticFiles.ProtoReflect.Descriptor instead. func (*StaticFiles) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{34} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{35} } func (x *StaticFiles) GetFolder() string { @@ -2473,7 +2564,7 @@ type Redis struct { func (x *Redis) Reset() { *x = Redis{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[35] + mi := &file_io_defang_v1_fabric_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2486,7 +2577,7 @@ func (x *Redis) String() string { func (*Redis) ProtoMessage() {} func (x *Redis) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[35] + mi := &file_io_defang_v1_fabric_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2499,7 +2590,7 @@ func (x *Redis) ProtoReflect() protoreflect.Message { // Deprecated: Use Redis.ProtoReflect.Descriptor instead. func (*Redis) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{35} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{36} } type Event struct { @@ -2521,7 +2612,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[36] + mi := &file_io_defang_v1_fabric_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2534,7 +2625,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[36] + mi := &file_io_defang_v1_fabric_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2547,7 +2638,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{36} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{37} } func (x *Event) GetSpecversion() string { @@ -2624,7 +2715,7 @@ type PublishRequest struct { func (x *PublishRequest) Reset() { *x = PublishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[37] + mi := &file_io_defang_v1_fabric_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2637,7 +2728,7 @@ func (x *PublishRequest) String() string { func (*PublishRequest) ProtoMessage() {} func (x *PublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[37] + mi := &file_io_defang_v1_fabric_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2650,7 +2741,7 @@ func (x *PublishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead. func (*PublishRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{37} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{38} } func (x *PublishRequest) GetEvent() *Event { @@ -2671,7 +2762,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[38] + mi := &file_io_defang_v1_fabric_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2684,7 +2775,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[38] + mi := &file_io_defang_v1_fabric_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2697,7 +2788,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{38} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{39} } func (x *SubscribeRequest) GetServices() []string { @@ -2718,7 +2809,7 @@ type SubscribeResponse struct { func (x *SubscribeResponse) Reset() { *x = SubscribeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[39] + mi := &file_io_defang_v1_fabric_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2731,7 +2822,7 @@ func (x *SubscribeResponse) String() string { func (*SubscribeResponse) ProtoMessage() {} func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[39] + mi := &file_io_defang_v1_fabric_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2744,7 +2835,7 @@ func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeResponse.ProtoReflect.Descriptor instead. func (*SubscribeResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{39} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{40} } func (x *SubscribeResponse) GetService() *ServiceInfo { @@ -2765,7 +2856,7 @@ type DelegateSubdomainZoneRequest struct { func (x *DelegateSubdomainZoneRequest) Reset() { *x = DelegateSubdomainZoneRequest{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[40] + mi := &file_io_defang_v1_fabric_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2778,7 +2869,7 @@ func (x *DelegateSubdomainZoneRequest) String() string { func (*DelegateSubdomainZoneRequest) ProtoMessage() {} func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[40] + mi := &file_io_defang_v1_fabric_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2791,7 +2882,7 @@ func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{40} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{41} } func (x *DelegateSubdomainZoneRequest) GetNameServerRecords() []string { @@ -2812,7 +2903,7 @@ type DelegateSubdomainZoneResponse struct { func (x *DelegateSubdomainZoneResponse) Reset() { *x = DelegateSubdomainZoneResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[41] + mi := &file_io_defang_v1_fabric_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2825,7 +2916,7 @@ func (x *DelegateSubdomainZoneResponse) String() string { func (*DelegateSubdomainZoneResponse) ProtoMessage() {} func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[41] + mi := &file_io_defang_v1_fabric_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2838,7 +2929,7 @@ func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneResponse.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{41} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{42} } func (x *DelegateSubdomainZoneResponse) GetZone() string { @@ -2862,7 +2953,7 @@ type WhoAmIResponse struct { func (x *WhoAmIResponse) Reset() { *x = WhoAmIResponse{} if protoimpl.UnsafeEnabled { - mi := &file_io_defang_v1_fabric_proto_msgTypes[42] + mi := &file_io_defang_v1_fabric_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2875,7 +2966,7 @@ func (x *WhoAmIResponse) String() string { func (*WhoAmIResponse) ProtoMessage() {} func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[42] + mi := &file_io_defang_v1_fabric_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2888,7 +2979,7 @@ func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WhoAmIResponse.ProtoReflect.Descriptor instead. func (*WhoAmIResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{42} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{43} } func (x *WhoAmIResponse) GetTenant() string { @@ -2928,463 +3019,480 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xec, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x22, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, - 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x67, - 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x67, - 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, - 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, 0x22, 0x34, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, - 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, - 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x25, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0xcf, 0x03, - 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x46, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0xec, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x4a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, + 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7a, + 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, 0x74, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, 0x49, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6c, - 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x62, 0x49, - 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x71, - 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x7a, - 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x6d, - 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, - 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, 0x74, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, - 0x39, 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x51, 0x0a, 0x0b, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xaf, 0x01, - 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0x32, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6c, - 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6c, 0x69, - 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x6d, 0x69, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x4d, - 0x69, 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x6f, 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x24, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x22, 0x67, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, + 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, 0x22, 0x34, 0x0a, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x22, 0x2a, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x25, 0x0a, 0x11, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0xf1, 0x03, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x52, 0x07, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, + 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, + 0x74, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, + 0x49, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x62, 0x49, 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x4c, 0x6f, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x64, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, - 0x72, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x68, 0x6f, 0x73, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, - 0x67, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5f, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, 0x06, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x70, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, 0x12, 0x2e, - 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, + 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x6d, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, + 0x65, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x39, 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x51, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xaf, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x17, + 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, + 0x62, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x62, 0x72, + 0x69, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x4d, 0x69, 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, + 0x22, 0x6f, 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, + 0x69, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x88, 0x01, 0x0a, + 0x0c, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, + 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, + 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x81, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x0d, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x70, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x09, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x22, 0x7a, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x0a, + 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0xe0, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6d, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x73, 0x68, 0x6d, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x37, 0x0a, 0x09, 0x41, 0x72, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x71, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x86, 0x06, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, + 0x1e, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, + 0x2c, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x47, - 0x0a, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x35, 0x0a, - 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x22, 0x20, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, - 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, - 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6d, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x73, 0x68, 0x6d, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x37, 0x0a, 0x09, - 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x71, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x82, 0x06, 0x0a, 0x07, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x32, - 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x2c, - 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x28, 0x0a, 0x05, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, - 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x29, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6e, 0x73, 0x52, 0x6f, 0x6c, - 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x31, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3e, 0x0a, - 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x73, 0x22, 0x07, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x05, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, - 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0e, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x28, 0x0a, + 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, + 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x07, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0b, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6e, 0x73, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x31, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x1a, 0x3e, + 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x43, + 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x73, 0x22, 0x07, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x22, 0x8d, 0x02, 0x0a, + 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, + 0x63, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0e, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x2e, 0x0a, 0x10, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x48, 0x0a, 0x11, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x22, 0x4e, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x73, 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, + 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x2a, 0x3b, 0x0a, + 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, + 0x55, 0x58, 0x5f, 0x41, 0x4d, 0x44, 0x36, 0x34, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, + 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, + 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, + 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, + 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x48, + 0x54, 0x54, 0x50, 0x32, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x10, 0x05, + 0x2a, 0x1d, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x2a, + 0x33, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, + 0x49, 0x43, 0x10, 0x02, 0x32, 0xd2, 0x0f, 0x0a, 0x10, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, + 0x0b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x04, + 0x54, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3f, 0x0a, + 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x22, 0x4e, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x73, 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, 0x6d, - 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x2a, 0x3b, 0x0a, 0x08, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, 0x55, - 0x58, 0x5f, 0x41, 0x4d, 0x44, 0x36, 0x34, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, - 0x55, 0x58, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x49, - 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, - 0x54, 0x50, 0x32, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x10, 0x05, 0x2a, - 0x1d, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x2a, 0x33, - 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, - 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, - 0x43, 0x10, 0x02, 0x32, 0x87, 0x0f, 0x0a, 0x10, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, - 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x54, - 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x06, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x43, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x03, 0x47, 0x65, 0x74, 0x12, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x1a, 0x19, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x43, 0x0a, - 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, - 0x90, 0x02, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, + 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x17, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x44, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, + 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x3f, 0x0a, + 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x4e, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3f, + 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, - 0x45, 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x45, 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x52, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, - 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x12, 0x3f, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x3e, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x19, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x41, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x52, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, + 0x65, 0x12, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, + 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x57, - 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, - 0x41, 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, - 0x12, 0x3b, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0xb0, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x42, 0x0b, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, - 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x69, 0x6f, 0x2f, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x76, 0x31, - 0xa2, 0x02, 0x03, 0x49, 0x44, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0e, 0x49, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x64, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x41, 0x6d, + 0x49, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3b, 0x0a, 0x05, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0xb0, 0x01, 0x0a, 0x10, 0x63, 0x6f, + 0x6d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, + 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x73, 0x72, 0x63, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x69, 0x6f, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, + 0x44, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x18, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x49, 0x6f, + 0x3a, 0x3a, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3400,147 +3508,150 @@ func file_io_defang_v1_fabric_proto_rawDescGZIP() []byte { } var file_io_defang_v1_fabric_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 46) +var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 47) var file_io_defang_v1_fabric_proto_goTypes = []any{ (Platform)(0), // 0: io.defang.v1.Platform (Protocol)(0), // 1: io.defang.v1.Protocol (Mode)(0), // 2: io.defang.v1.Mode (Network)(0), // 3: io.defang.v1.Network - (*TrackRequest)(nil), // 4: io.defang.v1.TrackRequest - (*DeployRequest)(nil), // 5: io.defang.v1.DeployRequest - (*DeployResponse)(nil), // 6: io.defang.v1.DeployResponse - (*DeleteRequest)(nil), // 7: io.defang.v1.DeleteRequest - (*DeleteResponse)(nil), // 8: io.defang.v1.DeleteResponse - (*GenerateFilesRequest)(nil), // 9: io.defang.v1.GenerateFilesRequest - (*File)(nil), // 10: io.defang.v1.File - (*GenerateFilesResponse)(nil), // 11: io.defang.v1.GenerateFilesResponse - (*StartGenerateResponse)(nil), // 12: io.defang.v1.StartGenerateResponse - (*GenerateStatusRequest)(nil), // 13: io.defang.v1.GenerateStatusRequest - (*UploadURLRequest)(nil), // 14: io.defang.v1.UploadURLRequest - (*UploadURLResponse)(nil), // 15: io.defang.v1.UploadURLResponse - (*ServiceInfo)(nil), // 16: io.defang.v1.ServiceInfo - (*Secrets)(nil), // 17: io.defang.v1.Secrets - (*SecretValue)(nil), // 18: io.defang.v1.SecretValue - (*TokenRequest)(nil), // 19: io.defang.v1.TokenRequest - (*TokenResponse)(nil), // 20: io.defang.v1.TokenResponse - (*Status)(nil), // 21: io.defang.v1.Status - (*Version)(nil), // 22: io.defang.v1.Version - (*TailRequest)(nil), // 23: io.defang.v1.TailRequest - (*LogEntry)(nil), // 24: io.defang.v1.LogEntry - (*TailResponse)(nil), // 25: io.defang.v1.TailResponse - (*ListServicesResponse)(nil), // 26: io.defang.v1.ListServicesResponse - (*ProjectUpdate)(nil), // 27: io.defang.v1.ProjectUpdate - (*ServiceID)(nil), // 28: io.defang.v1.ServiceID - (*Device)(nil), // 29: io.defang.v1.Device - (*Resource)(nil), // 30: io.defang.v1.Resource - (*Resources)(nil), // 31: io.defang.v1.Resources - (*Deploy)(nil), // 32: io.defang.v1.Deploy - (*Port)(nil), // 33: io.defang.v1.Port - (*Secret)(nil), // 34: io.defang.v1.Secret - (*Build)(nil), // 35: io.defang.v1.Build - (*HealthCheck)(nil), // 36: io.defang.v1.HealthCheck - (*Service)(nil), // 37: io.defang.v1.Service - (*StaticFiles)(nil), // 38: io.defang.v1.StaticFiles - (*Redis)(nil), // 39: io.defang.v1.Redis - (*Event)(nil), // 40: io.defang.v1.Event - (*PublishRequest)(nil), // 41: io.defang.v1.PublishRequest - (*SubscribeRequest)(nil), // 42: io.defang.v1.SubscribeRequest - (*SubscribeResponse)(nil), // 43: io.defang.v1.SubscribeResponse - (*DelegateSubdomainZoneRequest)(nil), // 44: io.defang.v1.DelegateSubdomainZoneRequest - (*DelegateSubdomainZoneResponse)(nil), // 45: io.defang.v1.DelegateSubdomainZoneResponse - (*WhoAmIResponse)(nil), // 46: io.defang.v1.WhoAmIResponse - nil, // 47: io.defang.v1.TrackRequest.PropertiesEntry - nil, // 48: io.defang.v1.Build.ArgsEntry - nil, // 49: io.defang.v1.Service.EnvironmentEntry - (*timestamppb.Timestamp)(nil), // 50: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 51: google.protobuf.Empty + (*RestartRequest)(nil), // 4: io.defang.v1.RestartRequest + (*TrackRequest)(nil), // 5: io.defang.v1.TrackRequest + (*DeployRequest)(nil), // 6: io.defang.v1.DeployRequest + (*DeployResponse)(nil), // 7: io.defang.v1.DeployResponse + (*DeleteRequest)(nil), // 8: io.defang.v1.DeleteRequest + (*DeleteResponse)(nil), // 9: io.defang.v1.DeleteResponse + (*GenerateFilesRequest)(nil), // 10: io.defang.v1.GenerateFilesRequest + (*File)(nil), // 11: io.defang.v1.File + (*GenerateFilesResponse)(nil), // 12: io.defang.v1.GenerateFilesResponse + (*StartGenerateResponse)(nil), // 13: io.defang.v1.StartGenerateResponse + (*GenerateStatusRequest)(nil), // 14: io.defang.v1.GenerateStatusRequest + (*UploadURLRequest)(nil), // 15: io.defang.v1.UploadURLRequest + (*UploadURLResponse)(nil), // 16: io.defang.v1.UploadURLResponse + (*ServiceInfo)(nil), // 17: io.defang.v1.ServiceInfo + (*Secrets)(nil), // 18: io.defang.v1.Secrets + (*SecretValue)(nil), // 19: io.defang.v1.SecretValue + (*TokenRequest)(nil), // 20: io.defang.v1.TokenRequest + (*TokenResponse)(nil), // 21: io.defang.v1.TokenResponse + (*Status)(nil), // 22: io.defang.v1.Status + (*Version)(nil), // 23: io.defang.v1.Version + (*TailRequest)(nil), // 24: io.defang.v1.TailRequest + (*LogEntry)(nil), // 25: io.defang.v1.LogEntry + (*TailResponse)(nil), // 26: io.defang.v1.TailResponse + (*ListServicesResponse)(nil), // 27: io.defang.v1.ListServicesResponse + (*ProjectUpdate)(nil), // 28: io.defang.v1.ProjectUpdate + (*ServiceID)(nil), // 29: io.defang.v1.ServiceID + (*Device)(nil), // 30: io.defang.v1.Device + (*Resource)(nil), // 31: io.defang.v1.Resource + (*Resources)(nil), // 32: io.defang.v1.Resources + (*Deploy)(nil), // 33: io.defang.v1.Deploy + (*Port)(nil), // 34: io.defang.v1.Port + (*Secret)(nil), // 35: io.defang.v1.Secret + (*Build)(nil), // 36: io.defang.v1.Build + (*HealthCheck)(nil), // 37: io.defang.v1.HealthCheck + (*Service)(nil), // 38: io.defang.v1.Service + (*StaticFiles)(nil), // 39: io.defang.v1.StaticFiles + (*Redis)(nil), // 40: io.defang.v1.Redis + (*Event)(nil), // 41: io.defang.v1.Event + (*PublishRequest)(nil), // 42: io.defang.v1.PublishRequest + (*SubscribeRequest)(nil), // 43: io.defang.v1.SubscribeRequest + (*SubscribeResponse)(nil), // 44: io.defang.v1.SubscribeResponse + (*DelegateSubdomainZoneRequest)(nil), // 45: io.defang.v1.DelegateSubdomainZoneRequest + (*DelegateSubdomainZoneResponse)(nil), // 46: io.defang.v1.DelegateSubdomainZoneResponse + (*WhoAmIResponse)(nil), // 47: io.defang.v1.WhoAmIResponse + nil, // 48: io.defang.v1.TrackRequest.PropertiesEntry + nil, // 49: io.defang.v1.Build.ArgsEntry + nil, // 50: io.defang.v1.Service.EnvironmentEntry + (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 52: google.protobuf.Empty } var file_io_defang_v1_fabric_proto_depIdxs = []int32{ - 47, // 0: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry - 37, // 1: io.defang.v1.DeployRequest.services:type_name -> io.defang.v1.Service - 16, // 2: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo - 10, // 3: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File - 37, // 4: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.Service - 50, // 5: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp - 50, // 6: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp - 50, // 7: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp - 50, // 8: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 24, // 9: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry - 16, // 10: io.defang.v1.ListServicesResponse.services:type_name -> io.defang.v1.ServiceInfo - 16, // 11: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo - 29, // 12: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device - 30, // 13: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource - 31, // 14: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources + 48, // 0: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry + 38, // 1: io.defang.v1.DeployRequest.services:type_name -> io.defang.v1.Service + 17, // 2: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo + 11, // 3: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File + 29, // 4: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.ServiceID + 51, // 5: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp + 51, // 6: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp + 51, // 7: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp + 51, // 8: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 25, // 9: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry + 17, // 10: io.defang.v1.ListServicesResponse.services:type_name -> io.defang.v1.ServiceInfo + 17, // 11: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo + 30, // 12: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device + 31, // 13: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource + 32, // 14: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources 1, // 15: io.defang.v1.Port.protocol:type_name -> io.defang.v1.Protocol 2, // 16: io.defang.v1.Port.mode:type_name -> io.defang.v1.Mode - 48, // 17: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry + 49, // 17: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry 0, // 18: io.defang.v1.Service.platform:type_name -> io.defang.v1.Platform - 32, // 19: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy - 33, // 20: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port - 49, // 21: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry - 35, // 22: io.defang.v1.Service.build:type_name -> io.defang.v1.Build - 34, // 23: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret - 36, // 24: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck - 38, // 25: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles + 33, // 19: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy + 34, // 20: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port + 50, // 21: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry + 36, // 22: io.defang.v1.Service.build:type_name -> io.defang.v1.Build + 35, // 23: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret + 37, // 24: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck + 39, // 25: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles 3, // 26: io.defang.v1.Service.networks:type_name -> io.defang.v1.Network - 39, // 27: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis - 50, // 28: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp - 40, // 29: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event - 16, // 30: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo - 51, // 31: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty - 51, // 32: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty - 19, // 33: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest - 51, // 34: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty - 23, // 35: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest - 37, // 36: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service - 5, // 37: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest - 28, // 38: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.ServiceID - 7, // 39: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest - 41, // 40: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest - 42, // 41: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest - 51, // 42: io.defang.v1.FabricController.GetServices:input_type -> google.protobuf.Empty - 9, // 43: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest - 9, // 44: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest - 13, // 45: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest - 51, // 46: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty - 51, // 47: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty - 18, // 48: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.SecretValue - 17, // 49: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets - 51, // 50: io.defang.v1.FabricController.ListSecrets:input_type -> google.protobuf.Empty - 14, // 51: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest - 44, // 52: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest - 51, // 53: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> google.protobuf.Empty - 51, // 54: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> google.protobuf.Empty - 51, // 55: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty - 4, // 56: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest - 21, // 57: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status - 22, // 58: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version - 20, // 59: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse - 51, // 60: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty - 25, // 61: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse - 16, // 62: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo - 6, // 63: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse - 16, // 64: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo - 8, // 65: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse - 51, // 66: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty - 43, // 67: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse - 26, // 68: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.ListServicesResponse - 11, // 69: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse - 12, // 70: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse - 11, // 71: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse - 51, // 72: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty - 51, // 73: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty - 51, // 74: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty - 51, // 75: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty - 17, // 76: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets - 15, // 77: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse - 45, // 78: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 51, // 79: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty - 45, // 80: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 46, // 81: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse - 51, // 82: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty - 57, // [57:83] is the sub-list for method output_type - 31, // [31:57] is the sub-list for method input_type + 40, // 27: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis + 51, // 28: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp + 41, // 29: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event + 17, // 30: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo + 52, // 31: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty + 52, // 32: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty + 20, // 33: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest + 52, // 34: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty + 24, // 35: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest + 38, // 36: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service + 6, // 37: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest + 29, // 38: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.ServiceID + 8, // 39: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest + 42, // 40: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest + 43, // 41: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest + 52, // 42: io.defang.v1.FabricController.GetServices:input_type -> google.protobuf.Empty + 4, // 43: io.defang.v1.FabricController.Restart:input_type -> io.defang.v1.RestartRequest + 10, // 44: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest + 10, // 45: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest + 14, // 46: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest + 52, // 47: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty + 52, // 48: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty + 19, // 49: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.SecretValue + 18, // 50: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets + 52, // 51: io.defang.v1.FabricController.ListSecrets:input_type -> google.protobuf.Empty + 15, // 52: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest + 45, // 53: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest + 52, // 54: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> google.protobuf.Empty + 52, // 55: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> google.protobuf.Empty + 52, // 56: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty + 5, // 57: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest + 22, // 58: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status + 23, // 59: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version + 21, // 60: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse + 52, // 61: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty + 26, // 62: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse + 17, // 63: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo + 7, // 64: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse + 17, // 65: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo + 9, // 66: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse + 52, // 67: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty + 44, // 68: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse + 27, // 69: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.ListServicesResponse + 52, // 70: io.defang.v1.FabricController.Restart:output_type -> google.protobuf.Empty + 12, // 71: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse + 13, // 72: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse + 12, // 73: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse + 52, // 74: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty + 52, // 75: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty + 52, // 76: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty + 52, // 77: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty + 18, // 78: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets + 16, // 79: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse + 46, // 80: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 52, // 81: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty + 46, // 82: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 47, // 83: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse + 52, // 84: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty + 58, // [58:85] is the sub-list for method output_type + 31, // [31:58] is the sub-list for method input_type 31, // [31:31] is the sub-list for extension type_name 31, // [31:31] is the sub-list for extension extendee 0, // [0:31] is the sub-list for field type_name @@ -3553,7 +3664,7 @@ func file_io_defang_v1_fabric_proto_init() { } if !protoimpl.UnsafeEnabled { file_io_defang_v1_fabric_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*TrackRequest); i { + switch v := v.(*RestartRequest); i { case 0: return &v.state case 1: @@ -3565,7 +3676,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*DeployRequest); i { + switch v := v.(*TrackRequest); i { case 0: return &v.state case 1: @@ -3577,7 +3688,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*DeployResponse); i { + switch v := v.(*DeployRequest); i { case 0: return &v.state case 1: @@ -3589,7 +3700,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*DeleteRequest); i { + switch v := v.(*DeployResponse); i { case 0: return &v.state case 1: @@ -3601,7 +3712,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*DeleteResponse); i { + switch v := v.(*DeleteRequest); i { case 0: return &v.state case 1: @@ -3613,7 +3724,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*GenerateFilesRequest); i { + switch v := v.(*DeleteResponse); i { case 0: return &v.state case 1: @@ -3625,7 +3736,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*File); i { + switch v := v.(*GenerateFilesRequest); i { case 0: return &v.state case 1: @@ -3637,7 +3748,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*GenerateFilesResponse); i { + switch v := v.(*File); i { case 0: return &v.state case 1: @@ -3649,7 +3760,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*StartGenerateResponse); i { + switch v := v.(*GenerateFilesResponse); i { case 0: return &v.state case 1: @@ -3661,7 +3772,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*GenerateStatusRequest); i { + switch v := v.(*StartGenerateResponse); i { case 0: return &v.state case 1: @@ -3673,7 +3784,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*UploadURLRequest); i { + switch v := v.(*GenerateStatusRequest); i { case 0: return &v.state case 1: @@ -3685,7 +3796,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*UploadURLResponse); i { + switch v := v.(*UploadURLRequest); i { case 0: return &v.state case 1: @@ -3697,7 +3808,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*ServiceInfo); i { + switch v := v.(*UploadURLResponse); i { case 0: return &v.state case 1: @@ -3709,7 +3820,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*Secrets); i { + switch v := v.(*ServiceInfo); i { case 0: return &v.state case 1: @@ -3721,7 +3832,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*SecretValue); i { + switch v := v.(*Secrets); i { case 0: return &v.state case 1: @@ -3733,7 +3844,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*TokenRequest); i { + switch v := v.(*SecretValue); i { case 0: return &v.state case 1: @@ -3745,7 +3856,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*TokenResponse); i { + switch v := v.(*TokenRequest); i { case 0: return &v.state case 1: @@ -3757,7 +3868,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*Status); i { + switch v := v.(*TokenResponse); i { case 0: return &v.state case 1: @@ -3769,7 +3880,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*Version); i { + switch v := v.(*Status); i { case 0: return &v.state case 1: @@ -3781,7 +3892,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*TailRequest); i { + switch v := v.(*Version); i { case 0: return &v.state case 1: @@ -3793,7 +3904,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*LogEntry); i { + switch v := v.(*TailRequest); i { case 0: return &v.state case 1: @@ -3805,7 +3916,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*TailResponse); i { + switch v := v.(*LogEntry); i { case 0: return &v.state case 1: @@ -3817,7 +3928,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*ListServicesResponse); i { + switch v := v.(*TailResponse); i { case 0: return &v.state case 1: @@ -3829,7 +3940,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*ProjectUpdate); i { + switch v := v.(*ListServicesResponse); i { case 0: return &v.state case 1: @@ -3841,7 +3952,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*ServiceID); i { + switch v := v.(*ProjectUpdate); i { case 0: return &v.state case 1: @@ -3853,7 +3964,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*Device); i { + switch v := v.(*ServiceID); i { case 0: return &v.state case 1: @@ -3865,7 +3976,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*Resource); i { + switch v := v.(*Device); i { case 0: return &v.state case 1: @@ -3877,7 +3988,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*Resources); i { + switch v := v.(*Resource); i { case 0: return &v.state case 1: @@ -3889,7 +4000,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*Deploy); i { + switch v := v.(*Resources); i { case 0: return &v.state case 1: @@ -3901,7 +4012,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*Port); i { + switch v := v.(*Deploy); i { case 0: return &v.state case 1: @@ -3913,7 +4024,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*Secret); i { + switch v := v.(*Port); i { case 0: return &v.state case 1: @@ -3925,7 +4036,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*Build); i { + switch v := v.(*Secret); i { case 0: return &v.state case 1: @@ -3937,7 +4048,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*HealthCheck); i { + switch v := v.(*Build); i { case 0: return &v.state case 1: @@ -3949,7 +4060,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*Service); i { + switch v := v.(*HealthCheck); i { case 0: return &v.state case 1: @@ -3961,7 +4072,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*StaticFiles); i { + switch v := v.(*Service); i { case 0: return &v.state case 1: @@ -3973,7 +4084,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*Redis); i { + switch v := v.(*StaticFiles); i { case 0: return &v.state case 1: @@ -3985,7 +4096,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*Event); i { + switch v := v.(*Redis); i { case 0: return &v.state case 1: @@ -3997,7 +4108,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*PublishRequest); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -4009,7 +4120,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeRequest); i { + switch v := v.(*PublishRequest); i { case 0: return &v.state case 1: @@ -4021,7 +4132,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*SubscribeResponse); i { + switch v := v.(*SubscribeRequest); i { case 0: return &v.state case 1: @@ -4033,7 +4144,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*DelegateSubdomainZoneRequest); i { + switch v := v.(*SubscribeResponse); i { case 0: return &v.state case 1: @@ -4045,7 +4156,7 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*DelegateSubdomainZoneResponse); i { + switch v := v.(*DelegateSubdomainZoneRequest); i { case 0: return &v.state case 1: @@ -4057,6 +4168,18 @@ func file_io_defang_v1_fabric_proto_init() { } } file_io_defang_v1_fabric_proto_msgTypes[42].Exporter = func(v any, i int) any { + switch v := v.(*DelegateSubdomainZoneResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_defang_v1_fabric_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*WhoAmIResponse); i { case 0: return &v.state @@ -4075,7 +4198,7 @@ func file_io_defang_v1_fabric_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_io_defang_v1_fabric_proto_rawDesc, NumEnums: 4, - NumMessages: 46, + NumMessages: 47, NumExtensions: 0, NumServices: 1, }, diff --git a/src/protos/io/defang/v1/fabric.proto b/src/protos/io/defang/v1/fabric.proto index eda70854e..003ab7343 100644 --- a/src/protos/io/defang/v1/fabric.proto +++ b/src/protos/io/defang/v1/fabric.proto @@ -23,12 +23,16 @@ service FabricController { rpc RevokeToken(google.protobuf.Empty) returns (google.protobuf.Empty); rpc Tail(TailRequest) returns (stream TailResponse); - rpc Update(Service) returns (ServiceInfo); // deprecated; use Deploy + rpc Update(Service) returns (ServiceInfo) { + option deprecated = true; + }; // deprecated; use Deploy rpc Deploy(DeployRequest) returns (DeployResponse); rpc Get(ServiceID) returns (ServiceInfo) { option idempotency_level = NO_SIDE_EFFECTS; }; // should be GetService - rpc Delete(DeleteRequest) returns (DeleteResponse); // deprecated; use Deploy + rpc Delete(DeleteRequest) returns (DeleteResponse){ + option deprecated = true; + }; // deprecated; use Deploy rpc Publish(PublishRequest) returns (google.protobuf.Empty); rpc Subscribe(SubscribeRequest) returns (stream SubscribeResponse); // rpc Promote(google.protobuf.Empty) returns (google.protobuf.Empty); @@ -36,6 +40,10 @@ service FabricController { option idempotency_level = NO_SIDE_EFFECTS; }; // should be ListServices + rpc Restart(RestartRequest) returns (google.protobuf.Empty); + // rpc Start(ServiceID) returns (google.protobuf.Empty); + // rpc Stop(ServiceID) returns (google.protobuf.Empty); + rpc GenerateFiles(GenerateFilesRequest) returns ( GenerateFilesResponse); // deprecated; use StartGenerate/GenerateStatus rpc StartGenerate(GenerateFilesRequest) returns (StartGenerateResponse); @@ -70,6 +78,11 @@ service FabricController { rpc Track(TrackRequest) returns (google.protobuf.Empty); } +message RestartRequest { + repeated string services = 1; + string project = 2; // defaults to tenant ID +} + message TrackRequest { string anon_id = 1; string event = 2; @@ -79,8 +92,9 @@ message TrackRequest { } message DeployRequest { - repeated Service services = 1; + repeated Service services = 1 [deprecated = true]; // deprecated; use compose string project = 2; + string compose = 3; } message DeployResponse { @@ -118,13 +132,13 @@ message UploadURLRequest { string digest = 1; } message UploadURLResponse { string url = 1; } message ServiceInfo { - Service service = 1; + ServiceID service = 1; repeated string endpoints = 2; // list of endpoints, one for each port string project = 3; // was: tenant; defaults to tenant ID string etag = 4; string status = 5; repeated string nat_ips = 6; // comma-separated list of NAT IPs - repeated string lb_ips = 7; // comma-separated list of internal CIDR for the load-balancer + repeated string lb_ips = 7; // comma-separated list of internal CIDRs for the load-balancer string private_fqdn = 8; // fully qualified domain name (host) string public_fqdn = 9; // fully qualified domain name (ingress) google.protobuf.Timestamp created_at = 10; @@ -132,6 +146,7 @@ message ServiceInfo { string zone_id = 12; // zone ID for byod domain bool use_acme_cert = 13; // If we should setup the facilities to use ACME(let's encrypt) certs reserved 14; // was: string lb_dns + string domainname = 15; // domain name for the service // bool is_function = 5; // true if service is a function } @@ -207,12 +222,14 @@ message TailResponse { message ListServicesResponse { repeated ServiceInfo services = 1; string project = 2; + string compose = 3; } // TODO: internal message; move to a separate proto file message ProjectUpdate { repeated ServiceInfo services = 1; string alb_arn = 2; + string compose = 3; } enum Platform { @@ -227,20 +244,8 @@ message Device { repeated string capabilities = 1; // "gpu", "tpu", etc. string driver = 2; // "nvidia", "amd", etc. uint32 count = 3; // number of devices to reserve - - // repeated string device_ids = 4; // device IDs to reserve - // map options = 5; } -/* placement specifies constraints and preferences for platform to select a - * physical node to run service containers. */ -// message Placement { -// /* constraints defines a REQUIRED property the platform's node MUST fulfill -// to run service container. */ map constraints = 1; -// /* preferences defines a property the platform's node SHOULD fulfill to run -// service container. */ map preferences = 2; -// } - message Resource { float memory = 1; // in MiB float cpus = 2; // fractional vCPUs @@ -338,7 +343,7 @@ message Service { string name = 1; string image = 2; Platform platform = 3; - bool internal = 4; // deprecated: use networks + bool internal = 4 [deprecated = true]; // deprecated: use networks Deploy deploy = 5; repeated Port ports = 6; map environment = 7; @@ -375,7 +380,7 @@ message Event { message PublishRequest { Event event = 1; } -message SubscribeRequest { +message SubscribeRequest { repeated string services = 1; }