Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ require (
github.com/ghodss/yaml v1.0.0
github.com/itchyny/gojq v0.12.16
github.com/kr/pretty v0.3.1
github.com/margo/sandbox v0.0.1
github.com/margo/sandbox v0.0.2-0.20260513113620-95acc0d802d2
github.com/princjef/mageutil v1.0.0
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
gopkg.in/yaml.v2 v2.4.0
Expand Down
4 changes: 2 additions & 2 deletions api/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,8 @@ github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/margo/sandbox v0.0.1 h1:t8LBdHPA5Xl6CYtOgjYZPqr+vBDONMHxs1S3Hxu8VH4=
github.com/margo/sandbox v0.0.1/go.mod h1:GaaOzZOMEiYV1KykeabKsBoBey7MIFbzDJLruqd0RYk=
github.com/margo/sandbox v0.0.2-0.20260513113620-95acc0d802d2 h1:oYOLNx7A/nWdsNeqvSJdVC21L3X5qpHvJadVlZ8IB1U=
github.com/margo/sandbox v0.0.2-0.20260513113620-95acc0d802d2/go.mod h1:GaaOzZOMEiYV1KykeabKsBoBey7MIFbzDJLruqd0RYk=
github.com/matryer/is v1.3.0 h1:9qiso3jaJrOe6qBRJRBt2Ldht05qDiFP9le0JOIhRSI=
github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
Expand Down
32 changes: 16 additions & 16 deletions api/pkg/apis/v1alpha1/managers/margo/appPkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func (s *AppPkgManager) OnboardAppPkg(
"operation", operation,
"initialStatus", operationState)

appPkg.Package.Metadata.Id = &appPkgId
appPkg.Package.Id = &appPkgId
appPkg.Package.RecentOperation = &margoNonStdAPI.ApplicationPackageRecentOperation{}
appPkg.Package.RecentOperation.Op = operation
appPkg.Package.RecentOperation.Status = operationState
Expand All @@ -152,7 +152,7 @@ func (s *AppPkgManager) OnboardAppPkg(
}

appPkgLogger.Debug("Package object prepared with metadata",
"packageId", *appPkg.Package.Metadata.Id,
"packageId", *appPkg.Package.Id,
"packageName", appPkg.Package.Metadata.Name,
"operation", appPkg.Package.RecentOperation.Op,
"status", appPkg.Package.RecentOperation.Status)
Expand All @@ -166,14 +166,14 @@ func (s *AppPkgManager) OnboardAppPkg(
}
if err := s.Database.UpsertAppPackage(ctx, dbRow); err != nil {
appPkgLogger.Error("Failed to store package in database",
"packageId", *appPkg.Package.Metadata.Id,
"packageId", *appPkg.Package.Id,
"error", err)
return nil, fmt.Errorf("failed to store app pkg in database: %w", err)
}

// Start async processing
appPkgLogger.Info("Starting async processing for package",
"packageId", *appPkg.Package.Metadata.Id,
"packageId", *appPkg.Package.Id,
"packageName", appPkg.Package.Metadata.Name)
go func() {
time.Sleep(time.Second * 8)
Expand All @@ -188,7 +188,7 @@ func (s *AppPkgManager) OnboardAppPkg(

onboardingDuration := time.Since(startTime)
appPkgLogger.Info("Package onboarding initiated successfully",
"packageId", *appPkg.Package.Metadata.Id,
"packageId", *appPkg.Package.Id,
"packageName", appPkg.Package.Metadata.Name,
"onboardingDuration", onboardingDuration)

Expand All @@ -204,7 +204,7 @@ func (s *AppPkgManager) processPackageAsync(
catalogsManager *catalogs.CatalogsManager) {

processStart := time.Now()
packageId := *appPkg.Package.Metadata.Id
packageId := *appPkg.Package.Id

appPkgLogger.Info("Starting async package processing with state machine",
"packageId", packageId,
Expand Down Expand Up @@ -363,7 +363,7 @@ func (s *AppPkgManager) processOciRepositoryWithStateTracking(
catalogsManager *catalogs.CatalogsManager) (*ApplicationPackage, error) {

ociProcessStart := time.Now()
packageId := *pkg.Package.Metadata.Id
packageId := *pkg.Package.Id

appPkgLogger.Info("Starting OCI repository processing with state tracking",
"packageId", packageId,
Expand Down Expand Up @@ -511,7 +511,7 @@ func (s *AppPkgManager) processOciRepositoryWithStateTracking(
if err := s.validateApplicationDescription(appDesc); err != nil {
appPkgLogger.Error("Application description validation failed",
"packageId", packageId,
"appId", appDesc.Metadata.Id,
"appId", appDesc.Id,
"error", err)
return nil, fmt.Errorf(
"application description validation failed: %w",
Expand All @@ -534,7 +534,7 @@ func (s *AppPkgManager) processOciRepositoryWithStateTracking(
"packageId",
packageId,
"appId",
appDesc.Metadata.Id,
appDesc.Id,
"appName",
appDesc.Metadata.Name,
"appVersion",
Expand All @@ -546,7 +546,7 @@ func (s *AppPkgManager) processOciRepositoryWithStateTracking(
// Phase 8: Convert to Symphony objects
appPkgLogger.Info("Phase 8: Converting application to Symphony objects",
"packageId", packageId,
"appId", appDesc.Metadata.Id)
"appId", appDesc.Id)

dbRow := AppPackageDatabaseRow{
PackageRequest: pkg.Package,
Expand All @@ -562,7 +562,7 @@ func (s *AppPkgManager) processOciRepositoryWithStateTracking(
if err != nil {
appPkgLogger.Error("Failed to convert to Symphony objects",
"packageId", packageId,
"appId", appDesc.Metadata.Id,
"appId", appDesc.Id,
"error", err)
return nil, fmt.Errorf("failed to convert to Symphony objects: %w", err)
}
Expand Down Expand Up @@ -663,7 +663,7 @@ func (s *AppPkgManager) parseApplicationDescription(
}

appPkgLogger.Info("Successfully parsed application description",
"appId", appDesc.Metadata.Id,
"appId", appDesc.Id,
"appName", appDesc.Metadata.Name,
"appVersion", appDesc.Metadata.Version,
"deploymentProfilesCount", len(appDesc.DeploymentProfiles))
Expand Down Expand Up @@ -755,11 +755,11 @@ func (s *AppPkgManager) validateApplicationDescription(
appDesc *margoNonStdAPI.AppDescription,
) error {
appPkgLogger.Debug("Validating application description",
"appId", appDesc.Metadata.Id,
"appId", appDesc.Id,
"appName", appDesc.Metadata.Name)

// Validate required fields
if appDesc.Metadata.Id == "" {
if appDesc.Id == nil || *appDesc.Id == "" {
return fmt.Errorf("application ID is required")
}
if appDesc.Metadata.Name == "" {
Expand Down Expand Up @@ -811,7 +811,7 @@ func (s *AppPkgManager) validateApplicationDescription(
}

appPkgLogger.Debug("Application description validation passed",
"appId", appDesc.Metadata.Id,
"appId", appDesc.Id,
"deploymentProfilesCount", len(appDesc.DeploymentProfiles))

return nil
Expand Down Expand Up @@ -1036,7 +1036,7 @@ func (s *AppPkgManager) ListAppPkgs(
// ctx context.Context,
// appPkg ApplicationPackage,
// err error) error {
// rootResource := *appPkg.Package.Metadata.Id
// rootResource := *appPkg.Package.Id
// catalogName := rootResource + "-v-" + appPkg.Description.Metadata.Version
// // Create minimal Symphony objects even on error
// catalog := &model.CatalogState{
Expand Down
2 changes: 1 addition & 1 deletion api/pkg/apis/v1alpha1/managers/margo/appPkgStateMachine.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func (sm *AppPkgStateMachine) updatePackageState(
}

sm.log.InfofCtx(ctx, "AppPkgStateMachine: Updated package '%s' to state '%s'",
*pkg.PackageRequest.Metadata.Id, newState)
*pkg.PackageRequest.Id, newState)

return nil
}
Expand Down
10 changes: 5 additions & 5 deletions api/pkg/apis/v1alpha1/managers/margo/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ func NewMargoDatabase(mgrCtx *contexts.ManagerContext, pubsubGroupName PublishGr
}

func (db *MargoDatabase) UpsertAppPackage(ctx context.Context, pkg AppPackageDatabaseRow) error {
packageId := *pkg.PackageRequest.Metadata.Id
packageId := *pkg.PackageRequest.Id
_, err := db.StateProvider.Upsert(ctx, states.UpsertRequest{
Options: states.UpsertOption{},
Metadata: db.appPkgMetadata,
Expand Down Expand Up @@ -286,7 +286,7 @@ func (db *MargoDatabase) AppPackageExists(ctx context.Context, packageId string)
}

func (db *MargoDatabase) UpsertDeployment(ctx context.Context, deployment DeploymentDatabaseRow, publishEvent bool) error {
deploymentId := *deployment.DeploymentRequest.Metadata.Id
deploymentId := *deployment.DeploymentRequest.Id
_, err := db.StateProvider.Upsert(ctx, states.UpsertRequest{
Options: states.UpsertOption{},
Metadata: db.deploymentMetadata,
Expand Down Expand Up @@ -523,16 +523,16 @@ func (db *MargoDatabase) GetDeploymentsByDevice(ctx context.Context, deviceId st

if deployment.DeploymentRequest.Spec.DeviceRef != nil && deployment.DeploymentRequest.Spec.DeviceRef.Id != nil {
db.MgrContext.Logger.InfofCtx(ctx, "GetDeploymentsByDevice: Found deployment %s assigned to device %s",
*deployment.DeploymentRequest.Metadata.Id, *deployment.DeploymentRequest.Spec.DeviceRef.Id)
*deployment.DeploymentRequest.Id, *deployment.DeploymentRequest.Spec.DeviceRef.Id)

if *deployment.DeploymentRequest.Spec.DeviceRef.Id == deviceId {
deviceDeployments = append(deviceDeployments, deployment)
db.MgrContext.Logger.InfofCtx(ctx, "GetDeploymentsByDevice: MATCH - Adding deployment %s to device %s",
*deployment.DeploymentRequest.Metadata.Id, deviceId)
*deployment.DeploymentRequest.Id, deviceId)
}
} else {
db.MgrContext.Logger.WarnfCtx(ctx, "GetDeploymentsByDevice: Deployment %s has no device reference",
*deployment.DeploymentRequest.Metadata.Id)
*deployment.DeploymentRequest.Id)
}
}

Expand Down
14 changes: 7 additions & 7 deletions api/pkg/apis/v1alpha1/managers/margo/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ func (s *DeploymentManager) deleteObjectFromCache(topic string, event v1alpha2.E
var err error
switch event.Body.(type) {
case AppPackageDatabaseRow:
err = s.database.DeleteAppPackage(context.Background(), *event.Body.(AppPackageDatabaseRow).PackageRequest.Metadata.Id)
err = s.database.DeleteAppPackage(context.Background(), *event.Body.(AppPackageDatabaseRow).PackageRequest.Id)
case DeploymentDatabaseRow:
err = s.database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Metadata.Id, false)
err = s.database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Id, false)
case DeviceDatabaseRow:
err = s.database.DeleteDevice(context.Background(), event.Body.(DeviceDatabaseRow).Capabilities.Properties.Id)
default:
Expand Down Expand Up @@ -167,7 +167,7 @@ func (s *DeploymentManager) CreateDeployment(ctx context.Context, req margoNonSt
}

// Store in database (single call)
if err := s.storeDeployment(ctx, *deployment, *deployment.Metadata.Id, appPkg.Description.Metadata.Id, appPkg.Description.Metadata.Version); err != nil {
if err := s.storeDeployment(ctx, *deployment, *deployment.Id, *appPkg.Description.Id, appPkg.Description.Metadata.Version); err != nil {
return nil, fmt.Errorf("failed to store deployment: %w", err)
}

Expand All @@ -194,7 +194,7 @@ func (s *DeploymentManager) CreateDeployment(ctx context.Context, req margoNonSt
deploymentLogger.WarnfCtx(ctx, "CreateDeployment: No device reference found in deployment request")
}

deploymentLogger.InfofCtx(ctx, "CreateDeployment: Successfully created deployment '%s'", *deployment.Metadata.Id)
deploymentLogger.InfofCtx(ctx, "CreateDeployment: Successfully created deployment '%s'", *deployment.Id)
return deployment, nil
}

Expand All @@ -209,11 +209,11 @@ func (s *DeploymentManager) buildInitialDeployment(req margoNonStdAPI.Applicatio
ApiVersion: req.ApiVersion,
Kind: "ApplicationDeploymentManifest",
Metadata: margoNonStdAPI.Metadata{
Id: &deploymentId,
Name: req.Metadata.Name,
Namespace: req.Metadata.Namespace,
CreationTimestamp: &now,
},
Id: &deploymentId,
Spec: req.Spec,
Status: &margoNonStdAPI.ApplicationDeploymentStatus{
State: &state,
Expand Down Expand Up @@ -348,10 +348,10 @@ func (s *DeploymentManager) buildDesiredState(deployment margoNonStdAPI.Applicat
Metadata: sbi.AppDeploymentMetadata{
Name: deployment.Metadata.Name,
Namespace: deployment.Metadata.Namespace,
Id: deployment.Metadata.Id,
Annotations: deployment.Metadata.Annotations,
Labels: deployment.Metadata.Labels,
},
Id: deployment.Id,
Spec: sbi.AppDeploymentSpec{
DeploymentProfile: s.tranformer.ConvertDeploymentProfile(deployment.Spec.DeploymentProfile),
Parameters: &sbi.AppDeploymentParams{},
Expand All @@ -360,7 +360,7 @@ func (s *DeploymentManager) buildDesiredState(deployment margoNonStdAPI.Applicat
Status: sbi.DeploymentStatusManifest{
ApiVersion: "margo.org",
Kind: "DeploymentStatus",
DeploymentId: *deployment.Metadata.Id,
DeploymentId: *deployment.Id,
Status: struct {
Error *struct {
Code *string "json:\"code,omitempty\""
Expand Down
22 changes: 11 additions & 11 deletions api/pkg/apis/v1alpha1/managers/margo/deploymentBundle.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func (s *DeploymentBundleManager) upsertObjectInCache(topic string, event v1alph
}
} else {
deploymentBundleLogger.WarnfCtx(context.Background(), "upsertObjectInCache: Deployment %s has no device reference",
*deployment.DeploymentRequest.Metadata.Id)
*deployment.DeploymentRequest.Id)
}
default:
deploymentBundleLogger.ErrorfCtx(context.Background(), "upsertObjectInCache: Invalid event body: known object is missing or not of the correct type")
Expand All @@ -138,7 +138,7 @@ func (s *DeploymentBundleManager) deleteObjectFromCache(topic string, event v1al
var err error
switch event.Body.(type) {
case DeploymentDatabaseRow:
err = s.Database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Metadata.Id, false)
err = s.Database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Id, false)
default:
deploymentBundleLogger.ErrorfCtx(context.Background(), "deleteObjectFromCache: Invalid event body: known object is missing or not of the correct type")
return fmt.Errorf("invalid event body: deployment is missing or not of the correct type")
Expand Down Expand Up @@ -188,7 +188,7 @@ func (s *DeploymentBundleManager) rebuildTheBundleForDevice(ctx context.Context,
activeDeployments = append(activeDeployments, row)
} else {
deploymentBundleLogger.InfofCtx(ctx, "rebuildTheBundleForDevice: Excluding deployment %s in state '%s' from bundle",
*row.DesiredState.Metadata.Id, state)
*row.DesiredState.Id, state)
}
}

Expand All @@ -208,7 +208,7 @@ func (s *DeploymentBundleManager) rebuildTheBundleForDevice(ctx context.Context,
if len(activeDeployments) > 0 {
// Sort deployments by ID for deterministic ordering
sort.Slice(activeDeployments, func(i, j int) bool {
return *activeDeployments[i].DesiredState.Metadata.Id < *activeDeployments[j].DesiredState.Metadata.Id
return *activeDeployments[i].DesiredState.Id < *activeDeployments[j].DesiredState.Id
})

deploymentBundleLogger.InfofCtx(ctx, "rebuildTheBundleForDevice: Sorted %d active deployments for deterministic bundle creation", len(activeDeployments))
Expand All @@ -218,33 +218,33 @@ func (s *DeploymentBundleManager) rebuildTheBundleForDevice(ctx context.Context,

for _, row := range activeDeployments {
deploymentBundleLogger.InfofCtx(ctx, "rebuildTheBundleForDevice: Adding deployment %s (state: %s) to bundle",
*row.DesiredState.Metadata.Id, row.DesiredState.Status.Status.State)
*row.DesiredState.Id, row.DesiredState.Status.Status.State)

// Use JSON-to-YAML conversion to preserve component data
// First marshal to JSON (which handles union types correctly via MarshalJSON())
jsonData, err := json.Marshal(row.DesiredState.AppDeploymentManifest)
if err != nil {
deploymentBundleLogger.ErrorfCtx(ctx, "rebuildTheBundleForDevice: Failed to marshal deployment to JSON %s: %v",
*row.DesiredState.Metadata.Id, err)
*row.DesiredState.Id, err)
return fmt.Errorf("failed to marshal deployment to JSON: %w", err)
}

// Convert JSON to YAML (preserves all data including components)
var yamlInterface interface{}
if err := json.Unmarshal(jsonData, &yamlInterface); err != nil {
deploymentBundleLogger.ErrorfCtx(ctx, "rebuildTheBundleForDevice: Failed to unmarshal JSON %s: %v",
*row.DesiredState.Metadata.Id, err)
*row.DesiredState.Id, err)
return fmt.Errorf("failed to unmarshal JSON: %w", err)
}

data, err := yaml.Marshal(yamlInterface)
if err != nil {
deploymentBundleLogger.ErrorfCtx(ctx, "rebuildTheBundleForDevice: Failed to marshal to YAML %s: %v",
*row.DesiredState.Metadata.Id, err)
*row.DesiredState.Id, err)
return fmt.Errorf("failed to marshal to YAML: %w", err)
}

filename := fmt.Sprintf("%s.yaml", *row.DesiredState.Metadata.Id)
filename := fmt.Sprintf("%s.yaml", *row.DesiredState.Id)
_, _, err = archiver.AppendContent(data, filename)
if err != nil {
deploymentBundleLogger.ErrorfCtx(ctx, "rebuildTheBundleForDevice: Failed to add deployment content: %v", err)
Expand All @@ -259,10 +259,10 @@ func (s *DeploymentBundleManager) rebuildTheBundleForDevice(ctx context.Context,
}

newBundleManifest.Deployments = append(newBundleManifest.Deployments, margoStdAPI.DeploymentManifestRef{
DeploymentId: *row.DesiredState.Metadata.Id,
DeploymentId: *row.DesiredState.Id,
Digest: yamlDigest,
SizeBytes: pointers.Ptr(float32(len(data))),
Url: fmt.Sprintf("/api/v1/clients/%s/deployments/%s/%s", deviceClientId, *row.DesiredState.Metadata.Id, yamlDigest),
Url: fmt.Sprintf("/api/v1/clients/%s/deployments/%s/%s", deviceClientId, *row.DesiredState.Id, yamlDigest),
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func (sm *DeploymentStateMachine) updateDeploymentState(
}

sm.log.InfofCtx(ctx, "DeploymentStateMachine: Updated deployment '%s' to state '%s'",
*deployment.DeploymentRequest.Metadata.Id, newState)
*deployment.DeploymentRequest.Id, newState)

return nil
}
Expand Down
6 changes: 3 additions & 3 deletions api/pkg/apis/v1alpha1/managers/margo/device.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,9 @@ func (s *DeviceManager) deleteObjectFromCache(topic string, event v1alpha2.Event
var err error
switch event.Body.(type) {
case AppPackageDatabaseRow:
err = s.Database.DeleteAppPackage(context.Background(), *event.Body.(AppPackageDatabaseRow).PackageRequest.Metadata.Id)
err = s.Database.DeleteAppPackage(context.Background(), *event.Body.(AppPackageDatabaseRow).PackageRequest.Id)
case DeploymentDatabaseRow:
err = s.Database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Metadata.Id, false)
err = s.Database.DeleteDeployment(context.Background(), *event.Body.(DeploymentDatabaseRow).DeploymentRequest.Id, false)
case DeviceDatabaseRow:
err = s.Database.DeleteDevice(context.Background(), event.Body.(DeviceDatabaseRow).Capabilities.Properties.Id)
case DeploymentBundleRow:
Expand Down Expand Up @@ -443,9 +443,9 @@ func (dm *DeviceManager) ListDevices(ctx context.Context) (margoNonStdAPI.Device
ApiVersion: "non.margo.org",
Kind: "Device",
Metadata: margoNonStdAPI.Metadata{
Id: &row.DeviceClientId,
CreationTimestamp: &row.CreatedAt,
},
Id: &row.DeviceClientId,
Spec: margoNonStdAPI.DeviceSpec{
Capabilities: row.Capabilities,
Signature: row.DevicePubCert,
Expand Down
Loading