diff --git a/.golangci.yml b/.golangci.yml index 26c1bfec95..79f28ecc0c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,7 +16,6 @@ linters: disable: # these are in other PRs already - forcetypeassert - - protogetter # todo: determine if we want this - canonicalheader diff --git a/packages/api/internal/edge/cluster.go b/packages/api/internal/edge/cluster.go index 8a0b17e7b9..e53019db6b 100644 --- a/packages/api/internal/edge/cluster.go +++ b/packages/api/internal/edge/cluster.go @@ -185,9 +185,9 @@ func (c *Cluster) RegisterSandboxInCatalog(ctx context.Context, serviceInstanceI body := api.V1SandboxCatalogCreateJSONRequestBody{ OrchestratorID: serviceInstanceID, - ExecutionID: sandboxConfig.ExecutionId, - SandboxID: sandboxConfig.SandboxId, - SandboxMaxLength: sandboxConfig.MaxSandboxLength, + ExecutionID: sandboxConfig.GetExecutionId(), + SandboxID: sandboxConfig.GetSandboxId(), + SandboxMaxLength: sandboxConfig.GetMaxSandboxLength(), SandboxStartTime: sandboxStartTime, } diff --git a/packages/api/internal/edge/cluster_instances.go b/packages/api/internal/edge/cluster_instances.go index bcc2d22e33..0302a53137 100644 --- a/packages/api/internal/edge/cluster_instances.go +++ b/packages/api/internal/edge/cluster_instances.go @@ -56,8 +56,8 @@ func (c *Cluster) syncInstance(ctx context.Context, instance *ClusterInstance) { instance.mutex.Lock() defer instance.mutex.Unlock() - instance.status = info.ServiceStatus - instance.roles = info.ServiceRoles + instance.status = info.GetServiceStatus() + instance.roles = info.GetServiceRoles() } func (n *ClusterInstance) GetStatus() infogrpc.ServiceInfoStatus { diff --git a/packages/api/internal/handlers/template_layer_files_upload.go b/packages/api/internal/handlers/template_layer_files_upload.go index 287ebd517e..1c07a59fc5 100644 --- a/packages/api/internal/handlers/template_layer_files_upload.go +++ b/packages/api/internal/handlers/template_layer_files_upload.go @@ -53,7 +53,7 @@ func (a *APIStore) GetTemplatesTemplateIDFilesHash(c *gin.Context, templateID ap } c.JSON(http.StatusCreated, &api.TemplateBuildFileUpload{ - Present: resp.Present, + Present: resp.GetPresent(), Url: resp.Url, }) } diff --git a/packages/api/internal/orchestrator/nodemanager/builds.go b/packages/api/internal/orchestrator/nodemanager/builds.go index f1391d56a8..58cf9623fb 100644 --- a/packages/api/internal/orchestrator/nodemanager/builds.go +++ b/packages/api/internal/orchestrator/nodemanager/builds.go @@ -16,7 +16,7 @@ var tracer = otel.Tracer("github.com/e2b-dev/infra/packages/api/internal/orchest func (n *Node) SyncBuilds(builds []*orchestrator.CachedBuildInfo) { for _, build := range builds { - n.buildCache.Set(build.BuildId, struct{}{}, time.Until(build.ExpirationTime.AsTime())) + n.buildCache.Set(build.GetBuildId(), struct{}{}, time.Until(build.GetExpirationTime().AsTime())) } } diff --git a/packages/api/internal/orchestrator/nodemanager/metadata.go b/packages/api/internal/orchestrator/nodemanager/metadata.go index 146983041e..398428005e 100644 --- a/packages/api/internal/orchestrator/nodemanager/metadata.go +++ b/packages/api/internal/orchestrator/nodemanager/metadata.go @@ -46,11 +46,11 @@ func (n *Node) GetSandboxCreateCtx(ctx context.Context, req *orchestrator.Sandbo md := edge.SerializeSandboxCatalogCreateEvent( edge.SandboxCatalogCreateEvent{ - SandboxID: req.Sandbox.SandboxId, - SandboxMaxLengthInHours: req.Sandbox.MaxSandboxLength, - SandboxStartTime: req.StartTime.AsTime(), + SandboxID: req.GetSandbox().GetSandboxId(), + SandboxMaxLengthInHours: req.GetSandbox().GetMaxSandboxLength(), + SandboxStartTime: req.GetStartTime().AsTime(), - ExecutionID: req.Sandbox.ExecutionId, + ExecutionID: req.GetSandbox().GetExecutionId(), OrchestratorID: n.Metadata().ServiceInstanceID, }, ) diff --git a/packages/api/internal/orchestrator/nodemanager/metrics.go b/packages/api/internal/orchestrator/nodemanager/metrics.go index a0258c4bd4..d6dd9c28b7 100644 --- a/packages/api/internal/orchestrator/nodemanager/metrics.go +++ b/packages/api/internal/orchestrator/nodemanager/metrics.go @@ -35,30 +35,30 @@ func (n *Node) UpdateMetricsFromServiceInfoResponse(info *orchestratorinfo.Servi defer n.metricsMu.Unlock() // Update host usage metrics - n.metrics.CpuPercent = info.MetricCpuPercent - n.metrics.MemoryUsedBytes = info.MetricMemoryUsedBytes + n.metrics.CpuPercent = info.GetMetricCpuPercent() + n.metrics.MemoryUsedBytes = info.GetMetricMemoryUsedBytes() // Update host total metrics - n.metrics.CpuCount = info.MetricCpuCount - n.metrics.MemoryTotalBytes = info.MetricMemoryTotalBytes + n.metrics.CpuCount = info.GetMetricCpuCount() + n.metrics.MemoryTotalBytes = info.GetMetricMemoryTotalBytes() // Update allocated resources - n.metrics.CpuAllocated = info.MetricCpuAllocated - n.metrics.MemoryAllocatedBytes = info.MetricMemoryAllocatedBytes + n.metrics.CpuAllocated = info.GetMetricCpuAllocated() + n.metrics.MemoryAllocatedBytes = info.GetMetricMemoryAllocatedBytes() // Update total sandbox count - n.metrics.SandboxCount = info.MetricSandboxesRunning + n.metrics.SandboxCount = info.GetMetricSandboxesRunning() // Update detailed disk metrics - disks := info.MetricDisks + disks := info.GetMetricDisks() n.metrics.HostDisks = make([]DiskMetrics, len(disks)) for i, disk := range disks { n.metrics.HostDisks[i] = DiskMetrics{ - MountPoint: disk.MountPoint, - Device: disk.Device, - FilesystemType: disk.FilesystemType, - UsedBytes: disk.UsedBytes, - TotalBytes: disk.TotalBytes, + MountPoint: disk.GetMountPoint(), + Device: disk.GetDevice(), + FilesystemType: disk.GetFilesystemType(), + UsedBytes: disk.GetUsedBytes(), + TotalBytes: disk.GetTotalBytes(), } } } diff --git a/packages/api/internal/orchestrator/nodemanager/node.go b/packages/api/internal/orchestrator/nodemanager/node.go index 19b81bed49..be1a18d749 100644 --- a/packages/api/internal/orchestrator/nodemanager/node.go +++ b/packages/api/internal/orchestrator/nodemanager/node.go @@ -71,9 +71,9 @@ func New( return nil, fmt.Errorf("failed to get node service info: %w", err) } - nodeStatus, ok := OrchestratorToApiNodeStateMapper[nodeInfo.ServiceStatus] + nodeStatus, ok := OrchestratorToApiNodeStateMapper[nodeInfo.GetServiceStatus()] if !ok { - zap.L().Error("Unknown service info status", zap.String("status", nodeInfo.ServiceStatus.String()), logger.WithNodeID(nodeInfo.NodeId)) + zap.L().Error("Unknown service info status", zap.String("status", nodeInfo.GetServiceStatus().String()), logger.WithNodeID(nodeInfo.GetNodeId())) nodeStatus = api.NodeStatusUnhealthy } @@ -81,15 +81,15 @@ func New( go buildCache.Start() nodeMetadata := NodeMetadata{ - ServiceInstanceID: nodeInfo.ServiceId, - Commit: nodeInfo.ServiceCommit, - Version: nodeInfo.ServiceVersion, + ServiceInstanceID: nodeInfo.GetServiceId(), + Commit: nodeInfo.GetServiceCommit(), + Version: nodeInfo.GetServiceVersion(), } n := &Node{ NomadNodeShortID: discoveredNode.NomadNodeShortID, ClusterID: consts.LocalClusterID, - ID: nodeInfo.NodeId, + ID: nodeInfo.GetNodeId(), IPAddress: discoveredNode.IPAddress, client: client, diff --git a/packages/api/internal/orchestrator/nodemanager/sandboxes.go b/packages/api/internal/orchestrator/nodemanager/sandboxes.go index 6b5ff1d549..ff1e61f923 100644 --- a/packages/api/internal/orchestrator/nodemanager/sandboxes.go +++ b/packages/api/internal/orchestrator/nodemanager/sandboxes.go @@ -36,42 +36,42 @@ func (n *Node) GetSandboxes(ctx context.Context) ([]sandbox.Sandbox, error) { return nil, fmt.Errorf("sandbox config is nil when listing sandboxes: %#v", sbx) } - teamID, parseErr := uuid.Parse(config.TeamId) + teamID, parseErr := uuid.Parse(config.GetTeamId()) if parseErr != nil { - return nil, fmt.Errorf("failed to parse team ID '%s' for job: %w", config.TeamId, parseErr) + return nil, fmt.Errorf("failed to parse team ID '%s' for job: %w", config.GetTeamId(), parseErr) } - buildID, parseErr := uuid.Parse(config.BuildId) + buildID, parseErr := uuid.Parse(config.GetBuildId()) if parseErr != nil { - return nil, fmt.Errorf("failed to parse build ID '%s' for job: %w", config.BuildId, parseErr) + return nil, fmt.Errorf("failed to parse build ID '%s' for job: %w", config.GetBuildId(), parseErr) } sandboxesInfo = append( sandboxesInfo, sandbox.NewSandbox( - config.SandboxId, - config.TemplateId, + config.GetSandboxId(), + config.GetTemplateId(), consts.ClientID, - config.Alias, - config.ExecutionId, + config.Alias, //nolint:protogetter // we need the nil check too + config.GetExecutionId(), teamID, buildID, - config.Metadata, - time.Duration(config.MaxSandboxLength)*time.Hour, - sbx.StartTime.AsTime(), - sbx.EndTime.AsTime(), - config.Vcpu, - config.TotalDiskSizeMb, - config.RamMb, - config.KernelVersion, - config.FirecrackerVersion, - config.EnvdVersion, + config.GetMetadata(), + time.Duration(config.GetMaxSandboxLength())*time.Hour, + sbx.GetStartTime().AsTime(), + sbx.GetEndTime().AsTime(), + config.GetVcpu(), + config.GetTotalDiskSizeMb(), + config.GetRamMb(), + config.GetKernelVersion(), + config.GetFirecrackerVersion(), + config.GetEnvdVersion(), n.ID, n.ClusterID, - config.AutoPause, - config.EnvdAccessToken, - config.AllowInternetAccess, - config.BaseTemplateId, + config.GetAutoPause(), + config.EnvdAccessToken, //nolint:protogetter // we need the nil check too + config.AllowInternetAccess, //nolint:protogetter // we need the nil check too + config.GetBaseTemplateId(), ), ) } diff --git a/packages/api/internal/orchestrator/nodemanager/sync.go b/packages/api/internal/orchestrator/nodemanager/sync.go index 6cf15fb454..4c390ca942 100644 --- a/packages/api/internal/orchestrator/nodemanager/sync.go +++ b/packages/api/internal/orchestrator/nodemanager/sync.go @@ -25,18 +25,18 @@ func (n *Node) Sync(ctx context.Context, instanceCache *memory.Store) { } // update node status (if changed) - nodeStatus, ok := OrchestratorToApiNodeStateMapper[nodeInfo.ServiceStatus] + nodeStatus, ok := OrchestratorToApiNodeStateMapper[nodeInfo.GetServiceStatus()] if !ok { - zap.L().Error("Unknown service info status", zap.String("status", nodeInfo.ServiceStatus.String()), logger.WithNodeID(n.ID)) + zap.L().Error("Unknown service info status", zap.String("status", nodeInfo.GetServiceStatus().String()), logger.WithNodeID(n.ID)) nodeStatus = api.NodeStatusUnhealthy } n.setStatus(nodeStatus) n.setMetadata( NodeMetadata{ - ServiceInstanceID: nodeInfo.ServiceId, - Commit: nodeInfo.ServiceCommit, - Version: nodeInfo.ServiceVersion, + ServiceInstanceID: nodeInfo.GetServiceId(), + Commit: nodeInfo.GetServiceCommit(), + Version: nodeInfo.GetServiceVersion(), }, ) // Update host metrics from service info diff --git a/packages/api/internal/orchestrator/placement/placement.go b/packages/api/internal/orchestrator/placement/placement.go index 44aafdc564..4259ec864c 100644 --- a/packages/api/internal/orchestrator/placement/placement.go +++ b/packages/api/internal/orchestrator/placement/placement.go @@ -56,7 +56,7 @@ func PlaceSandbox(ctx context.Context, algorithm Algorithm, clusterNodes []*node return nil, fmt.Errorf("no nodes available") } - node, err = algorithm.chooseNode(ctx, clusterNodes, nodesExcluded, nodemanager.SandboxResources{CPUs: sbxRequest.Sandbox.Vcpu, MiBMemory: sbxRequest.Sandbox.RamMb}) + node, err = algorithm.chooseNode(ctx, clusterNodes, nodesExcluded, nodemanager.SandboxResources{CPUs: sbxRequest.GetSandbox().GetVcpu(), MiBMemory: sbxRequest.GetSandbox().GetRamMb()}) if err != nil { return nil, err } @@ -64,9 +64,9 @@ func PlaceSandbox(ctx context.Context, algorithm Algorithm, clusterNodes []*node telemetry.ReportEvent(ctx, "Placing sandbox on the node", telemetry.WithNodeID(node.ID)) } - node.PlacementMetrics.StartPlacing(sbxRequest.Sandbox.SandboxId, nodemanager.SandboxResources{ - CPUs: sbxRequest.Sandbox.Vcpu, - MiBMemory: sbxRequest.Sandbox.RamMb, + node.PlacementMetrics.StartPlacing(sbxRequest.GetSandbox().GetSandboxId(), nodemanager.SandboxResources{ + CPUs: sbxRequest.GetSandbox().GetVcpu(), + MiBMemory: sbxRequest.GetSandbox().GetRamMb(), }) ctx, span := tracer.Start(ctx, "create-sandbox") @@ -78,18 +78,18 @@ func PlaceSandbox(ctx context.Context, algorithm Algorithm, clusterNodes []*node span.End() if err != nil { if algorithm.excludeNode(err) { - zap.L().Warn("Excluding node", logger.WithSandboxID(sbxRequest.Sandbox.SandboxId), logger.WithNodeID(node.ID)) + zap.L().Warn("Excluding node", logger.WithSandboxID(sbxRequest.GetSandbox().GetSandboxId()), logger.WithNodeID(node.ID)) nodesExcluded[node.ID] = struct{}{} } st, ok := status.FromError(err) if !ok || st.Code() != codes.ResourceExhausted { - node.PlacementMetrics.Fail(sbxRequest.Sandbox.SandboxId) - zap.L().Error("Failed to create sandbox", logger.WithSandboxID(sbxRequest.Sandbox.SandboxId), logger.WithNodeID(node.ID), zap.Int("attempt", attempt+1), zap.Error(utils.UnwrapGRPCError(err))) + node.PlacementMetrics.Fail(sbxRequest.GetSandbox().GetSandboxId()) + zap.L().Error("Failed to create sandbox", logger.WithSandboxID(sbxRequest.GetSandbox().GetSandboxId()), logger.WithNodeID(node.ID), zap.Int("attempt", attempt+1), zap.Error(utils.UnwrapGRPCError(err))) attempt++ } else { - node.PlacementMetrics.Skip(sbxRequest.Sandbox.SandboxId) - zap.L().Warn("Node exhausted, trying another node", logger.WithSandboxID(sbxRequest.Sandbox.SandboxId), logger.WithNodeID(node.ID)) + node.PlacementMetrics.Skip(sbxRequest.GetSandbox().GetSandboxId()) + zap.L().Warn("Node exhausted, trying another node", logger.WithSandboxID(sbxRequest.GetSandbox().GetSandboxId()), logger.WithNodeID(node.ID)) } node = nil @@ -97,7 +97,7 @@ func PlaceSandbox(ctx context.Context, algorithm Algorithm, clusterNodes []*node continue } - node.PlacementMetrics.Success(sbxRequest.Sandbox.SandboxId) + node.PlacementMetrics.Success(sbxRequest.GetSandbox().GetSandboxId()) return node, nil } diff --git a/packages/api/internal/template-manager/template_status.go b/packages/api/internal/template-manager/template_status.go index e926bd14c9..b51f59bb7e 100644 --- a/packages/api/internal/template-manager/template_status.go +++ b/packages/api/internal/template-manager/template_status.go @@ -159,7 +159,7 @@ func (c *PollBuildStatus) setStatus(ctx context.Context) error { } // debug log the status - c.logger.Debug("setting status pointer", zap.String("status", status.Status.String())) + c.logger.Debug("setting status pointer", zap.String("status", status.GetStatus().String())) c.status = status return nil @@ -172,7 +172,7 @@ func (c *PollBuildStatus) dispatchBasedOnStatus(ctx context.Context, status *tem switch status.GetStatus() { case templatemanagergrpc.TemplateBuildState_Failed: // build failed - err := c.client.SetStatus(ctx, c.templateID, c.buildID, envbuild.StatusFailed, status.Reason) + err := c.client.SetStatus(ctx, c.templateID, c.buildID, envbuild.StatusFailed, status.GetReason()) if err != nil { return false, errors.Wrap(err, "error when setting build status") } @@ -184,13 +184,13 @@ func (c *PollBuildStatus) dispatchBasedOnStatus(ctx context.Context, status *tem return false, errors.New("nil metadata") } - err := c.client.SetFinished(ctx, c.templateID, c.buildID, int64(meta.RootfsSizeKey), meta.EnvdVersionKey) + err := c.client.SetFinished(ctx, c.templateID, c.buildID, int64(meta.GetRootfsSizeKey()), meta.GetEnvdVersionKey()) if err != nil { return false, errors.Wrap(err, "error when finishing build") } return true, nil default: - c.logger.Debug("skipping status", zap.String("status", status.Status.String())) + c.logger.Debug("skipping status", zap.String("status", status.GetStatus().String())) return false, nil } } @@ -210,7 +210,7 @@ func (c *PollBuildStatus) checkBuildStatus(ctx context.Context) (bool, error) { return false, err } - c.logger.Debug("dispatching based on status", zap.String("status", c.status.Status.String())) + c.logger.Debug("dispatching based on status", zap.String("status", c.status.GetStatus().String())) buildCompleted, err := c.dispatchBasedOnStatus(ctx, c.status) if err != nil { diff --git a/packages/client-proxy/internal/edge/pool/orchestrator.go b/packages/client-proxy/internal/edge/pool/orchestrator.go index 85aac59393..a69b5c98c8 100644 --- a/packages/client-proxy/internal/edge/pool/orchestrator.go +++ b/packages/client-proxy/internal/edge/pool/orchestrator.go @@ -89,19 +89,19 @@ func (o *OrchestratorInstance) sync(ctx context.Context) error { continue } - freshInfo.NodeID = status.NodeId - freshInfo.ServiceInstanceID = status.ServiceId - freshInfo.ServiceStartup = status.ServiceStartup.AsTime() - freshInfo.ServiceStatus = getMappedStatus(status.ServiceStatus) - freshInfo.ServiceVersion = status.ServiceVersion - freshInfo.ServiceVersionCommit = status.ServiceCommit - freshInfo.Roles = status.ServiceRoles + freshInfo.NodeID = status.GetNodeId() + freshInfo.ServiceInstanceID = status.GetServiceId() + freshInfo.ServiceStartup = status.GetServiceStartup().AsTime() + freshInfo.ServiceStatus = getMappedStatus(status.GetServiceStatus()) + freshInfo.ServiceVersion = status.GetServiceVersion() + freshInfo.ServiceVersionCommit = status.GetServiceCommit() + freshInfo.Roles = status.GetServiceRoles() o.setInfo(freshInfo) - o.MetricSandboxesRunning.Store(status.MetricSandboxesRunning) - o.MetricMemoryUsedBytes.Store(status.MetricMemoryUsedBytes) - o.MetricDiskUsedBytes.Store(status.MetricDiskAllocatedBytes) - o.MetricVCpuUsed.Store(status.MetricCpuCount) + o.MetricSandboxesRunning.Store(status.GetMetricSandboxesRunning()) + o.MetricMemoryUsedBytes.Store(status.GetMetricMemoryUsedBytes()) + o.MetricDiskUsedBytes.Store(status.GetMetricDiskAllocatedBytes()) + o.MetricVCpuUsed.Store(status.GetMetricCpuCount()) return nil } diff --git a/packages/envd/internal/services/filesystem/dir_test.go b/packages/envd/internal/services/filesystem/dir_test.go index 4d9a07fc1b..f48a380aa2 100644 --- a/packages/envd/internal/services/filesystem/dir_test.go +++ b/packages/envd/internal/services/filesystem/dir_test.go @@ -93,10 +93,10 @@ func TestListDir(t *testing.T) { resp, err := svc.ListDir(ctx, req) require.NoError(t, err) assert.NotEmpty(t, resp.Msg) - assert.Len(t, resp.Msg.Entries, len(tt.expectedPaths)) - actualPaths := make([]string, len(resp.Msg.Entries)) - for i, entry := range resp.Msg.Entries { - actualPaths[i] = entry.Path + assert.Len(t, resp.Msg.GetEntries(), len(tt.expectedPaths)) + actualPaths := make([]string, len(resp.Msg.GetEntries())) + for i, entry := range resp.Msg.GetEntries() { + actualPaths[i] = entry.GetPath() } assert.ElementsMatch(t, tt.expectedPaths, actualPaths) }) @@ -150,11 +150,11 @@ func TestListDirRelativePath(t *testing.T) { expectedPaths := []string{ filepath.Join(testFolderPath, "file.txt"), } - assert.Len(t, resp.Msg.Entries, len(expectedPaths)) + assert.Len(t, resp.Msg.GetEntries(), len(expectedPaths)) - actualPaths := make([]string, len(resp.Msg.Entries)) - for i, entry := range resp.Msg.Entries { - actualPaths[i] = entry.Path + actualPaths := make([]string, len(resp.Msg.GetEntries())) + for i, entry := range resp.Msg.GetEntries() { + actualPaths[i] = entry.GetPath() } assert.ElementsMatch(t, expectedPaths, actualPaths) } @@ -202,9 +202,9 @@ func TestListDir_Symlinks(t *testing.T) { expected := []string{ filepath.Join(linkToDir, "file.txt"), } - actual := make([]string, len(resp.Msg.Entries)) - for i, e := range resp.Msg.Entries { - actual[i] = e.Path + actual := make([]string, len(resp.Msg.GetEntries())) + for i, e := range resp.Msg.GetEntries() { + actual[i] = e.GetPath() } assert.ElementsMatch(t, expected, actual) }) @@ -253,9 +253,9 @@ func TestListDir_Symlinks(t *testing.T) { filepath.Join(symlinkRoot, "real-dir", "file.txt"), filepath.Join(symlinkRoot, "real-file.txt"), } - actual := make([]string, len(res.Msg.Entries)) - for i, e := range res.Msg.Entries { - actual[i] = e.Path + actual := make([]string, len(res.Msg.GetEntries())) + for i, e := range res.Msg.GetEntries() { + actual[i] = e.GetPath() } assert.ElementsMatch(t, expected, actual, "symlinks should not be resolved when listing the symlink root directory") }) @@ -384,7 +384,7 @@ func TestWalkDir_Depth(t *testing.T) { // Collect the names for easier assertions. names := make([]string, 0, len(entries)) for _, e := range entries { - names = append(names, e.Name) + names = append(names, e.GetName()) } require.Contains(t, names, "sub") diff --git a/packages/envd/internal/services/filesystem/move_test.go b/packages/envd/internal/services/filesystem/move_test.go index b1a166c752..ce9861cf81 100644 --- a/packages/envd/internal/services/filesystem/move_test.go +++ b/packages/envd/internal/services/filesystem/move_test.go @@ -53,7 +53,7 @@ func TestMove(t *testing.T) { // Verify the move was successful require.NoError(t, err) assert.NotNil(t, resp) - assert.Equal(t, destFile, resp.Msg.Entry.Path) + assert.Equal(t, destFile, resp.Msg.GetEntry().GetPath()) // Verify the file exists at the destination _, err = os.Stat(destFile) @@ -110,7 +110,7 @@ func TestMoveDirectory(t *testing.T) { // Verify the move was successful require.NoError(t, err) assert.NotNil(t, resp) - assert.Equal(t, destDir, resp.Msg.Entry.Path) + assert.Equal(t, destDir, resp.Msg.GetEntry().GetPath()) // Verify the directory exists at the destination _, err = os.Stat(destDir) @@ -212,7 +212,7 @@ func TestMoveRelativePath(t *testing.T) { // Verify the move was successful require.NoError(t, err) assert.NotNil(t, resp) - assert.Equal(t, destFile, resp.Msg.Entry.Path) + assert.Equal(t, destFile, resp.Msg.GetEntry().GetPath()) // Verify the file exists at the destination _, err = os.Stat(destFile) @@ -273,7 +273,7 @@ func TestMove_Symlinks(t *testing.T) { }) resp, err := svc.Move(ctx, req) require.NoError(t, err) - assert.Equal(t, destPath, resp.Msg.Entry.Path) + assert.Equal(t, destPath, resp.Msg.GetEntry().GetPath()) // Verify the symlink was moved _, err = os.Stat(destPath) @@ -307,7 +307,7 @@ func TestMove_Symlinks(t *testing.T) { }) resp, err := svc.Move(ctx, req) require.NoError(t, err) - assert.Equal(t, destPath, resp.Msg.Entry.Path) + assert.Equal(t, destPath, resp.Msg.GetEntry().GetPath()) // Verify the symlink was moved _, err = os.Stat(destPath) @@ -345,7 +345,7 @@ func TestMove_Symlinks(t *testing.T) { }) resp, err := svc.Move(ctx, req) require.NoError(t, err) - assert.Equal(t, destPath, resp.Msg.Entry.Path) + assert.Equal(t, destPath, resp.Msg.GetEntry().GetPath()) // Verify the real file was moved _, err = os.Stat(destPath) diff --git a/packages/envd/internal/services/filesystem/stat_test.go b/packages/envd/internal/services/filesystem/stat_test.go index f8aed6c68d..ac1f8ef110 100644 --- a/packages/envd/internal/services/filesystem/stat_test.go +++ b/packages/envd/internal/services/filesystem/stat_test.go @@ -76,17 +76,17 @@ func TestStat(t *testing.T) { resp, err := svc.Stat(ctx, req) require.NoError(t, err) require.NotEmpty(t, resp.Msg) - require.NotNil(t, resp.Msg.Entry) - assert.Equal(t, tt.path, resp.Msg.Entry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, resp.Msg.Entry.Type) - assert.Equal(t, u.Username, resp.Msg.Entry.Owner) - assert.Equal(t, group.Name, resp.Msg.Entry.Group) - assert.Equal(t, uint32(0o644), resp.Msg.Entry.Mode) + require.NotNil(t, resp.Msg.GetEntry()) + assert.Equal(t, tt.path, resp.Msg.GetEntry().GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, resp.Msg.GetEntry().GetType()) + assert.Equal(t, u.Username, resp.Msg.GetEntry().GetOwner()) + assert.Equal(t, group.Name, resp.Msg.GetEntry().GetGroup()) + assert.Equal(t, uint32(0o644), resp.Msg.GetEntry().GetMode()) if tt.path == linkedFile { - require.NotNil(t, resp.Msg.Entry.SymlinkTarget) - assert.Equal(t, testFile, *resp.Msg.Entry.SymlinkTarget) + require.NotNil(t, resp.Msg.GetEntry().GetSymlinkTarget()) + assert.Equal(t, testFile, resp.Msg.GetEntry().GetSymlinkTarget()) } else { - assert.Empty(t, resp.Msg.Entry.SymlinkTarget) + assert.Empty(t, resp.Msg.GetEntry().GetSymlinkTarget()) } }) } diff --git a/packages/envd/internal/services/filesystem/utils_test.go b/packages/envd/internal/services/filesystem/utils_test.go index d18dcda956..8eb38f7cae 100644 --- a/packages/envd/internal/services/filesystem/utils_test.go +++ b/packages/envd/internal/services/filesystem/utils_test.go @@ -81,19 +81,19 @@ func TestEntryInfoFromFileInfo(t *testing.T) { require.NoError(t, err) // Basic assertions - assert.Equal(t, "test.txt", result.Name) - assert.Equal(t, testFile, result.Path) - assert.Equal(t, int64(len(testContent)), result.Size) - assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.Type) - assert.Equal(t, uint32(0o644), result.Mode) - assert.Contains(t, result.Permissions, "-rw-r--r--") - assert.Equal(t, currentUser.Username, result.Owner) - assert.NotEmpty(t, result.Group) - assert.NotNil(t, result.ModifiedTime) - assert.Empty(t, result.SymlinkTarget) + assert.Equal(t, "test.txt", result.GetName()) + assert.Equal(t, testFile, result.GetPath()) + assert.Equal(t, int64(len(testContent)), result.GetSize()) + assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.GetType()) + assert.Equal(t, uint32(0o644), result.GetMode()) + assert.Contains(t, result.GetPermissions(), "-rw-r--r--") + assert.Equal(t, currentUser.Username, result.GetOwner()) + assert.NotEmpty(t, result.GetGroup()) + assert.NotNil(t, result.GetModifiedTime()) + assert.Empty(t, result.GetSymlinkTarget()) // Check that modified time is reasonable (within last minute) - modTime := result.ModifiedTime.AsTime() + modTime := result.GetModifiedTime().AsTime() assert.WithinDuration(t, time.Now(), modTime, time.Minute) } @@ -107,12 +107,12 @@ func TestEntryInfoFromFileInfo_Directory(t *testing.T) { result, err := entryInfo(testDir) require.NoError(t, err) - assert.Equal(t, "testdir", result.Name) - assert.Equal(t, testDir, result.Path) - assert.Equal(t, rpc.FileType_FILE_TYPE_DIRECTORY, result.Type) - assert.Equal(t, uint32(0o755), result.Mode) - assert.Contains(t, result.Permissions, "d") - assert.Empty(t, result.SymlinkTarget) + assert.Equal(t, "testdir", result.GetName()) + assert.Equal(t, testDir, result.GetPath()) + assert.Equal(t, rpc.FileType_FILE_TYPE_DIRECTORY, result.GetType()) + assert.Equal(t, uint32(0o755), result.GetMode()) + assert.Contains(t, result.GetPermissions(), "d") + assert.Empty(t, result.GetSymlinkTarget()) } func TestEntryInfoFromFileInfo_Symlink(t *testing.T) { @@ -134,15 +134,15 @@ func TestEntryInfoFromFileInfo_Symlink(t *testing.T) { result, err := entryInfo(symlinkPath) require.NoError(t, err) - assert.Equal(t, "symlink", result.Name) - assert.Equal(t, symlinkPath, result.Path) - assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.Type) // Should resolve to target type - assert.Contains(t, result.Permissions, "L") // Should show as symlink in permissions + assert.Equal(t, "symlink", result.GetName()) + assert.Equal(t, symlinkPath, result.GetPath()) + assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.GetType()) // Should resolve to target type + assert.Contains(t, result.GetPermissions(), "L") // Should show as symlink in permissions // Canonicalize the expected target path to handle macOS /var → /private/var symlink expectedTarget, err := filepath.EvalSymlinks(symlinkPath) require.NoError(t, err) - assert.Equal(t, &expectedTarget, result.SymlinkTarget) + assert.Equal(t, expectedTarget, result.GetSymlinkTarget()) } func TestEntryInfoFromFileInfo_BrokenSymlink(t *testing.T) { @@ -157,10 +157,10 @@ func TestEntryInfoFromFileInfo_BrokenSymlink(t *testing.T) { result, err := entryInfo(brokenSymlink) require.NoError(t, err) - assert.Equal(t, "broken", result.Name) - assert.Equal(t, brokenSymlink, result.Path) - assert.Equal(t, rpc.FileType_FILE_TYPE_UNSPECIFIED, result.Type) - assert.Contains(t, result.Permissions, "L") + assert.Equal(t, "broken", result.GetName()) + assert.Equal(t, brokenSymlink, result.GetPath()) + assert.Equal(t, rpc.FileType_FILE_TYPE_UNSPECIFIED, result.GetType()) + assert.Contains(t, result.GetPermissions(), "L") // SymlinkTarget might be empty if followSymlink fails } @@ -176,10 +176,10 @@ func TestEntryInfoFromFileInfo_CyclicSymlink(t *testing.T) { result, err := entryInfo(cyclicSymlink) require.NoError(t, err) - assert.Equal(t, "cyclic", result.Name) - assert.Equal(t, cyclicSymlink, result.Path) - assert.Equal(t, rpc.FileType_FILE_TYPE_UNSPECIFIED, result.Type) - assert.Contains(t, result.Permissions, "L") + assert.Equal(t, "cyclic", result.GetName()) + assert.Equal(t, cyclicSymlink, result.GetPath()) + assert.Equal(t, rpc.FileType_FILE_TYPE_UNSPECIFIED, result.GetType()) + assert.Contains(t, result.GetPermissions(), "L") } func TestEntryInfoFromFileInfo_EmptyFile(t *testing.T) { @@ -192,10 +192,10 @@ func TestEntryInfoFromFileInfo_EmptyFile(t *testing.T) { result, err := entryInfo(emptyFile) require.NoError(t, err) - assert.Equal(t, "empty.txt", result.Name) - assert.Equal(t, int64(0), result.Size) - assert.Equal(t, uint32(0o600), result.Mode) - assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.Type) + assert.Equal(t, "empty.txt", result.GetName()) + assert.Equal(t, int64(0), result.GetSize()) + assert.Equal(t, uint32(0o600), result.GetMode()) + assert.Equal(t, rpc.FileType_FILE_TYPE_FILE, result.GetType()) } func TestEntryInfoFromFileInfo_DifferentPermissions(t *testing.T) { @@ -223,7 +223,7 @@ func TestEntryInfoFromFileInfo_DifferentPermissions(t *testing.T) { result, err := entryInfo(testFile) require.NoError(t, err) - assert.Equal(t, tc.expected, result.Mode) + assert.Equal(t, tc.expected, result.GetMode()) }) } } @@ -249,13 +249,13 @@ func TestEntryInfoFromFileInfo_SymlinkChain(t *testing.T) { result, err := entryInfo(link1) require.NoError(t, err) - assert.Equal(t, "link1", result.Name) - assert.Equal(t, link1, result.Path) - assert.Equal(t, rpc.FileType_FILE_TYPE_DIRECTORY, result.Type) // Should resolve to final target type - assert.Contains(t, result.Permissions, "L") + assert.Equal(t, "link1", result.GetName()) + assert.Equal(t, link1, result.GetPath()) + assert.Equal(t, rpc.FileType_FILE_TYPE_DIRECTORY, result.GetType()) // Should resolve to final target type + assert.Contains(t, result.GetPermissions(), "L") // Canonicalize the expected target path to handle macOS symlink indirections expectedTarget, err := filepath.EvalSymlinks(link1) require.NoError(t, err) - assert.Equal(t, &expectedTarget, result.SymlinkTarget) + assert.Equal(t, expectedTarget, result.GetSymlinkTarget()) } diff --git a/packages/envd/internal/services/filesystem/watch.go b/packages/envd/internal/services/filesystem/watch.go index a578706f97..1b19635c65 100644 --- a/packages/envd/internal/services/filesystem/watch.go +++ b/packages/envd/internal/services/filesystem/watch.go @@ -49,7 +49,7 @@ func (s Service) watchHandler(ctx context.Context, req *connect.Request[rpc.Watc } defer w.Close() - err = w.Add(utils.FsnotifyPath(watchPath, req.Msg.Recursive)) + err = w.Add(utils.FsnotifyPath(watchPath, req.Msg.GetRecursive())) if err != nil { return connect.NewError(connect.CodeInternal, fmt.Errorf("error adding path %s to watcher: %w", watchPath, err)) } diff --git a/packages/envd/internal/services/filesystem/watch_sync.go b/packages/envd/internal/services/filesystem/watch_sync.go index 2c7334f45e..03b9e06937 100644 --- a/packages/envd/internal/services/filesystem/watch_sync.go +++ b/packages/envd/internal/services/filesystem/watch_sync.go @@ -161,7 +161,7 @@ func (s Service) CreateWatcher(ctx context.Context, req *connect.Request[rpc.Cre watcherId := "w" + id.Generate() - w, err := CreateFileWatcher(ctx, watchPath, req.Msg.Recursive, watcherId, s.logger) + w, err := CreateFileWatcher(ctx, watchPath, req.Msg.GetRecursive(), watcherId, s.logger) if err != nil { return nil, err } diff --git a/packages/envd/internal/services/legacy/conversion.go b/packages/envd/internal/services/legacy/conversion.go index b0afe1b1b4..0118fed419 100644 --- a/packages/envd/internal/services/legacy/conversion.go +++ b/packages/envd/internal/services/legacy/conversion.go @@ -18,9 +18,9 @@ func convertEntryInfo(info *filesystem.EntryInfo) *EntryInfo { } return &EntryInfo{ - Name: info.Name, - Type: FileType(info.Type), - Path: info.Path, + Name: info.GetName(), + Type: FileType(info.GetType()), + Path: info.GetPath(), } } @@ -54,13 +54,13 @@ func addConverter[TIn, TOut any](fn func(TIn) TOut) { func init() { addConverter(func(in *filesystem.MoveResponse) MoveResponse { return MoveResponse{ - Entry: convertEntryInfo(in.Entry), + Entry: convertEntryInfo(in.GetEntry()), } }) addConverter(func(in *filesystem.ListDirResponse) ListDirResponse { var old []*EntryInfo - for _, item := range in.Entries { + for _, item := range in.GetEntries() { old = append(old, convertEntryInfo(item)) } @@ -71,7 +71,7 @@ func init() { addConverter(func(in *filesystem.MakeDirResponse) MakeDirResponse { return MakeDirResponse{ - Entry: convertEntryInfo(in.Entry), + Entry: convertEntryInfo(in.GetEntry()), } }) @@ -81,14 +81,14 @@ func init() { addConverter(func(in *filesystem.StatResponse) StatResponse { return StatResponse{ - Entry: convertEntryInfo(in.Entry), + Entry: convertEntryInfo(in.GetEntry()), } }) addConverter(func(in *filesystem.WatchDirResponse) WatchDirResponse { var event isWatchDirResponse_Event - switch e := in.Event.(type) { + switch e := in.GetEvent().(type) { case *filesystem.WatchDirResponse_Start: event = &WatchDirResponse_Start{ Start: convertStartEvent(e.Start), @@ -110,14 +110,14 @@ func init() { addConverter(func(in *filesystem.CreateWatcherResponse) CreateWatcherResponse { return CreateWatcherResponse{ - WatcherId: in.WatcherId, + WatcherId: in.GetWatcherId(), } }) addConverter(func(in *filesystem.GetWatcherEventsResponse) GetWatcherEventsResponse { var events []*FilesystemEvent - for _, item := range in.Events { + for _, item := range in.GetEvents() { events = append(events, convertFilesystemEvent(item)) } @@ -189,8 +189,8 @@ func convertFilesystemEvent(e *filesystem.FilesystemEvent) *FilesystemEvent { return nil } return &FilesystemEvent{ - Name: e.Name, - Type: EventType(e.Type), + Name: e.GetName(), + Type: EventType(e.GetType()), } } diff --git a/packages/envd/internal/services/process/handler/handler.go b/packages/envd/internal/services/process/handler/handler.go index 22d73f8bff..483876855b 100644 --- a/packages/envd/internal/services/process/handler/handler.go +++ b/packages/envd/internal/services/process/handler/handler.go @@ -143,11 +143,11 @@ func New( // The pty should ideally start only in the Start method, but the package does not support that and we would have to code it manually. // The output of the pty should correctly be passed though. tty, err := pty.StartWithSize(cmd, &pty.Winsize{ - Cols: uint16(req.GetPty().GetSize().Cols), - Rows: uint16(req.GetPty().GetSize().Rows), + Cols: uint16(req.GetPty().GetSize().GetCols()), + Rows: uint16(req.GetPty().GetSize().GetRows()), }) if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("error starting pty with command '%s' in dir '%s' with '%d' cols and '%d' rows: %w", cmd, cmd.Dir, req.GetPty().GetSize().Cols, req.GetPty().GetSize().Rows, err)) + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("error starting pty with command '%s' in dir '%s' with '%d' cols and '%d' rows: %w", cmd, cmd.Dir, req.GetPty().GetSize().GetCols(), req.GetPty().GetSize().GetRows(), err)) } outWg.Add(1) @@ -273,7 +273,7 @@ func New( // For backwards compatibility we still set the stdin if not explicitly disabled // If stdin is disabled, the process will use /dev/null as stdin - if req.Stdin == nil || *req.Stdin == true { + if req.Stdin == nil || req.GetStdin() == true { stdin, err := cmd.StdinPipe() if err != nil { return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("error creating stdin pipe for command '%s': %w", cmd, err)) diff --git a/packages/envd/internal/services/process/input.go b/packages/envd/internal/services/process/input.go index e2a08268ee..0b5ea40e34 100644 --- a/packages/envd/internal/services/process/input.go +++ b/packages/envd/internal/services/process/input.go @@ -33,7 +33,7 @@ func handleInput(ctx context.Context, process *handler.Handler, in *rpc.ProcessI Msg("Streaming input to process") default: - return connect.NewError(connect.CodeUnimplemented, fmt.Errorf("invalid input type %T", in.Input)) + return connect.NewError(connect.CodeUnimplemented, fmt.Errorf("invalid input type %T", in.GetInput())) } return nil @@ -79,7 +79,7 @@ func (s *Service) streamInputHandler(ctx context.Context, stream *connect.Client case *rpc.StreamInputRequest_Keepalive: break default: - return nil, connect.NewError(connect.CodeUnimplemented, fmt.Errorf("invalid event type %T", req.Event)) + return nil, connect.NewError(connect.CodeUnimplemented, fmt.Errorf("invalid event type %T", req.GetEvent())) } } diff --git a/packages/envd/internal/services/process/signal.go b/packages/envd/internal/services/process/signal.go index 7b1583a1fe..59e4466839 100644 --- a/packages/envd/internal/services/process/signal.go +++ b/packages/envd/internal/services/process/signal.go @@ -11,7 +11,7 @@ import ( ) func (s *Service) SendSignal(ctx context.Context, req *connect.Request[rpc.SendSignalRequest]) (*connect.Response[rpc.SendSignalResponse], error) { - handler, err := s.getProcess(req.Msg.Process) + handler, err := s.getProcess(req.Msg.GetProcess()) if err != nil { return nil, err } diff --git a/packages/envd/internal/services/process/update.go b/packages/envd/internal/services/process/update.go index 5337375487..a81698cf14 100644 --- a/packages/envd/internal/services/process/update.go +++ b/packages/envd/internal/services/process/update.go @@ -11,7 +11,7 @@ import ( ) func (s *Service) Update(ctx context.Context, req *connect.Request[rpc.UpdateRequest]) (*connect.Response[rpc.UpdateResponse], error) { - proc, err := s.getProcess(req.Msg.Process) + proc, err := s.getProcess(req.Msg.GetProcess()) if err != nil { return nil, err } diff --git a/packages/orchestrator/internal/server/sandboxes.go b/packages/orchestrator/internal/server/sandboxes.go index 7287a4a8ea..e9030607b7 100644 --- a/packages/orchestrator/internal/server/sandboxes.go +++ b/packages/orchestrator/internal/server/sandboxes.go @@ -46,23 +46,23 @@ func (s *server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ defer childSpan.End() childSpan.SetAttributes( - telemetry.WithTemplateID(req.Sandbox.TemplateId), - attribute.String("kernel.version", req.Sandbox.KernelVersion), - telemetry.WithSandboxID(req.Sandbox.SandboxId), + telemetry.WithTemplateID(req.GetSandbox().GetTemplateId()), + attribute.String("kernel.version", req.GetSandbox().GetKernelVersion()), + telemetry.WithSandboxID(req.GetSandbox().GetSandboxId()), attribute.String("client.id", s.info.ClientId), - attribute.String("envd.version", req.Sandbox.EnvdVersion), + attribute.String("envd.version", req.GetSandbox().GetEnvdVersion()), ) // setup launch darkly ctx = featureflags.SetContext( ctx, - ldcontext.NewBuilder(req.Sandbox.SandboxId). + ldcontext.NewBuilder(req.GetSandbox().GetSandboxId()). Kind(featureflags.SandboxKind). - SetString(featureflags.SandboxTemplateAttribute, req.Sandbox.TemplateId). - SetString(featureflags.SandboxKernelVersionAttribute, req.Sandbox.KernelVersion). - SetString(featureflags.SandboxFirecrackerVersionAttribute, req.Sandbox.FirecrackerVersion). + SetString(featureflags.SandboxTemplateAttribute, req.GetSandbox().GetTemplateId()). + SetString(featureflags.SandboxKernelVersionAttribute, req.GetSandbox().GetKernelVersion()). + SetString(featureflags.SandboxFirecrackerVersionAttribute, req.GetSandbox().GetFirecrackerVersion()). Build(), - ldcontext.NewBuilder(req.Sandbox.TeamId). + ldcontext.NewBuilder(req.GetSandbox().GetTeamId()). Kind(featureflags.TeamKind). Build(), ) @@ -103,31 +103,31 @@ func (s *server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ ctx, template, sandbox.Config{ - BaseTemplateID: req.Sandbox.BaseTemplateId, + BaseTemplateID: req.GetSandbox().GetBaseTemplateId(), - Vcpu: req.Sandbox.Vcpu, - RamMB: req.Sandbox.RamMb, - TotalDiskSizeMB: req.Sandbox.TotalDiskSizeMb, - HugePages: req.Sandbox.HugePages, + Vcpu: req.GetSandbox().GetVcpu(), + RamMB: req.GetSandbox().GetRamMb(), + TotalDiskSizeMB: req.GetSandbox().GetTotalDiskSizeMb(), + HugePages: req.GetSandbox().GetHugePages(), - AllowInternetAccess: req.Sandbox.AllowInternetAccess, + AllowInternetAccess: req.GetSandbox().AllowInternetAccess, Envd: sandbox.EnvdMetadata{ - Version: req.Sandbox.EnvdVersion, - AccessToken: req.Sandbox.EnvdAccessToken, - Vars: req.Sandbox.EnvVars, + Version: req.GetSandbox().GetEnvdVersion(), + AccessToken: req.GetSandbox().EnvdAccessToken, + Vars: req.GetSandbox().GetEnvVars(), }, }, sandbox.RuntimeMetadata{ - TemplateID: req.Sandbox.TemplateId, - SandboxID: req.Sandbox.SandboxId, - ExecutionID: req.Sandbox.ExecutionId, - TeamID: req.Sandbox.TeamId, + TemplateID: req.GetSandbox().GetTemplateId(), + SandboxID: req.GetSandbox().GetSandboxId(), + ExecutionID: req.GetSandbox().GetExecutionId(), + TeamID: req.GetSandbox().GetTeamId(), }, childSpan.SpanContext().TraceID().String(), - req.StartTime.AsTime(), - req.EndTime.AsTime(), - req.Sandbox, + req.GetStartTime().AsTime(), + req.GetEndTime().AsTime(), + req.GetSandbox(), ) if err != nil { err := errors.Join(err, context.Cause(ctx)) @@ -135,7 +135,7 @@ func (s *server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ return nil, status.Errorf(codes.Internal, "failed to create sandbox: %s", err) } - s.sandboxes.Insert(req.Sandbox.SandboxId, sbx) + s.sandboxes.Insert(req.GetSandbox().GetSandboxId(), sbx) go func() { ctx, childSpan := tracer.Start(context.WithoutCancel(ctx), "sandbox-create-stop", trace.WithNewRoot()) defer childSpan.End() @@ -153,7 +153,7 @@ func (s *server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ // Remove the sandbox from cache only if the cleanup IDs match. // This prevents us from accidentally removing started sandbox (via resume) from the cache if cleanup is taking longer than the request timeout. // This could have caused the "invisible" sandboxes that are not in orchestrator or API, but are still on client. - s.sandboxes.RemoveCb(req.Sandbox.SandboxId, func(_ string, v *sandbox.Sandbox, exists bool) bool { + s.sandboxes.RemoveCb(req.GetSandbox().GetSandboxId(), func(_ string, v *sandbox.Sandbox, exists bool) bool { if !exists { return false } @@ -172,7 +172,7 @@ func (s *server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ }() label := clickhouse.SandboxEventLabelCreate - if req.Sandbox.Snapshot { + if req.GetSandbox().GetSnapshot() { label = clickhouse.SandboxEventLabelResume } @@ -200,21 +200,21 @@ func (s *server) Update(ctx context.Context, req *orchestrator.SandboxUpdateRequ defer childSpan.End() childSpan.SetAttributes( - telemetry.WithSandboxID(req.SandboxId), + telemetry.WithSandboxID(req.GetSandboxId()), attribute.String("client.id", s.info.ClientId), ) - sbx, ok := s.sandboxes.Get(req.SandboxId) + sbx, ok := s.sandboxes.Get(req.GetSandboxId()) if !ok { telemetry.ReportCriticalError(ctx, "sandbox not found", nil) return nil, status.Error(codes.NotFound, "sandbox not found") } - sbx.EndAt = req.EndTime.AsTime() + sbx.EndAt = req.GetEndTime().AsTime() teamID, buildId, eventData := s.prepareSandboxEventData(sbx) - eventData["set_timeout"] = req.EndTime.AsTime().Format(time.RFC3339) + eventData["set_timeout"] = req.GetEndTime().AsTime().Format(time.RFC3339) go s.sbxEventsService.HandleEvent(context.WithoutCancel(ctx), event.SandboxEvent{ Timestamp: time.Now().UTC(), @@ -269,15 +269,15 @@ func (s *server) Delete(ctxConn context.Context, in *orchestrator.SandboxDeleteR defer childSpan.End() childSpan.SetAttributes( - telemetry.WithSandboxID(in.SandboxId), + telemetry.WithSandboxID(in.GetSandboxId()), attribute.String("client.id", s.info.ClientId), ) - sbx, ok := s.sandboxes.Get(in.SandboxId) + sbx, ok := s.sandboxes.Get(in.GetSandboxId()) if !ok { - telemetry.ReportCriticalError(ctx, "sandbox not found", nil, telemetry.WithSandboxID(in.SandboxId)) + telemetry.ReportCriticalError(ctx, "sandbox not found", nil, telemetry.WithSandboxID(in.GetSandboxId())) - return nil, status.Errorf(codes.NotFound, "sandbox '%s' not found", in.SandboxId) + return nil, status.Errorf(codes.NotFound, "sandbox '%s' not found", in.GetSandboxId()) } // Remove the sandbox from the cache to prevent loading it again in API during the time the instance is stopping. @@ -285,7 +285,7 @@ func (s *server) Delete(ctxConn context.Context, in *orchestrator.SandboxDeleteR // Ensure the sandbox is removed from cache. // Ideally we would rely only on the goroutine defer. // Don't allow connecting to the sandbox anymore. - s.sandboxes.Remove(in.SandboxId) + s.sandboxes.Remove(in.GetSandboxId()) // Check health metrics before stopping the sandbox sbx.Checks.Healthcheck(ctx, true) @@ -295,7 +295,7 @@ func (s *server) Delete(ctxConn context.Context, in *orchestrator.SandboxDeleteR go func() { err := sbx.Stop(context.WithoutCancel(ctx)) if err != nil { - sbxlogger.I(sbx).Error("error stopping sandbox", logger.WithSandboxID(in.SandboxId), zap.Error(err)) + sbxlogger.I(sbx).Error("error stopping sandbox", logger.WithSandboxID(in.GetSandboxId()), zap.Error(err)) } }() @@ -323,15 +323,15 @@ func (s *server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest // setup launch darkly ctx = featureflags.SetContext( ctx, - ldcontext.NewBuilder(in.SandboxId). + ldcontext.NewBuilder(in.GetSandboxId()). Kind(featureflags.SandboxKind). - SetString(featureflags.SandboxTemplateAttribute, in.TemplateId). + SetString(featureflags.SandboxTemplateAttribute, in.GetTemplateId()). Build(), ) s.pauseMu.Lock() - sbx, ok := s.sandboxes.Get(in.SandboxId) + sbx, ok := s.sandboxes.Get(in.GetSandboxId()) if !ok { s.pauseMu.Unlock() @@ -340,7 +340,7 @@ func (s *server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest return nil, status.Error(codes.NotFound, "sandbox not found") } - s.sandboxes.Remove(in.SandboxId) + s.sandboxes.Remove(in.GetSandboxId()) s.pauseMu.Unlock() @@ -353,7 +353,7 @@ func (s *server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest err := sbx.Stop(ctx) if err != nil { - sbxlogger.I(sbx).Error("error stopping sandbox after snapshot", logger.WithSandboxID(in.SandboxId), zap.Error(err)) + sbxlogger.I(sbx).Error("error stopping sandbox after snapshot", logger.WithSandboxID(in.GetSandboxId()), zap.Error(err)) } }() }(context.WithoutCancel(ctx)) @@ -365,15 +365,15 @@ func (s *server) Pause(ctx context.Context, in *orchestrator.SandboxPauseRequest fcVersions := sbx.FirecrackerVersions() meta = meta.SameVersionTemplate(storage.TemplateFiles{ - BuildID: in.BuildId, + BuildID: in.GetBuildId(), KernelVersion: fcVersions.KernelVersion, FirecrackerVersion: fcVersions.FirecrackerVersion, }) snapshot, err := sbx.Pause(ctx, meta) if err != nil { - telemetry.ReportCriticalError(ctx, "error snapshotting sandbox", err, telemetry.WithSandboxID(in.SandboxId)) + telemetry.ReportCriticalError(ctx, "error snapshotting sandbox", err, telemetry.WithSandboxID(in.GetSandboxId())) - return nil, status.Errorf(codes.Internal, "error snapshotting sandbox '%s': %s", in.SandboxId, err) + return nil, status.Errorf(codes.Internal, "error snapshotting sandbox '%s': %s", in.GetSandboxId(), err) } err = s.templateCache.AddSnapshot( @@ -432,10 +432,10 @@ func (s *server) prepareSandboxEventData(sbx *sandbox.Sandbox) (uuid.UUID, strin buildId := "" eventData := make(map[string]any) if sbx.APIStoredConfig != nil { - buildId = sbx.APIStoredConfig.BuildId + buildId = sbx.APIStoredConfig.GetBuildId() if sbx.APIStoredConfig.Metadata != nil { // Copy the map to avoid race conditions - eventData["sandbox_metadata"] = utils.ShallowCopyMap(sbx.APIStoredConfig.Metadata) + eventData["sandbox_metadata"] = utils.ShallowCopyMap(sbx.APIStoredConfig.GetMetadata()) } } diff --git a/packages/orchestrator/internal/service/service_info.go b/packages/orchestrator/internal/service/service_info.go index fd9d6e2df8..82cac525de 100644 --- a/packages/orchestrator/internal/service/service_info.go +++ b/packages/orchestrator/internal/service/service_info.go @@ -115,7 +115,7 @@ func convertDiskMetrics(disks []metrics.DiskInfo) []*orchestratorinfo.DiskMetric } func (s *Server) ServiceStatusOverride(_ context.Context, req *orchestratorinfo.ServiceStatusChangeRequest) (*emptypb.Empty, error) { - zap.L().Info("service status override request received", zap.String("status", req.ServiceStatus.String())) - s.info.SetStatus(req.ServiceStatus) + zap.L().Info("service status override request received", zap.String("status", req.GetServiceStatus().String())) + s.info.SetStatus(req.GetServiceStatus()) return &emptypb.Empty{}, nil } diff --git a/packages/orchestrator/internal/template/build/builder.go b/packages/orchestrator/internal/template/build/builder.go index 9241d862ef..12c22e8315 100644 --- a/packages/orchestrator/internal/template/build/builder.go +++ b/packages/orchestrator/internal/template/build/builder.go @@ -284,7 +284,7 @@ func forceSteps(template config.TemplateConfig) config.TemplateConfig { shouldRebuild := template.Force != nil && *template.Force for _, step := range template.Steps { // Force rebuild if the step has a Force flag set to true - if step.Force != nil && *step.Force { + if step.Force != nil && step.GetForce() { shouldRebuild = true } diff --git a/packages/orchestrator/internal/template/build/commands/copy.go b/packages/orchestrator/internal/template/build/commands/copy.go index e9180b9102..43038b7b7e 100644 --- a/packages/orchestrator/internal/template/build/commands/copy.go +++ b/packages/orchestrator/internal/template/build/commands/copy.go @@ -94,19 +94,19 @@ func (c *Copy) Execute( step *templatemanager.TemplateStep, cmdMetadata metadata.Context, ) (metadata.Context, error) { - cmdType := strings.ToUpper(step.Type) - args := step.Args + cmdType := strings.ToUpper(step.GetType()) + args := step.GetArgs() // args: [localPath containerPath optional_owner optional_permissions] if len(args) < 2 { return metadata.Context{}, fmt.Errorf("%s requires a local path and a container path argument", cmdType) } - if step.FilesHash == nil || *step.FilesHash == "" { + if step.FilesHash == nil || step.GetFilesHash() == "" { return metadata.Context{}, fmt.Errorf("%s requires files hash to be set", cmdType) } // 1) Download the layer tar file from the storage to the local filesystem - obj, err := c.FilesStorage.OpenObject(ctx, paths.GetLayerFilesCachePath(c.CacheScope, *step.FilesHash)) + obj, err := c.FilesStorage.OpenObject(ctx, paths.GetLayerFilesCachePath(c.CacheScope, step.GetFilesHash())) if err != nil { return metadata.Context{}, fmt.Errorf("failed to open files object from storage: %w", err) } @@ -134,14 +134,14 @@ func (c *Copy) Execute( // The file is automatically cleaned up by the sandbox restart in the last step. // This is happening because the /tmp is mounted as a tmpfs and deleted on restart. - sbxTargetPath := filepath.Join("/tmp", fmt.Sprintf("%s.tar", *step.FilesHash)) + sbxTargetPath := filepath.Join("/tmp", fmt.Sprintf("%s.tar", step.GetFilesHash())) // 2) Copy the tar file to the sandbox err = sandboxtools.CopyFile(ctx, proxy, sandboxID, cmdMetadata.User, tmpFile.Name(), sbxTargetPath) if err != nil { return metadata.Context{}, fmt.Errorf("failed to copy layer tar data to sandbox: %w", err) } - sbxUnpackPath := filepath.Join("/tmp", *step.FilesHash) + sbxUnpackPath := filepath.Join("/tmp", step.GetFilesHash()) // 3) Extract the tar file in the sandbox's /tmp directory err = sandboxtools.RunCommand( diff --git a/packages/orchestrator/internal/template/build/commands/env.go b/packages/orchestrator/internal/template/build/commands/env.go index 300d04538b..e4d85a0a21 100644 --- a/packages/orchestrator/internal/template/build/commands/env.go +++ b/packages/orchestrator/internal/template/build/commands/env.go @@ -27,8 +27,8 @@ func (e *Env) Execute( step *templatemanager.TemplateStep, cmdMetadata metadata.Context, ) (metadata.Context, error) { - cmdType := strings.ToUpper(step.Type) - args := step.Args + cmdType := strings.ToUpper(step.GetType()) + args := step.GetArgs() // args: [key1 value1 key2 value2 ...] if len(args) == 0 { return metadata.Context{}, fmt.Errorf("%s does not support passing no arguments", cmdType) diff --git a/packages/orchestrator/internal/template/build/commands/executor.go b/packages/orchestrator/internal/template/build/commands/executor.go index e73820dee7..8a47a7d67d 100644 --- a/packages/orchestrator/internal/template/build/commands/executor.go +++ b/packages/orchestrator/internal/template/build/commands/executor.go @@ -44,7 +44,7 @@ func NewCommandExecutor( func (ce *CommandExecutor) getCommand( step *templatemanager.TemplateStep, ) (Command, error) { - cmdType := strings.ToUpper(step.Type) + cmdType := strings.ToUpper(step.GetType()) var cmd Command switch cmdType { @@ -81,15 +81,15 @@ func (ce *CommandExecutor) Execute( ctx, span := tracer.Start(ctx, "apply-command", trace.WithAttributes( attribute.String("prefix", prefix), attribute.String("sandbox.id", sbx.Runtime.SandboxID), - attribute.String("step.type", step.Type), - attribute.StringSlice("step.args", step.Args), - attribute.String("step.files.hash", utils.Sprintp(step.FilesHash)), + attribute.String("step.type", step.GetType()), + attribute.StringSlice("step.args", step.GetArgs()), + attribute.String("step.files.hash", utils.Sprintp(step.FilesHash)), //nolint:protogetter // we need the nil check too )) defer span.End() cmd, err := ce.getCommand(step) if err != nil { - return metadata.Context{}, fmt.Errorf("failed to get command for step %s: %w", step.Type, err) + return metadata.Context{}, fmt.Errorf("failed to get command for step %s: %w", step.GetType(), err) } cmdMetadata, err = cmd.Execute( diff --git a/packages/orchestrator/internal/template/build/commands/run.go b/packages/orchestrator/internal/template/build/commands/run.go index 86a17576b7..af1291f8a7 100644 --- a/packages/orchestrator/internal/template/build/commands/run.go +++ b/packages/orchestrator/internal/template/build/commands/run.go @@ -26,7 +26,7 @@ func (r *Run) Execute( step *templatemanager.TemplateStep, cmdMetadata metadata.Context, ) (metadata.Context, error) { - args := step.Args + args := step.GetArgs() // args: [command optional_user] if len(args) < 1 { return metadata.Context{}, fmt.Errorf("RUN requires command argument") diff --git a/packages/orchestrator/internal/template/build/commands/user.go b/packages/orchestrator/internal/template/build/commands/user.go index d51e89cc47..e1acb518ce 100644 --- a/packages/orchestrator/internal/template/build/commands/user.go +++ b/packages/orchestrator/internal/template/build/commands/user.go @@ -26,7 +26,7 @@ func (u *User) Execute( step *templatemanager.TemplateStep, cmdMetadata metadata.Context, ) (metadata.Context, error) { - args := step.Args + args := step.GetArgs() // args: [username] if len(args) < 1 { return metadata.Context{}, fmt.Errorf("USER requires a username argument") diff --git a/packages/orchestrator/internal/template/build/commands/workdir.go b/packages/orchestrator/internal/template/build/commands/workdir.go index ecd342a533..73c4052f1f 100644 --- a/packages/orchestrator/internal/template/build/commands/workdir.go +++ b/packages/orchestrator/internal/template/build/commands/workdir.go @@ -26,7 +26,7 @@ func (w *Workdir) Execute( step *templatemanager.TemplateStep, cmdMetadata metadata.Context, ) (metadata.Context, error) { - args := step.Args + args := step.GetArgs() // args: [path] if len(args) < 1 { return metadata.Context{}, fmt.Errorf("WORKDIR requires a path argument") diff --git a/packages/orchestrator/internal/template/build/core/oci/auth/auth.go b/packages/orchestrator/internal/template/build/core/oci/auth/auth.go index 731a5a2d84..d49c6ec877 100644 --- a/packages/orchestrator/internal/template/build/core/oci/auth/auth.go +++ b/packages/orchestrator/internal/template/build/core/oci/auth/auth.go @@ -20,7 +20,7 @@ func NewAuthProvider(registry *templatemanager.FromImageRegistry) RegistryAuthPr return nil } - switch auth := registry.Type.(type) { + switch auth := registry.GetType().(type) { case *templatemanager.FromImageRegistry_Aws: return NewAWSAuthProvider(auth.Aws) case *templatemanager.FromImageRegistry_Gcp: diff --git a/packages/orchestrator/internal/template/build/core/oci/auth/aws.go b/packages/orchestrator/internal/template/build/core/oci/auth/aws.go index 29b7af2b92..f939b69729 100644 --- a/packages/orchestrator/internal/template/build/core/oci/auth/aws.go +++ b/packages/orchestrator/internal/template/build/core/oci/auth/aws.go @@ -31,10 +31,10 @@ func NewAWSAuthProvider(registry *templatemanager.AWSRegistry) *AWSAuthProvider func (p *AWSAuthProvider) GetAuthOption(ctx context.Context) (remote.Option, error) { // Load AWS configuration with the provided credentials cfg, err := config.LoadDefaultConfig(ctx, - config.WithRegion(p.registry.AwsRegion), + config.WithRegion(p.registry.GetAwsRegion()), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider( - p.registry.AwsAccessKeyId, - p.registry.AwsSecretAccessKey, + p.registry.GetAwsAccessKeyId(), + p.registry.GetAwsSecretAccessKey(), "", )), ) diff --git a/packages/orchestrator/internal/template/build/core/oci/auth/gcp.go b/packages/orchestrator/internal/template/build/core/oci/auth/gcp.go index 8965cd5af9..b0a8877979 100644 --- a/packages/orchestrator/internal/template/build/core/oci/auth/gcp.go +++ b/packages/orchestrator/internal/template/build/core/oci/auth/gcp.go @@ -24,6 +24,6 @@ func NewGCPAuthProvider(registry *templatemanager.GCPRegistry) *GCPAuthProvider // GetAuthOption returns the authentication option for GCP func (p *GCPAuthProvider) GetAuthOption(ctx context.Context) (remote.Option, error) { // Create authenticator using the service account JSON - authenticator := google.NewJSONKeyAuthenticator(p.registry.ServiceAccountJson) + authenticator := google.NewJSONKeyAuthenticator(p.registry.GetServiceAccountJson()) return remote.WithAuth(authenticator), nil } diff --git a/packages/orchestrator/internal/template/build/core/oci/auth/general.go b/packages/orchestrator/internal/template/build/core/oci/auth/general.go index a19f45800d..01cb33c9e1 100644 --- a/packages/orchestrator/internal/template/build/core/oci/auth/general.go +++ b/packages/orchestrator/internal/template/build/core/oci/auth/general.go @@ -24,7 +24,7 @@ func NewGeneralAuthProvider(registry *templatemanager.GeneralRegistry) *GeneralA // GetAuthOption returns the authentication option for general registries func (p *GeneralAuthProvider) GetAuthOption(ctx context.Context) (remote.Option, error) { return remote.WithAuth(&authn.Basic{ - Username: p.registry.Username, - Password: p.registry.Password, + Username: p.registry.GetUsername(), + Password: p.registry.GetPassword(), }), nil } diff --git a/packages/orchestrator/internal/template/build/phases/base/builder.go b/packages/orchestrator/internal/template/build/phases/base/builder.go index 83fd07befc..0b8e621a04 100644 --- a/packages/orchestrator/internal/template/build/phases/base/builder.go +++ b/packages/orchestrator/internal/template/build/phases/base/builder.go @@ -323,11 +323,11 @@ func (bb *BaseBuilder) Layer( case bb.Config.FromTemplate != nil: sourceMeta := metadata.FromTemplate{ Alias: bb.Config.FromTemplate.GetAlias(), - BuildID: bb.Config.FromTemplate.BuildID, + BuildID: bb.Config.FromTemplate.GetBuildID(), } // If the template is built from another template, use its metadata - tm, err := bb.index.Cached(ctx, bb.Config.FromTemplate.BuildID) + tm, err := bb.index.Cached(ctx, bb.Config.FromTemplate.GetBuildID()) if err != nil { return phases.LayerResult{}, fmt.Errorf("error getting base layer from cache, you may need to rebuild the base template: %w", err) } diff --git a/packages/orchestrator/internal/template/build/phases/steps/builder.go b/packages/orchestrator/internal/template/build/phases/steps/builder.go index b775898014..a91d163163 100644 --- a/packages/orchestrator/internal/template/build/phases/steps/builder.go +++ b/packages/orchestrator/internal/template/build/phases/steps/builder.go @@ -81,13 +81,13 @@ func (sb *StepBuilder) Prefix() string { } func (sb *StepBuilder) String(ctx context.Context) (string, error) { - return fmt.Sprintf("%s %s", strings.ToUpper(sb.step.Type), strings.Join(sb.step.Args, " ")), nil + return fmt.Sprintf("%s %s", strings.ToUpper(sb.step.GetType()), strings.Join(sb.step.GetArgs(), " ")), nil } func (sb *StepBuilder) Metadata() phases.PhaseMeta { return phases.PhaseMeta{ Phase: metrics.PhaseSteps, - StepType: sb.step.Type, + StepType: sb.step.GetType(), StepNumber: &sb.stepNumber, } } @@ -99,12 +99,12 @@ func (sb *StepBuilder) Layer( ) (phases.LayerResult, error) { ctx, span := tracer.Start(ctx, "compute step", trace.WithAttributes( attribute.Int("step", sb.stepNumber), - attribute.String("type", sb.step.Type), + attribute.String("type", sb.step.GetType()), attribute.String("hash", hash), )) defer span.End() - forceBuild := sb.step.Force != nil && *sb.step.Force + forceBuild := sb.step.Force != nil && sb.step.GetForce() if !forceBuild { m, err := sb.index.LayerMetaFromHash(ctx, hash) if err != nil { @@ -146,7 +146,7 @@ func (sb *StepBuilder) Build( ) (phases.LayerResult, error) { ctx, span := tracer.Start(ctx, "build step", trace.WithAttributes( attribute.Int("step", sb.stepNumber), - attribute.String("type", sb.step.Type), + attribute.String("type", sb.step.GetType()), attribute.String("hash", currentLayer.Hash), )) defer span.End() diff --git a/packages/orchestrator/internal/template/build/phases/steps/hash.go b/packages/orchestrator/internal/template/build/phases/steps/hash.go index af006bdbf6..2d0c2d0ebf 100644 --- a/packages/orchestrator/internal/template/build/phases/steps/hash.go +++ b/packages/orchestrator/internal/template/build/phases/steps/hash.go @@ -11,8 +11,8 @@ import ( func (sb *StepBuilder) Hash(sourceLayer phases.LayerResult) (string, error) { return cache.HashKeys( sourceLayer.Hash, - sb.step.Type, - strings.Join(sb.step.Args, " "), - utils.Sprintp(sb.step.FilesHash), + sb.step.GetType(), + strings.Join(sb.step.GetArgs(), " "), + utils.Sprintp(sb.step.FilesHash), //nolint:protogetter // we need the nil check too ), nil } diff --git a/packages/orchestrator/internal/template/build/sandboxtools/command.go b/packages/orchestrator/internal/template/build/sandboxtools/command.go index 4768d961ae..f832c772c4 100644 --- a/packages/orchestrator/internal/template/build/sandboxtools/command.go +++ b/packages/orchestrator/internal/template/build/sandboxtools/command.go @@ -168,7 +168,7 @@ func runCommandWithAllOptions( if !ok { return nil } - e := msg.Event + e := msg.GetEvent() if e == nil { zap.L().Error("received nil command event") return nil diff --git a/packages/orchestrator/internal/template/server/create_template.go b/packages/orchestrator/internal/template/server/create_template.go index b2a2727517..4f0434bf70 100644 --- a/packages/orchestrator/internal/template/server/create_template.go +++ b/packages/orchestrator/internal/template/server/create_template.go @@ -25,53 +25,53 @@ func (s *ServerStore) TemplateCreate(ctx context.Context, templateRequest *templ _, childSpan := tracer.Start(ctx, "template-create") defer childSpan.End() - cfg := templateRequest.Template + cfg := templateRequest.GetTemplate() childSpan.SetAttributes( - telemetry.WithTemplateID(cfg.TemplateID), - telemetry.WithBuildID(cfg.BuildID), - attribute.String("env.kernel.version", cfg.KernelVersion), - attribute.String("env.firecracker.version", cfg.FirecrackerVersion), - attribute.String("env.start_cmd", cfg.StartCommand), - attribute.Int64("env.memory_mb", int64(cfg.MemoryMB)), - attribute.Int64("env.vcpu_count", int64(cfg.VCpuCount)), - attribute.Bool("env.huge_pages", cfg.HugePages), + telemetry.WithTemplateID(cfg.GetTemplateID()), + telemetry.WithBuildID(cfg.GetBuildID()), + attribute.String("env.kernel.version", cfg.GetKernelVersion()), + attribute.String("env.firecracker.version", cfg.GetFirecrackerVersion()), + attribute.String("env.start_cmd", cfg.GetStartCommand()), + attribute.Int64("env.memory_mb", int64(cfg.GetMemoryMB())), + attribute.Int64("env.vcpu_count", int64(cfg.GetVCpuCount())), + attribute.Bool("env.huge_pages", cfg.GetHugePages()), ) if s.info.GetStatus() != orchestrator.ServiceInfoStatus_Healthy { - s.logger.Error("Requesting template creation while server not healthy is not possible", logger.WithTemplateID(cfg.TemplateID)) + s.logger.Error("Requesting template creation while server not healthy is not possible", logger.WithTemplateID(cfg.GetTemplateID())) return nil, fmt.Errorf("server is draining") } metadata := storage.TemplateFiles{ - BuildID: cfg.BuildID, - KernelVersion: cfg.KernelVersion, - FirecrackerVersion: cfg.FirecrackerVersion, + BuildID: cfg.GetBuildID(), + KernelVersion: cfg.GetKernelVersion(), + FirecrackerVersion: cfg.GetFirecrackerVersion(), } // default to scope by template ID - cacheScope := cfg.TemplateID + cacheScope := cfg.GetTemplateID() if templateRequest.CacheScope != nil { - cacheScope = *templateRequest.CacheScope + cacheScope = templateRequest.GetCacheScope() } // Create the auth provider using the factory - authProvider := auth.NewAuthProvider(cfg.FromImageRegistry) + authProvider := auth.NewAuthProvider(cfg.GetFromImageRegistry()) template := config.TemplateConfig{ - TeamID: cfg.TeamID, - TemplateID: cfg.TemplateID, + TeamID: cfg.GetTeamID(), + TemplateID: cfg.GetTemplateID(), CacheScope: cacheScope, - VCpuCount: int64(cfg.VCpuCount), - MemoryMB: int64(cfg.MemoryMB), - StartCmd: cfg.StartCommand, - ReadyCmd: cfg.ReadyCommand, - DiskSizeMB: int64(cfg.DiskSizeMB), - HugePages: cfg.HugePages, + VCpuCount: int64(cfg.GetVCpuCount()), + MemoryMB: int64(cfg.GetMemoryMB()), + StartCmd: cfg.GetStartCommand(), + ReadyCmd: cfg.GetReadyCommand(), + DiskSizeMB: int64(cfg.GetDiskSizeMB()), + HugePages: cfg.GetHugePages(), FromImage: cfg.GetFromImage(), FromTemplate: cfg.GetFromTemplate(), RegistryAuthProvider: authProvider, Force: cfg.Force, - Steps: cfg.Steps, + Steps: cfg.GetSteps(), } logs := buildlogger.NewLogEntryLogger() @@ -85,7 +85,7 @@ func (s *ServerStore) TemplateCreate(ctx context.Context, templateRequest *templ bufferCore := zapcore.NewCore(encoder, logs, zapcore.DebugLevel) core := zapcore.NewTee(bufferCore, s.buildLogger.Core(). With([]zap.Field{ - {Type: zapcore.StringType, Key: "envID", String: cfg.TemplateID}, + {Type: zapcore.StringType, Key: "envID", String: cfg.GetTemplateID()}, {Type: zapcore.StringType, Key: "buildID", String: metadata.BuildID}, }), ) @@ -99,7 +99,7 @@ func (s *ServerStore) TemplateCreate(ctx context.Context, templateRequest *templ defer func() { if r := recover(); r != nil { - telemetry.ReportCriticalError(ctx, "recovered from panic in template build handler", nil, attribute.String("panic", fmt.Sprintf("%v", r)), telemetry.WithTemplateID(cfg.TemplateID), telemetry.WithBuildID(cfg.BuildID)) + telemetry.ReportCriticalError(ctx, "recovered from panic in template build handler", nil, attribute.String("panic", fmt.Sprintf("%v", r)), telemetry.WithTemplateID(cfg.GetTemplateID()), telemetry.WithBuildID(cfg.GetBuildID())) buildInfo.SetFail(builderrors.UnwrapUserError(errors.New("fatal error occurred, please contact us"))) } }() @@ -124,7 +124,7 @@ func (s *ServerStore) TemplateCreate(ctx context.Context, templateRequest *templ res, err := s.builder.Build(ctx, metadata, template, core) _ = core.Sync() if err != nil { - telemetry.ReportCriticalError(ctx, "error while building template", err, telemetry.WithTemplateID(cfg.TemplateID), telemetry.WithBuildID(cfg.BuildID)) + telemetry.ReportCriticalError(ctx, "error while building template", err, telemetry.WithTemplateID(cfg.GetTemplateID()), telemetry.WithBuildID(cfg.GetBuildID())) buildInfo.SetFail(builderrors.UnwrapUserError(err)) } else { diff --git a/packages/orchestrator/internal/template/server/delete_template.go b/packages/orchestrator/internal/template/server/delete_template.go index 75d063e16e..6022352c0e 100644 --- a/packages/orchestrator/internal/template/server/delete_template.go +++ b/packages/orchestrator/internal/template/server/delete_template.go @@ -20,29 +20,29 @@ var tracer = otel.Tracer("github.com/e2b-dev/infra/packages/orchestrator/interna func (s *ServerStore) TemplateBuildDelete(ctx context.Context, in *templatemanager.TemplateBuildDeleteRequest) (*emptypb.Empty, error) { childCtx, childSpan := tracer.Start(ctx, "template-delete-request", trace.WithAttributes( - telemetry.WithTemplateID(in.TemplateID), - telemetry.WithBuildID(in.BuildID), + telemetry.WithTemplateID(in.GetTemplateID()), + telemetry.WithBuildID(in.GetBuildID()), )) defer childSpan.End() s.wg.Add(1) defer s.wg.Done() - if in.TemplateID == "" || in.BuildID == "" { + if in.GetTemplateID() == "" || in.GetBuildID() == "" { return nil, errors.New("template id and build id are required fields") } - buildInfo, err := s.buildCache.Get(in.BuildID) + buildInfo, err := s.buildCache.Get(in.GetBuildID()) if err == nil && buildInfo.IsRunning() { // Cancel the build if it is running - zap.L().Info("Canceling running template build", logger.WithTemplateID(in.TemplateID), logger.WithBuildID(in.BuildID)) + zap.L().Info("Canceling running template build", logger.WithTemplateID(in.GetTemplateID()), logger.WithBuildID(in.GetBuildID())) telemetry.ReportEvent(ctx, "cancel in progress template build") buildInfo.SetFail(&templatemanager.TemplateBuildStatusReason{ Message: cache.CancelledBuildReason, }) } - err = template.Delete(childCtx, s.artifactsregistry, s.templateStorage, in.TemplateID, in.BuildID) + err = template.Delete(childCtx, s.artifactsregistry, s.templateStorage, in.GetTemplateID(), in.GetBuildID()) if err != nil { return nil, err } diff --git a/packages/orchestrator/internal/template/server/template_status.go b/packages/orchestrator/internal/template/server/template_status.go index 3e1ab34b20..5860bb9905 100644 --- a/packages/orchestrator/internal/template/server/template_status.go +++ b/packages/orchestrator/internal/template/server/template_status.go @@ -14,7 +14,7 @@ func (s *ServerStore) TemplateBuildStatus(ctx context.Context, in *template_mana _, ctxSpan := tracer.Start(ctx, "template-build-status-request") defer ctxSpan.End() - buildInfo, err := s.buildCache.Get(in.BuildID) + buildInfo, err := s.buildCache.Get(in.GetBuildID()) if err != nil { return nil, errors.Wrap(err, "error while getting build info, maybe already expired") } @@ -34,7 +34,7 @@ func (s *ServerStore) TemplateBuildStatus(ctx context.Context, in *template_mana } logEntries = append(logEntries, entry) - logs = append(logs, fmt.Sprintf("[%s] %s", entry.Timestamp.AsTime().Format(time.RFC3339), entry.Message)) + logs = append(logs, fmt.Sprintf("[%s] %s", entry.GetTimestamp().AsTime().Format(time.RFC3339), entry.GetMessage())) } result := buildInfo.GetResult() diff --git a/packages/orchestrator/internal/template/server/upload_layer_files_template.go b/packages/orchestrator/internal/template/server/upload_layer_files_template.go index dde0a5b248..310802efb9 100644 --- a/packages/orchestrator/internal/template/server/upload_layer_files_template.go +++ b/packages/orchestrator/internal/template/server/upload_layer_files_template.go @@ -16,12 +16,12 @@ func (s *ServerStore) InitLayerFileUpload(ctx context.Context, in *templatemanag defer childSpan.End() // default to scope by template ID - cacheScope := in.TemplateID + cacheScope := in.GetTemplateID() if in.CacheScope != nil { - cacheScope = *in.CacheScope + cacheScope = in.GetCacheScope() } - path := paths.GetLayerFilesCachePath(cacheScope, in.Hash) + path := paths.GetLayerFilesCachePath(cacheScope, in.GetHash()) obj, err := s.buildStorage.OpenObject(ctx, path) if err != nil { return nil, fmt.Errorf("failed to open layer files cache: %w", err) diff --git a/tests/integration/internal/tests/envd/auth_test.go b/tests/integration/internal/tests/envd/auth_test.go index fcd2478754..c282a4c2ef 100644 --- a/tests/integration/internal/tests/envd/auth_test.go +++ b/tests/integration/internal/tests/envd/auth_test.go @@ -291,8 +291,8 @@ func getSandboxLogs(t *testing.T, ctx context.Context, client *setup.EnvdClient, for stream.Receive() { msg := stream.Msg() - if msg.Event.GetData() != nil { - switch data := msg.Event.GetData().GetOutput().(type) { + if msg.GetEvent().GetData() != nil { + switch data := msg.GetEvent().GetData().GetOutput().(type) { case *process.ProcessEvent_DataEvent_Stdout: out = append(out, string(data.Stdout)) case *process.ProcessEvent_DataEvent_Stderr: diff --git a/tests/integration/internal/tests/envd/filesystem_test.go b/tests/integration/internal/tests/envd/filesystem_test.go index c02372c9a1..bd5a3d5d40 100644 --- a/tests/integration/internal/tests/envd/filesystem_test.go +++ b/tests/integration/internal/tests/envd/filesystem_test.go @@ -91,11 +91,11 @@ func TestListDir(t *testing.T) { require.NoError(t, err) assert.NotEmpty(t, folderListResp.Msg) - assert.Len(t, folderListResp.Msg.Entries, len(tt.expectedPaths)) + assert.Len(t, folderListResp.Msg.GetEntries(), len(tt.expectedPaths)) - actualPaths := make([]string, len(folderListResp.Msg.Entries)) - for i, entry := range folderListResp.Msg.Entries { - actualPaths[i] = entry.Path + actualPaths := make([]string, len(folderListResp.Msg.GetEntries())) + for i, entry := range folderListResp.Msg.GetEntries() { + actualPaths[i] = entry.GetPath() } assert.ElementsMatch(t, tt.expectedPaths, actualPaths) }) @@ -164,25 +164,25 @@ func TestStat(t *testing.T) { // Verify the stat response require.NotNil(t, statResp.Msg) - require.NotNil(t, statResp.Msg.Entry) - entry := statResp.Msg.Entry + require.NotNil(t, statResp.Msg.GetEntry()) + entry := statResp.Msg.GetEntry() // Verify basic file info - assert.Equal(t, "test.txt", entry.Name) - assert.Equal(t, filePath, entry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, entry.Type) + assert.Equal(t, "test.txt", entry.GetName()) + assert.Equal(t, filePath, entry.GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, entry.GetType()) // Verify permissions and ownership - assert.Equal(t, uint32(0o644), entry.Mode) - assert.Equal(t, "-rw-r--r--", entry.Permissions) - assert.Equal(t, "user", entry.Owner) - assert.Equal(t, "user", entry.Group) + assert.Equal(t, uint32(0o644), entry.GetMode()) + assert.Equal(t, "-rw-r--r--", entry.GetPermissions()) + assert.Equal(t, "user", entry.GetOwner()) + assert.Equal(t, "user", entry.GetGroup()) // Verify file size - assert.Equal(t, int64(13), entry.Size) + assert.Equal(t, int64(13), entry.GetSize()) // Verify modified time - require.NotNil(t, entry.ModifiedTime) + require.NotNil(t, entry.GetModifiedTime()) } func TestListDirFileEntry(t *testing.T) { @@ -214,21 +214,21 @@ func TestListDirFileEntry(t *testing.T) { // Verify response require.NotEmpty(t, folderListResp.Msg) - require.Len(t, folderListResp.Msg.Entries, 1) + require.Len(t, folderListResp.Msg.GetEntries(), 1) // Get the file entry - fileEntry := folderListResp.Msg.Entries[0] + fileEntry := folderListResp.Msg.GetEntries()[0] // Verify file entry - assert.Equal(t, "test.txt", fileEntry.Name) - assert.Equal(t, filePath, fileEntry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, fileEntry.Type) - assert.Equal(t, uint32(0o644), fileEntry.Mode) - assert.Equal(t, "-rw-r--r--", fileEntry.Permissions) - assert.Equal(t, "user", fileEntry.Owner) - assert.Equal(t, "user", fileEntry.Group) - assert.Equal(t, int64(13), fileEntry.Size) // "Hello, World!" is 13 bytes - require.NotNil(t, fileEntry.ModifiedTime) + assert.Equal(t, "test.txt", fileEntry.GetName()) + assert.Equal(t, filePath, fileEntry.GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, fileEntry.GetType()) + assert.Equal(t, uint32(0o644), fileEntry.GetMode()) + assert.Equal(t, "-rw-r--r--", fileEntry.GetPermissions()) + assert.Equal(t, "user", fileEntry.GetOwner()) + assert.Equal(t, "user", fileEntry.GetGroup()) + assert.Equal(t, int64(13), fileEntry.GetSize()) // "Hello, World!" is 13 bytes + require.NotNil(t, fileEntry.GetModifiedTime()) } func TestListDirEntry(t *testing.T) { @@ -258,20 +258,20 @@ func TestListDirEntry(t *testing.T) { // Verify response require.NotEmpty(t, folderListResp.Msg) - require.Len(t, folderListResp.Msg.Entries, 1) + require.Len(t, folderListResp.Msg.GetEntries(), 1) // Get the subdirectory entry - entry := folderListResp.Msg.Entries[0] + entry := folderListResp.Msg.GetEntries()[0] // Verify EntryInfo - assert.Equal(t, "subdir", entry.Name) - assert.Equal(t, subDir, entry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_DIRECTORY, entry.Type) - assert.Equal(t, uint32(0o755), entry.Mode) - assert.Equal(t, "drwxr-xr-x", entry.Permissions) - assert.Equal(t, "user", entry.Owner) - assert.Equal(t, "user", entry.Group) - require.NotNil(t, entry.ModifiedTime) + assert.Equal(t, "subdir", entry.GetName()) + assert.Equal(t, subDir, entry.GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_DIRECTORY, entry.GetType()) + assert.Equal(t, uint32(0o755), entry.GetMode()) + assert.Equal(t, "drwxr-xr-x", entry.GetPermissions()) + assert.Equal(t, "user", entry.GetOwner()) + assert.Equal(t, "user", entry.GetGroup()) + require.NotNil(t, entry.GetModifiedTime()) } func TestListDirMixedEntries(t *testing.T) { @@ -305,36 +305,36 @@ func TestListDirMixedEntries(t *testing.T) { // Verify response require.NotEmpty(t, folderListResp.Msg) - require.Len(t, folderListResp.Msg.Entries, 2) + require.Len(t, folderListResp.Msg.GetEntries(), 2) // Create a map of entries by name for easier verification entries := make(map[string]*filesystem.EntryInfo) - for _, entry := range folderListResp.Msg.Entries { - entries[entry.Name] = entry + for _, entry := range folderListResp.Msg.GetEntries() { + entries[entry.GetName()] = entry } // Verify directory entry dirEntry, exists := entries["subdir"] require.True(t, exists) - assert.Equal(t, subDir, dirEntry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_DIRECTORY, dirEntry.Type) - assert.Equal(t, uint32(0o755), dirEntry.Mode) - assert.Equal(t, "drwxr-xr-x", dirEntry.Permissions) - assert.Equal(t, "user", dirEntry.Owner) - assert.Equal(t, "user", dirEntry.Group) - require.NotNil(t, dirEntry.ModifiedTime) + assert.Equal(t, subDir, dirEntry.GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_DIRECTORY, dirEntry.GetType()) + assert.Equal(t, uint32(0o755), dirEntry.GetMode()) + assert.Equal(t, "drwxr-xr-x", dirEntry.GetPermissions()) + assert.Equal(t, "user", dirEntry.GetOwner()) + assert.Equal(t, "user", dirEntry.GetGroup()) + require.NotNil(t, dirEntry.GetModifiedTime()) // Verify file entry fileEntry, exists := entries["test.txt"] require.True(t, exists) - assert.Equal(t, filePath, fileEntry.Path) - assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, fileEntry.Type) - assert.Equal(t, uint32(0o644), fileEntry.Mode) - assert.Equal(t, "-rw-r--r--", fileEntry.Permissions) - assert.Equal(t, "user", fileEntry.Owner) - assert.Equal(t, "user", fileEntry.Group) - assert.Equal(t, int64(13), fileEntry.Size) // "Hello, World!" is 13 bytes - require.NotNil(t, fileEntry.ModifiedTime) + assert.Equal(t, filePath, fileEntry.GetPath()) + assert.Equal(t, filesystem.FileType_FILE_TYPE_FILE, fileEntry.GetType()) + assert.Equal(t, uint32(0o644), fileEntry.GetMode()) + assert.Equal(t, "-rw-r--r--", fileEntry.GetPermissions()) + assert.Equal(t, "user", fileEntry.GetOwner()) + assert.Equal(t, "user", fileEntry.GetGroup()) + assert.Equal(t, int64(13), fileEntry.GetSize()) // "Hello, World!" is 13 bytes + require.NotNil(t, fileEntry.GetModifiedTime()) } func TestRelativePath(t *testing.T) { @@ -358,7 +358,7 @@ func TestRelativePath(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, folderListResp.Msg) - assert.Len(t, folderListResp.Msg.Entries, 1) + assert.Len(t, folderListResp.Msg.GetEntries(), 1) - assert.Equal(t, path.Join(userHome, relativeTestFolder, "test.txt"), folderListResp.Msg.Entries[0].Path) + assert.Equal(t, path.Join(userHome, relativeTestFolder, "test.txt"), folderListResp.Msg.GetEntries()[0].GetPath()) } diff --git a/tests/integration/internal/tests/envd/process_test.go b/tests/integration/internal/tests/envd/process_test.go index 3cbd0fa4b2..36b57239aa 100644 --- a/tests/integration/internal/tests/envd/process_test.go +++ b/tests/integration/internal/tests/envd/process_test.go @@ -75,21 +75,21 @@ func TestCommandKillNextApp(t *testing.T) { listResp, err := envdClient.ProcessClient.List(ctx, listReq) require.NoError(t, err) - assert.Len(t, listResp.Msg.Processes, 1, "Expected one process (next dev) running") + assert.Len(t, listResp.Msg.GetProcesses(), 1, "Expected one process (next dev) running") // Kill all processes - for _, proc := range listResp.Msg.Processes { - t.Logf("killing process PID=%d CMD=%s", proc.Pid, proc.Config.Cmd) - killPid(t, ctx, envdClient, sbx.SandboxID, proc.Pid) + for _, proc := range listResp.Msg.GetProcesses() { + t.Logf("killing process PID=%d CMD=%s", proc.GetPid(), proc.GetConfig().GetCmd()) + killPid(t, ctx, envdClient, sbx.SandboxID, proc.GetPid()) } // Final process list finalListResp, err := envdClient.ProcessClient.List(ctx, listReq) require.NoError(t, err) - assert.Empty(t, finalListResp.Msg.Processes, "Expected no processes running") - for _, proc := range finalListResp.Msg.Processes { - t.Errorf("remaining process: PID=%d CMD=%s", proc.Pid, proc.Config.Cmd) + assert.Empty(t, finalListResp.Msg.GetProcesses(), "Expected no processes running") + for _, proc := range finalListResp.Msg.GetProcesses() { + t.Errorf("remaining process: PID=%d CMD=%s", proc.GetPid(), proc.GetConfig().GetCmd()) } } @@ -151,21 +151,21 @@ func TestCommandKillWithAnd(t *testing.T) { listResp, err := envdClient.ProcessClient.List(ctx, listReq) require.NoError(t, err) - assert.Len(t, listResp.Msg.Processes, 1, "Expected one process running") + assert.Len(t, listResp.Msg.GetProcesses(), 1, "Expected one process running") // Kill all processes - for _, proc := range listResp.Msg.Processes { - t.Logf("killing process PID=%d CMD=%s", proc.Pid, proc.Config.Cmd) - killPid(t, ctx, envdClient, sbx.SandboxID, proc.Pid) + for _, proc := range listResp.Msg.GetProcesses() { + t.Logf("killing process PID=%d CMD=%s", proc.GetPid(), proc.GetConfig().GetCmd()) + killPid(t, ctx, envdClient, sbx.SandboxID, proc.GetPid()) } // Final process list finalListResp, err := envdClient.ProcessClient.List(ctx, listReq) require.NoError(t, err) - assert.Empty(t, finalListResp.Msg.Processes, "Expected no processes running") - for _, proc := range finalListResp.Msg.Processes { - t.Errorf("remaining process: PID=%d CMD=%s", proc.Pid, proc.Config.Cmd) + assert.Empty(t, finalListResp.Msg.GetProcesses(), "Expected no processes running") + for _, proc := range finalListResp.Msg.GetProcesses() { + t.Errorf("remaining process: PID=%d CMD=%s", proc.GetPid(), proc.GetConfig().GetCmd()) } } diff --git a/tests/integration/internal/tests/envd/watcher_test.go b/tests/integration/internal/tests/envd/watcher_test.go index bb3cd94cee..1d3535fd9f 100644 --- a/tests/integration/internal/tests/envd/watcher_test.go +++ b/tests/integration/internal/tests/envd/watcher_test.go @@ -34,8 +34,8 @@ func TestWatcher(t *testing.T) { createResp, err := envdClient.FilesystemClient.CreateWatcher(t.Context(), createReq) require.NoError(t, err) require.NotNil(t, createResp) - assert.NotEmpty(t, createResp.Msg.WatcherId) - watcherId := createResp.Msg.WatcherId + assert.NotEmpty(t, createResp.Msg.GetWatcherId()) + watcherId := createResp.Msg.GetWatcherId() // Get events (should be empty initially) getReq := connect.NewRequest(&filesystem.GetWatcherEventsRequest{ @@ -46,7 +46,7 @@ func TestWatcher(t *testing.T) { getResp, err := envdClient.FilesystemClient.GetWatcherEvents(t.Context(), getReq) require.NoError(t, err) - assert.Empty(t, getResp.Msg.Events) + assert.Empty(t, getResp.Msg.GetEvents()) testFile := fmt.Sprintf("%s/test.txt", watchDir) utils.UploadFile(t, t.Context(), sbx, envdClient, testFile, "hello world") @@ -55,12 +55,12 @@ func TestWatcher(t *testing.T) { require.Eventually(t, func() bool { getResp, err := envdClient.FilesystemClient.GetWatcherEvents(t.Context(), getReq) require.NoError(t, err) - events = getResp.Msg.Events + events = getResp.Msg.GetEvents() return len(events) > 0 }, 5*time.Second, 20*time.Millisecond, "Expected to receive file system events") require.NotEmpty(t, events) - assert.Equal(t, filesystem.EventType_EVENT_TYPE_CREATE, events[0].Type) - assert.Equal(t, "test.txt", events[0].Name) + assert.Equal(t, filesystem.EventType_EVENT_TYPE_CREATE, events[0].GetType()) + assert.Equal(t, "test.txt", events[0].GetName()) // Remove watcher removeReq := connect.NewRequest(&filesystem.RemoveWatcherRequest{ diff --git a/tests/integration/internal/utils/process.go b/tests/integration/internal/utils/process.go index 048857aba1..a12fda45b0 100644 --- a/tests/integration/internal/utils/process.go +++ b/tests/integration/internal/utils/process.go @@ -76,9 +76,9 @@ func ExecCommandWithOptions(tb testing.TB, ctx context.Context, sbx *api.Sandbox default: msg := stream.Msg() tb.Logf("Command [%s] output: %s", command, msg.String()) - if msg.Event.GetEnd() != nil { - if msg.Event.GetEnd().GetExitCode() != 0 { - return fmt.Errorf("command %s in sandbox %s failed with exit code %d", command, sbx.SandboxID, msg.Event.GetEnd().GetExitCode()) + if msg.GetEvent().GetEnd() != nil { + if msg.GetEvent().GetEnd().GetExitCode() != 0 { + return fmt.Errorf("command %s in sandbox %s failed with exit code %d", command, sbx.SandboxID, msg.GetEvent().GetEnd().GetExitCode()) } tb.Logf("Command [%s] completed successfully in sandbox %s", command, sbx.SandboxID) return nil