From 26cda573605f47b78310cb187fdb790c696b9f77 Mon Sep 17 00:00:00 2001 From: Dhruv Dhruv Date: Thu, 27 Feb 2025 14:35:48 +0000 Subject: [PATCH] feat: [CDE-636]: Adding config metadata to infra provider methods parameters. (#3487) * feat: [CDE-636]: Fixing infra provider config update logic. * feat: [CDE-636]: Adding config metadata to infra provider methods parameters. * feat: [CDE-636]: Adding config metadata to infra provider methods parameters. --- app/gitspace/infrastructure/find.go | 53 +++++++++++++------ .../infrastructure/trigger_infra_event.go | 6 ++- app/services/infraprovider/update_config.go | 8 +++ app/store/database/infra_provider_config.go | 10 ++-- infraprovider/docker_provider.go | 2 + infraprovider/infra_provider.go | 2 + 6 files changed, 60 insertions(+), 21 deletions(-) diff --git a/app/gitspace/infrastructure/find.go b/app/gitspace/infrastructure/find.go index eb3f079f3..0b85cffbb 100644 --- a/app/gitspace/infrastructure/find.go +++ b/app/gitspace/infrastructure/find.go @@ -42,9 +42,10 @@ func (i InfraProvisioner) Find( } var inputParams []types.InfraProviderParameter + var configMetadata map[string]any var agentPort = 0 if infraProvider.ProvisioningType() == enum.InfraProvisioningTypeNew { - inputParams, err = i.paramsForProvisioningTypeNew(ctx, gitspaceConfig) + inputParams, configMetadata, err = i.paramsForProvisioningTypeNew(ctx, gitspaceConfig) if err != nil { return nil, err } @@ -52,7 +53,7 @@ func (i InfraProvisioner) Find( // TODO: What if the agent port has deviated from when the last instance was created? agentPort = i.config.AgentPort } else { - inputParams, err = i.paramsForProvisioningTypeExisting(ctx, infraProviderResource, infraProvider) + inputParams, configMetadata, err = i.paramsForProvisioningTypeExisting(ctx, infraProviderResource, infraProvider) if err != nil { return nil, err } @@ -60,7 +61,7 @@ func (i InfraProvisioner) Find( infra, err := infraProvider.Find(ctx, gitspaceConfig.SpaceID, gitspaceConfig.SpacePath, gitspaceConfig.Identifier, gitspaceConfig.GitspaceInstance.Identifier, - agentPort, requiredGitspacePorts, inputParams) + agentPort, requiredGitspacePorts, inputParams, configMetadata) if err != nil { return nil, fmt.Errorf("failed to find infrastructure: %w", err) } @@ -83,23 +84,27 @@ func (i InfraProvisioner) Find( func (i InfraProvisioner) paramsForProvisioningTypeNew( ctx context.Context, gitspaceConfig types.GitspaceConfig, -) ([]types.InfraProviderParameter, error) { +) ([]types.InfraProviderParameter, map[string]any, error) { infraProvisionedLatest, err := i.infraProvisionedStore.FindLatestByGitspaceInstanceID( ctx, gitspaceConfig.GitspaceInstance.ID) if err != nil { - return nil, fmt.Errorf( + return nil, nil, fmt.Errorf( "could not find latest infra provisioned entity for instance %d: %w", gitspaceConfig.GitspaceInstance.ID, err) } if infraProvisionedLatest.InputParams == "" { - return []types.InfraProviderParameter{}, err + return []types.InfraProviderParameter{}, nil, err } allParams, err := deserializeInfraProviderParams(infraProvisionedLatest.InputParams) if err != nil { - return nil, err + return nil, nil, err } - - return allParams, nil + infraProviderConfig, err := i.infraProviderConfigStore.Find(ctx, + gitspaceConfig.InfraProviderResource.InfraProviderConfigID) + if err != nil { + return nil, nil, err + } + return allParams, infraProviderConfig.Metadata, nil } func deserializeInfraProviderParams(in string) ([]types.InfraProviderParameter, error) { @@ -115,13 +120,13 @@ func (i InfraProvisioner) paramsForProvisioningTypeExisting( ctx context.Context, infraProviderResource types.InfraProviderResource, infraProvider infraprovider.InfraProvider, -) ([]types.InfraProviderParameter, error) { - allParams, err := i.getAllParamsFromDB(ctx, infraProviderResource, infraProvider) +) ([]types.InfraProviderParameter, map[string]any, error) { + allParams, configMetadata, err := i.getAllParamsFromDB(ctx, infraProviderResource, infraProvider) if err != nil { - return nil, fmt.Errorf("could not get all params from DB while finding: %w", err) + return nil, nil, fmt.Errorf("could not get all params from DB while finding: %w", err) } - return allParams, nil + return allParams, configMetadata, nil } func getGitspaceScheme(ideType enum.IDEType, gitspaceSchemeFromMetadata string) (string, error) { @@ -185,12 +190,12 @@ func (i InfraProvisioner) getAllParamsFromDB( ctx context.Context, infraProviderResource types.InfraProviderResource, infraProvider infraprovider.InfraProvider, -) ([]types.InfraProviderParameter, error) { +) ([]types.InfraProviderParameter, map[string]any, error) { var allParams []types.InfraProviderParameter templateParams, err := i.getTemplateParams(ctx, infraProvider, infraProviderResource) if err != nil { - return nil, err + return nil, nil, err } allParams = append(allParams, templateParams...) @@ -199,7 +204,12 @@ func (i InfraProvisioner) getAllParamsFromDB( allParams = append(allParams, params...) - return allParams, nil + configMetadata, err := i.configMetadata(ctx, infraProviderResource) + if err != nil { + return nil, nil, err + } + + return allParams, configMetadata, nil } func (i InfraProvisioner) getTemplateParams( @@ -256,3 +266,14 @@ func (i InfraProvisioner) paramsFromResource( } return params } + +func (i InfraProvisioner) configMetadata( + ctx context.Context, + infraProviderResource types.InfraProviderResource, +) (map[string]any, error) { + infraProviderConfig, err := i.infraProviderConfigStore.Find(ctx, infraProviderResource.InfraProviderConfigID) + if err != nil { + return nil, err + } + return infraProviderConfig.Metadata, nil +} diff --git a/app/gitspace/infrastructure/trigger_infra_event.go b/app/gitspace/infrastructure/trigger_infra_event.go index 7e01eec0e..67f0d428e 100644 --- a/app/gitspace/infrastructure/trigger_infra_event.go +++ b/app/gitspace/infrastructure/trigger_infra_event.go @@ -148,7 +148,7 @@ func (i InfraProvisioner) provisionNewInfrastructure( } infraProviderResource := gitspaceConfig.InfraProviderResource - allParams, err := i.getAllParamsFromDB(ctx, infraProviderResource, infraProvider) + allParams, configMetadata, err := i.getAllParamsFromDB(ctx, infraProviderResource, infraProvider) if err != nil { return fmt.Errorf("could not get all params from DB while provisioning: %w", err) } @@ -190,6 +190,7 @@ func (i InfraProvisioner) provisionNewInfrastructure( agentPort, requiredGitspacePorts, allParams, + configMetadata, ) if err != nil { infraProvisioned.InfraStatus = enum.InfraStatusUnknown @@ -215,7 +216,7 @@ func (i InfraProvisioner) provisionExistingInfrastructure( gitspaceConfig types.GitspaceConfig, requiredGitspacePorts []types.GitspacePort, ) error { - allParams, err := i.getAllParamsFromDB(ctx, gitspaceConfig.InfraProviderResource, infraProvider) + allParams, configMetadata, err := i.getAllParamsFromDB(ctx, gitspaceConfig.InfraProviderResource, infraProvider) if err != nil { return fmt.Errorf("could not get all params from DB while provisioning: %w", err) } @@ -234,6 +235,7 @@ func (i InfraProvisioner) provisionExistingInfrastructure( 0, // NOTE: Agent port is not required for provisioning type Existing. requiredGitspacePorts, allParams, + configMetadata, ) if err != nil { return fmt.Errorf( diff --git a/app/services/infraprovider/update_config.go b/app/services/infraprovider/update_config.go index a3c04fc6f..f72399d65 100644 --- a/app/services/infraprovider/update_config.go +++ b/app/services/infraprovider/update_config.go @@ -28,6 +28,14 @@ func (c *Service) UpdateConfig(ctx context.Context, infraProviderConfig *types.I return err } + existingConfig, err := c.infraProviderConfigStore.FindByIdentifier(ctx, infraProviderConfig.SpaceID, + infraProviderConfig.Identifier) + if err != nil { + return fmt.Errorf("could not find infraprovider config %s before updating: %w", + infraProviderConfig.Identifier, err) + } + + infraProviderConfig.ID = existingConfig.ID infraProviderConfig.Updated = time.Now().UnixMilli() err = c.infraProviderConfigStore.Update(ctx, infraProviderConfig) if err != nil { diff --git a/app/store/database/infra_provider_config.go b/app/store/database/infra_provider_config.go index 2e0eff969..f1f8ba374 100644 --- a/app/store/database/infra_provider_config.go +++ b/app/store/database/infra_provider_config.go @@ -222,9 +222,13 @@ func (i infraProviderConfigStore) mapToInfraProviderConfigs( func (i infraProviderConfigStore) mapToInternalInfraProviderConfig( in *types.InfraProviderConfig, ) (*infraProviderConfig, error) { - jsonBytes, marshalErr := json.Marshal(in.Metadata) - if marshalErr != nil { - return nil, marshalErr + var jsonBytes []byte + var marshalErr error + if len(in.Metadata) > 0 { + jsonBytes, marshalErr = json.Marshal(in.Metadata) + if marshalErr != nil { + return nil, marshalErr + } } infraProviderConfigEntity := &infraProviderConfig{ Identifier: in.Identifier, diff --git a/infraprovider/docker_provider.go b/infraprovider/docker_provider.go index 0666ff71d..faa1d5fc1 100644 --- a/infraprovider/docker_provider.go +++ b/infraprovider/docker_provider.go @@ -59,6 +59,7 @@ func (d DockerProvider) Provision( _ int, requiredGitspacePorts []types.GitspacePort, inputParameters []types.InfraProviderParameter, + _ map[string]any, ) error { dockerClient, err := d.dockerClientFactory.NewDockerClient(ctx, types.Infrastructure{ ProviderType: enum.InfraProviderTypeDocker, @@ -128,6 +129,7 @@ func (d DockerProvider) Find( _ int, _ []types.GitspacePort, inputParameters []types.InfraProviderParameter, + _ map[string]any, ) (*types.Infrastructure, error) { dockerClient, err := d.dockerClientFactory.NewDockerClient(ctx, types.Infrastructure{ ProviderType: enum.InfraProviderTypeDocker, diff --git a/infraprovider/infra_provider.go b/infraprovider/infra_provider.go index f108364ac..f20d67ac4 100644 --- a/infraprovider/infra_provider.go +++ b/infraprovider/infra_provider.go @@ -32,6 +32,7 @@ type InfraProvider interface { agentPort int, requiredGitspacePorts []types.GitspacePort, inputParameters []types.InfraProviderParameter, + configMetadata map[string]any, ) error // Find finds infrastructure provisioned against a gitspace. @@ -44,6 +45,7 @@ type InfraProvider interface { agentPort int, requiredGitspacePorts []types.GitspacePort, inputParameters []types.InfraProviderParameter, + configMetadata map[string]any, ) (*types.Infrastructure, error) // Stop frees up the resources allocated against a gitspace, which can be freed.