diff --git a/tools/data-api-repository/repository/helpers/filesystem.go b/tools/data-api-repository/repository/helpers/filesystem.go index 65c211e467a..7d1c58edb5d 100644 --- a/tools/data-api-repository/repository/helpers/filesystem.go +++ b/tools/data-api-repository/repository/helpers/filesystem.go @@ -69,23 +69,30 @@ func (f *FileSystem) Stage(path FilePath, body any) error { return fmt.Errorf("internal-error: unexpected file extension %q for %q", fileExtension, path) } -func PersistFileSystem(workingDirectory string, dataType models.SourceDataType, serviceName string, input *FileSystem, logger hclog.Logger) error { - // TODO: note this is going to need to take SourceDataOrigin into account too +func PersistFileSystem(workingDirectory string, dataType models.SourceDataType, relativeOutputDirectory string, serviceName *string, input *FileSystem, logger hclog.Logger) error { + // TODO: note this is going to need to take SourceDataOrigin into account too (manicminer: should it? SourceDataOrigin seems to be a separate concern?) rootDir := filepath.Join(workingDirectory, string(dataType)) logger.Trace(fmt.Sprintf("Persisting files into %q", rootDir)) + outputDir := filepath.Join(rootDir, relativeOutputDirectory) + // Delete any existing directory with this service name - serviceDir := filepath.Join(rootDir, serviceName) - logger.Debug(fmt.Sprintf("Removing any existing Directory for Service %q", serviceName)) - _ = os.RemoveAll(serviceDir) - if err := os.MkdirAll(serviceDir, directoryPermissions); err != nil { - return fmt.Errorf("recreating directory %q: %+v", serviceDir, err) + // TODO: (manicminer: is this really needed since there is a RemoveService() method to achieve this? we don't always want to blow away the entire service) + //logging.Log.Debug(fmt.Sprintf("Removing any existing Directory for Service %q", serviceName)) + //_ = os.RemoveAll(outputDir) + + if err := os.MkdirAll(outputDir, directoryPermissions); err != nil { + return fmt.Errorf("recreating directory %q: %+v", outputDir, err) } // pull out a list of directories directories := uniqueDirectories(input.f) - logger.Debug(fmt.Sprintf("Creating directories for Service %q", serviceName)) + if serviceName != nil { + logger.Debug(fmt.Sprintf("Creating directories for Service %q", *serviceName)) + } else { + logger.Debug("Creating directories") + } for _, dir := range directories { dirPath := filepath.Join(rootDir, dir) if err := os.MkdirAll(dirPath, directoryPermissions); err != nil { diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_common_types.go b/tools/data-api-repository/repository/remove_common_types.go similarity index 97% rename from tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_common_types.go rename to tools/data-api-repository/repository/remove_common_types.go index a07ae08a4bc..2f0c2910d43 100644 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_common_types.go +++ b/tools/data-api-repository/repository/remove_common_types.go @@ -1,7 +1,7 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -package dataapigeneratorjson +package repository import ( "fmt" diff --git a/tools/data-api-repository/repository/remove_service.go b/tools/data-api-repository/repository/remove_service.go index 348b66b8f9f..de7fb57e5bb 100644 --- a/tools/data-api-repository/repository/remove_service.go +++ b/tools/data-api-repository/repository/remove_service.go @@ -20,6 +20,9 @@ type RemoveServiceOptions struct { // SourceDataType specifies the type of the source data (e.g. ResourceManagerSourceDataType). SourceDataType models.SourceDataType + + // Version is an optional API version to remove. When omitted, all versions are removed. + Version string } // RemoveService removes any existing API Definitions for the Service specified in opts. @@ -27,6 +30,11 @@ func (r repositoryImpl) RemoveService(opts RemoveServiceOptions) error { // TODO: note this is going to need to take SourceDataOrigin into account too serviceDirectory := path.Join(r.workingDirectory, string(opts.SourceDataType), opts.ServiceName) + + if opts.Version != "" { + serviceDirectory = path.Join(serviceDirectory, opts.Version) + } + if err := os.RemoveAll(serviceDirectory); err != nil && os.IsNotExist(err) { return fmt.Errorf("removing any existing directory at %q: %+v", serviceDirectory, err) } diff --git a/tools/data-api-repository/repository/repository.go b/tools/data-api-repository/repository/repository.go index 93aff997bf8..b8ab5cc742a 100644 --- a/tools/data-api-repository/repository/repository.go +++ b/tools/data-api-repository/repository/repository.go @@ -8,6 +8,12 @@ import "github.com/hashicorp/go-hclog" // Repository is an interface defining how to load and save API Definitions from disk. // This interface is designed to allow the implementation to be switched out for testing purposes if needed. type Repository interface { + // RemoveCommonTypes removes any existing Common Types Definitions> + RemoveCommonTypes(opts RemoveCommonTypesOptions) error + + // SaveCommonTypes persists the Common Types Definitions. + SaveCommonTypes(opts SaveCommonTypesOptions) error + // RemoveService removes any existing API Definitions for the Service specified in opts. RemoveService(opts RemoveServiceOptions) error diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_common_types.go b/tools/data-api-repository/repository/save_common_types.go similarity index 67% rename from tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_common_types.go rename to tools/data-api-repository/repository/save_common_types.go index e8f93a18941..360e29776a2 100644 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_common_types.go +++ b/tools/data-api-repository/repository/save_common_types.go @@ -1,24 +1,20 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -package dataapigeneratorjson +package repository import ( "fmt" "path/filepath" + "github.com/hashicorp/pandora/tools/data-api-repository/repository/helpers" + "github.com/hashicorp/pandora/tools/data-api-repository/repository/stages" "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" ) const commonTypesDirectoryName = "common-types" type SaveCommonTypesOptions struct { - // AzureRestAPISpecsGitSHA specifies the Git Commit SHA that these API Definitions were imported from. - AzureRestAPISpecsGitSHA *string - // ResourceProvider optionally specifies the Azure Resource Provider associated with this Service. // This is only present when SourceDataType is ResourceManagerSourceDataType. ResourceProvider *string @@ -26,6 +22,9 @@ type SaveCommonTypesOptions struct { // CommonTypes specifies the CommonTypes to be saved. CommonTypes map[string]models.CommonTypes + // SourceCommitSHA specifies the Git Commit SHA that these API Definitions were imported from. + SourceCommitSHA *string + // SourceDataOrigin specifies the origin of this set of source data (e.g. AzureRestAPISpecsSourceDataOrigin). SourceDataOrigin models.SourceDataOrigin @@ -35,12 +34,12 @@ type SaveCommonTypesOptions struct { // SaveCommonTypes persists the Common Types Definitions for the specified version. func (r repositoryImpl) SaveCommonTypes(opts SaveCommonTypesOptions) error { - logging.Log.Info("Processing Common Types") + r.logger.Info("Processing Common Types") items := make([]stages.Stage, 0) for apiVersion, commonTypes := range opts.CommonTypes { - logging.Log.Info(fmt.Sprintf("Processing Common Types for API Version %q..", apiVersion)) + r.logger.Info(fmt.Sprintf("Processing Common Types for API Version %q..", apiVersion)) items = append(items, stages.ConstantStage{ Constants: commonTypes.Constants, OutputDirectory: filepath.Join(commonTypesDirectoryName, apiVersion), @@ -57,16 +56,16 @@ func (r repositoryImpl) SaveCommonTypes(opts SaveCommonTypesOptions) error { fs := helpers.NewFileSystem() - logging.Log.Debug("Running stages..") + r.logger.Debug("Running stages..") for _, stage := range items { - logging.Log.Trace(fmt.Sprintf("Processing Stage %q", stage.Name())) - if err := stage.Generate(fs); err != nil { + r.logger.Trace(fmt.Sprintf("Processing Stage %q", stage.Name())) + if err := stage.Generate(fs, r.logger); err != nil { return fmt.Errorf("running Stage %q: %+v", stage.Name(), err) } } - logging.Log.Debug("Persisting files to disk..") - if err := helpers.PersistFileSystem(r.workingDirectory, opts.SourceDataType, commonTypesDirectoryName, nil, fs); err != nil { + r.logger.Debug("Persisting files to disk..") + if err := helpers.PersistFileSystem(r.workingDirectory, opts.SourceDataType, commonTypesDirectoryName, nil, fs, r.logger); err != nil { return fmt.Errorf("persisting files: %+v", err) } diff --git a/tools/data-api-repository/repository/save_service.go b/tools/data-api-repository/repository/save_service.go index 277ab2cdd62..d2436aa2047 100644 --- a/tools/data-api-repository/repository/save_service.go +++ b/tools/data-api-repository/repository/save_service.go @@ -5,6 +5,7 @@ package repository import ( "fmt" + "path/filepath" "github.com/hashicorp/pandora/tools/data-api-repository/repository/helpers" "github.com/hashicorp/pandora/tools/data-api-repository/repository/stages" @@ -12,6 +13,10 @@ import ( ) type SaveServiceOptions struct { + // CommonTypes specifies a map of API Version (key) to CommonTypes (value) + // which defines the available Common Types for this Service. + CommonTypes map[string]models.CommonTypes + // ResourceProvider optionally specifies the Azure Resource Provider associated with this Service. // This is only present when SourceDataType is ResourceManagerSourceDataType. ResourceProvider *string @@ -65,25 +70,24 @@ func (r repositoryImpl) SaveService(opts SaveServiceOptions) error { // Output the API Definitions for this APIResource items = append(items, stages.ConstantStage{ - ServiceName: opts.ServiceName, - APIVersion: apiVersion, - APIResource: apiResourceName, - Constants: apiResourceDetails.Constants, - ResourceIDs: apiResourceDetails.ResourceIDs, + Constants: apiResourceDetails.Constants, + OutputDirectory: filepath.Join(opts.ServiceName, apiVersion, apiResourceName), + ResourceIDs: apiResourceDetails.ResourceIDs, }) items = append(items, stages.ModelsStage{ - ServiceName: opts.ServiceName, - APIVersion: apiVersion, - APIResource: apiResourceName, - Constants: apiResourceDetails.Constants, - Models: apiResourceDetails.Models, + APIVersion: apiVersion, + CommonTypes: opts.CommonTypes, + Constants: apiResourceDetails.Constants, + Models: apiResourceDetails.Models, + OutputDirectory: filepath.Join(opts.ServiceName, apiVersion, apiResourceName), }) items = append(items, stages.OperationsStage{ ServiceName: opts.ServiceName, APIVersion: apiVersion, APIResource: apiResourceName, + CommonTypes: opts.CommonTypes, Constants: apiResourceDetails.Constants, Models: apiResourceDetails.Models, Operations: apiResourceDetails.Operations, @@ -137,7 +141,7 @@ func (r repositoryImpl) SaveService(opts SaveServiceOptions) error { // TODO: ensure that any existing directory for this service is removed r.logger.Debug("Persisting files to disk..") - if err := helpers.PersistFileSystem(r.workingDirectory, opts.SourceDataType, opts.ServiceName, fs, r.logger); err != nil { + if err := helpers.PersistFileSystem(r.workingDirectory, opts.SourceDataType, opts.ServiceName, &opts.ServiceName, fs, r.logger); err != nil { return fmt.Errorf("persisting files: %+v", err) } diff --git a/tools/data-api-repository/repository/stages/constants.go b/tools/data-api-repository/repository/stages/constants.go index 8129725fdf3..940e4128a94 100644 --- a/tools/data-api-repository/repository/stages/constants.go +++ b/tools/data-api-repository/repository/stages/constants.go @@ -16,22 +16,16 @@ import ( var _ Stage = ConstantStage{} type ConstantStage struct { - // APIVersion specifies the APIVersion within the Service where the Constants exist. - APIVersion string - - // APIResource specifies the APIResource within the APIVersion where the Constants exist. - APIResource string - // Constants specifies the map of Constant Name (key) to SDKConstant (value) which should be // persisted. Constants map[string]models.SDKConstant + // OutputDirectory specifies the path where constants should be persisted. + OutputDirectory string + // ResourceIDs specifies a map of Resource ID Name (key) to ResourceID (value) that should // be persisted. ResourceIDs map[string]models.ResourceID - - // ServiceName specifies the name of the Service within which the Constants exist. - ServiceName string } func (g ConstantStage) Name() string { @@ -41,6 +35,10 @@ func (g ConstantStage) Name() string { func (g ConstantStage) Generate(input *helpers.FileSystem, logger hclog.Logger) error { logger.Debug("Generating Constants") + if g.OutputDirectory == "" { + return fmt.Errorf("internal: OutputDirectory cannot be empty") + } + for constantName, constantVal := range g.Constants { logger.Trace(fmt.Sprintf("Processing Constant %q", constantName)) @@ -49,8 +47,7 @@ func (g ConstantStage) Generate(input *helpers.FileSystem, logger hclog.Logger) return fmt.Errorf("mapping SDKConstant %q: %+v", constantName, err) } - // {workingDirectory}/Service/APIVersion/APIResource/Constant-{Name}.json - path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("Constant-%s.json", constantName)) + path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Constant-%s.json", constantName)) logger.Trace(fmt.Sprintf("Staging to %s", path)) if err := input.Stage(path, *mapped); err != nil { return fmt.Errorf("staging Constant %q: %+v", constantName, err) @@ -69,8 +66,7 @@ func (g ConstantStage) Generate(input *helpers.FileSystem, logger hclog.Logger) return fmt.Errorf("mapping SDKConstant %q: %+v", constantName, err) } - // {workingDirectory}/Service/APIVersion/APIResource/Constant-{Name}.json - path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("Constant-%s.json", constantName)) + path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Constant-%s.json", constantName)) logger.Trace(fmt.Sprintf("Staging to %s", path)) if err := input.Stage(path, *mapped); err != nil { return fmt.Errorf("staging Constant %q: %+v", constantName, err) diff --git a/tools/data-api-repository/repository/stages/models.go b/tools/data-api-repository/repository/stages/models.go index 60af912e670..85cdab29998 100644 --- a/tools/data-api-repository/repository/stages/models.go +++ b/tools/data-api-repository/repository/stages/models.go @@ -19,8 +19,9 @@ type ModelsStage struct { // APIVersion specifies the APIVersion within the Service where the Models exist. APIVersion string - // APIResource specifies the APIResource within the APIVersion where the Models exist. - APIResource string + // CommonTypes specifies a map of API Version (key) to CommonTypes (value) + // which defines the available Common Types for this Service. + CommonTypes map[string]models.CommonTypes // Constants specifies the map of Constant Name (key) to SDKConstant (value) which should be // persisted. @@ -30,12 +31,17 @@ type ModelsStage struct { // persisted. Models map[string]models.SDKModel - // ServiceName specifies the name of the Service within which the Models exist. - ServiceName string + // OutputDirectory specifies the path where constants should be persisted. + OutputDirectory string } func (g ModelsStage) Generate(input *helpers.FileSystem, logger hclog.Logger) error { logger.Debug("Generating Models") + + if g.OutputDirectory == "" { + return fmt.Errorf("internal: OutputDirectory cannot be empty") + } + for modelName := range g.Models { logger.Trace(fmt.Sprintf("Generating Model %q..", modelName)) modelValue := g.Models[modelName] @@ -49,15 +55,19 @@ func (g ModelsStage) Generate(input *helpers.FileSystem, logger hclog.Logger) er } } - mapped, err := transforms.MapSDKModelToRepository(modelName, modelValue, parent, g.Constants, g.Models) + var commonTypes models.CommonTypes + if commonTypesForVersion, ok := g.CommonTypes[g.APIVersion]; ok { + commonTypes = commonTypesForVersion + } + + mapped, err := transforms.MapSDKModelToRepository(modelName, modelValue, parent, g.Constants, g.Models, commonTypes) if err != nil { return fmt.Errorf("mapping model %q: %+v", modelName, err) } - // {workingDirectory}/Service/APIVersion/APIResource/Model-{Name}.json - path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("Model-%s.json", modelName)) + path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Model-%s.json", modelName)) logger.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { + if err = input.Stage(path, *mapped); err != nil { return fmt.Errorf("staging Model %q: %+v", modelName, err) } } diff --git a/tools/data-api-repository/repository/stages/operations.go b/tools/data-api-repository/repository/stages/operations.go index 72160450133..31f79652592 100644 --- a/tools/data-api-repository/repository/stages/operations.go +++ b/tools/data-api-repository/repository/stages/operations.go @@ -30,6 +30,10 @@ type OperationsStage struct { // persisted. Models map[string]models.SDKModel + // CommonTypes specifies a map of API Version (key) to CommonTypes (value) + // which defines the available Common Types for this Service. + CommonTypes map[string]models.CommonTypes + // Operations specifies the map of Operation Name (key) to SDKOperation (value) which should be // persisted. Operations map[string]models.SDKOperation @@ -44,7 +48,13 @@ func (g OperationsStage) Generate(input *helpers.FileSystem, logger hclog.Logger logger.Trace(fmt.Sprintf("Generating Operation %q..", operationName)) operationDetails := g.Operations[operationName] - mapped, err := transforms.MapSDKOperationToRepository(operationName, operationDetails, g.Constants, g.Models) + + var commonTypes models.CommonTypes + if commonTypesForVersion, ok := g.CommonTypes[g.APIVersion]; ok { + commonTypes = commonTypesForVersion + } + + mapped, err := transforms.MapSDKOperationToRepository(operationName, operationDetails, g.Constants, g.Models, commonTypes) if err != nil { return fmt.Errorf("mapping Operation %q: %+v", operationName, err) } @@ -52,7 +62,7 @@ func (g OperationsStage) Generate(input *helpers.FileSystem, logger hclog.Logger // {workingDirectory}/Service/APIVersion/APIResource/Operation-{Name}.json path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("Operation-%s.json", operationName)) logger.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { + if err = input.Stage(path, *mapped); err != nil { return fmt.Errorf("staging Operation %q: %+v", operationName, err) } } diff --git a/tools/data-api-repository/repository/transforms/sdk_field.go b/tools/data-api-repository/repository/transforms/sdk_field.go index 6fce6e3b2f4..486f0ad0693 100644 --- a/tools/data-api-repository/repository/transforms/sdk_field.go +++ b/tools/data-api-repository/repository/transforms/sdk_field.go @@ -10,9 +10,9 @@ import ( sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" ) -func mapSDKFieldToRepository(fieldName string, fieldDetails sdkModels.SDKField, isTypeHint bool, constants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel) (*repositoryModels.ModelField, error) { +func mapSDKFieldToRepository(fieldName string, fieldDetails sdkModels.SDKField, isTypeHint bool, constants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) (*repositoryModels.ModelField, error) { // TODO: thread through logging - objectDefinition, err := mapSDKObjectDefinitionToRepository(fieldDetails.ObjectDefinition, constants, knownModels) + objectDefinition, err := mapSDKObjectDefinitionToRepository(fieldDetails.ObjectDefinition, constants, knownModels, commonTypes) if err != nil { return nil, fmt.Errorf("mapping the ObjectDefinition for field %q: %+v", fieldName, err) } diff --git a/tools/data-api-repository/repository/transforms/sdk_field_object_definition.go b/tools/data-api-repository/repository/transforms/sdk_field_object_definition.go index aaf1e083b39..1760f4ad7d2 100644 --- a/tools/data-api-repository/repository/transforms/sdk_field_object_definition.go +++ b/tools/data-api-repository/repository/transforms/sdk_field_object_definition.go @@ -11,7 +11,7 @@ import ( sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" ) -func mapSDKObjectDefinitionToRepository(details sdkModels.SDKObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel) (*repositoryModels.ObjectDefinition, error) { +func mapSDKObjectDefinitionToRepository(details sdkModels.SDKObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) (*repositoryModels.ObjectDefinition, error) { typeVal, ok := internalObjectDefinitionsToObjectDefinitionTypes[details.Type] if !ok { return nil, fmt.Errorf("internal-error: no ObjectDefinition mapping is defined for the ObjectDefinition Type %q", string(details.Type)) @@ -27,8 +27,12 @@ func mapSDKObjectDefinitionToRepository(details sdkModels.SDKObjectDefinition, c output.ReferenceName = details.ReferenceName } + if details.ReferenceNameIsCommonType != nil { + output.ReferenceNameIsCommonType = details.ReferenceNameIsCommonType + } + if details.NestedItem != nil { - nestedItem, err := mapSDKObjectDefinitionToRepository(*details.NestedItem, constants, models) + nestedItem, err := mapSDKObjectDefinitionToRepository(*details.NestedItem, constants, models, commonTypes) if err != nil { return nil, fmt.Errorf("mapping nested object definition: %+v", err) } @@ -48,14 +52,14 @@ func mapSDKObjectDefinitionToRepository(details sdkModels.SDKObjectDefinition, c } // finally let's do some sanity-checking to ensure the data being output looks legit - if err := validateObjectDefinition(output, constants, models); err != nil { + if err := validateObjectDefinition(output, constants, models, commonTypes); err != nil { return nil, fmt.Errorf("validating mapped ObjectDefinition: %+v", err) } return &output, nil } -func validateObjectDefinition(input repositoryModels.ObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel) error { +func validateObjectDefinition(input repositoryModels.ObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) error { requiresNestedItem := input.Type == repositoryModels.CsvObjectDefinitionType || input.Type == repositoryModels.DictionaryObjectDefinitionType || input.Type == repositoryModels.ListObjectDefinitionType @@ -71,13 +75,30 @@ func validateObjectDefinition(input repositoryModels.ObjectDefinition, constants return fmt.Errorf("a Reference must be specified for a %q type but didn't get one", string(input.Type)) } - _, isConstant := constants[*input.ReferenceName] - _, isModel := models[*input.ReferenceName] - if !isConstant && !isModel { - return fmt.Errorf("reference %q was not found as a constant or a model", *input.ReferenceName) + _, isLocalConstant := constants[*input.ReferenceName] + _, isLocalModel := models[*input.ReferenceName] + var isCommonConstant, isCommonModel bool + if commonTypes.Constants != nil { + _, isCommonConstant = commonTypes.Constants[*input.ReferenceName] } - if isConstant && isModel { - return fmt.Errorf("internal-error: %q was found as BOTH a Constant and a Model", *input.ReferenceName) + if commonTypes.Models != nil { + _, isCommonModel = commonTypes.Models[*input.ReferenceName] + } + + if input.ReferenceNameIsCommonType != nil && *input.ReferenceNameIsCommonType { + if !isCommonConstant && !isCommonModel { + return fmt.Errorf("reference %q was not found as a common constant or model", *input.ReferenceName) + } + if isCommonConstant && isCommonModel { + return fmt.Errorf("internal-error: %q was found as BOTH a common constant and model", *input.ReferenceName) + } + } else { + if !isLocalConstant && !isLocalModel { + return fmt.Errorf("reference %q was not found as a local constant or model", *input.ReferenceName) + } + if isLocalConstant && isLocalModel { + return fmt.Errorf("internal-error: %q was found as BOTH a local constant and model", *input.ReferenceName) + } } } if !requiresReference && input.ReferenceName != nil { diff --git a/tools/data-api-repository/repository/transforms/sdk_model.go b/tools/data-api-repository/repository/transforms/sdk_model.go index f0f309b11fa..2bbaabf04ad 100644 --- a/tools/data-api-repository/repository/transforms/sdk_model.go +++ b/tools/data-api-repository/repository/transforms/sdk_model.go @@ -12,12 +12,12 @@ import ( sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" ) -func MapSDKModelToRepository(modelName string, model sdkModels.SDKModel, parentModel *sdkModels.SDKModel, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel) (*repositoryModels.Model, error) { +func MapSDKModelToRepository(modelName string, model sdkModels.SDKModel, parentModel *sdkModels.SDKModel, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) (*repositoryModels.Model, error) { if len(model.Fields) == 0 { return nil, fmt.Errorf("the model %q has no fields", modelName) } - fields, err := mapSDKFieldsForModel(model, parentModel, knownConstants, knownModels) + fields, err := mapSDKFieldsForModel(model, parentModel, knownConstants, knownModels, commonTypes) if err != nil { return nil, fmt.Errorf("mapping fields for model %q: %+v", modelName, err) } @@ -42,7 +42,7 @@ func MapSDKModelToRepository(modelName string, model sdkModels.SDKModel, parentM return &dataApiModel, nil } -func mapSDKFieldsForModel(model sdkModels.SDKModel, parentModel *sdkModels.SDKModel, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel) (*[]repositoryModels.ModelField, error) { +func mapSDKFieldsForModel(model sdkModels.SDKModel, parentModel *sdkModels.SDKModel, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) (*[]repositoryModels.ModelField, error) { // ensure consistency in the output sortedFieldNames := make([]string, 0) for fieldName := range model.Fields { @@ -72,7 +72,7 @@ func mapSDKFieldsForModel(model sdkModels.SDKModel, parentModel *sdkModels.SDKMo field := model.Fields[fieldName] isTypeHint := model.FieldNameContainingDiscriminatedValue != nil && strings.EqualFold(*model.FieldNameContainingDiscriminatedValue, fieldName) - fieldCode, err := mapSDKFieldToRepository(fieldName, field, isTypeHint, knownConstants, knownModels) + fieldCode, err := mapSDKFieldToRepository(fieldName, field, isTypeHint, knownConstants, knownModels, commonTypes) if err != nil { return nil, fmt.Errorf("generating code for field %q: %+v", fieldName, err) } diff --git a/tools/data-api-repository/repository/transforms/sdk_operation.go b/tools/data-api-repository/repository/transforms/sdk_operation.go index 6d8a931e7a2..0d85a81d8bd 100644 --- a/tools/data-api-repository/repository/transforms/sdk_operation.go +++ b/tools/data-api-repository/repository/transforms/sdk_operation.go @@ -13,7 +13,7 @@ import ( sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" ) -func MapSDKOperationToRepository(operationName string, input sdkModels.SDKOperation, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel) (*repositoryModels.Operation, error) { +func MapSDKOperationToRepository(operationName string, input sdkModels.SDKOperation, knownConstants map[string]sdkModels.SDKConstant, knownModels map[string]sdkModels.SDKModel, knownCommonTypes sdkModels.CommonTypes) (*repositoryModels.Operation, error) { contentType := input.ContentType if strings.Contains(strings.ToLower(contentType), "application/json") { contentType = fmt.Sprintf("%s; charset=utf-8", contentType) @@ -31,7 +31,7 @@ func MapSDKOperationToRepository(operationName string, input sdkModels.SDKOperat } if input.RequestObject != nil { - requestObject, err := mapSDKObjectDefinitionToRepository(*input.RequestObject, knownConstants, knownModels) + requestObject, err := mapSDKObjectDefinitionToRepository(*input.RequestObject, knownConstants, knownModels, knownCommonTypes) if err != nil { return nil, fmt.Errorf("mapping the request object definition: %+v", err) } @@ -39,7 +39,7 @@ func MapSDKOperationToRepository(operationName string, input sdkModels.SDKOperat } if input.ResponseObject != nil { - responseObject, err := mapSDKObjectDefinitionToRepository(*input.ResponseObject, knownConstants, knownModels) + responseObject, err := mapSDKObjectDefinitionToRepository(*input.ResponseObject, knownConstants, knownModels, knownCommonTypes) if err != nil { return nil, fmt.Errorf("mapping the response object definition: %+v", err) } @@ -57,7 +57,7 @@ func MapSDKOperationToRepository(operationName string, input sdkModels.SDKOperat for _, optionName := range sortedOptionsKeys { optionDetails := input.Options[optionName] - optionObjectDefinition, err := mapSDKOperationOptionToRepository(optionDetails.ObjectDefinition, knownConstants, knownModels) + optionObjectDefinition, err := mapSDKOperationOptionToRepository(optionDetails.ObjectDefinition, knownConstants, knownModels, knownCommonTypes) if err != nil { return nil, fmt.Errorf("mapping the object definition: %+v", err) } diff --git a/tools/data-api-repository/repository/transforms/sdk_operation_option.go b/tools/data-api-repository/repository/transforms/sdk_operation_option.go index 44e61836246..76eb5f63e2b 100644 --- a/tools/data-api-repository/repository/transforms/sdk_operation_option.go +++ b/tools/data-api-repository/repository/transforms/sdk_operation_option.go @@ -20,7 +20,7 @@ var sdkOperationOptionsToRepository = map[sdkModels.SDKOperationOptionObjectDefi sdkModels.StringSDKOperationOptionObjectDefinitionType: repositoryModels.StringOptionObjectDefinitionType, } -func mapSDKOperationOptionToRepository(definition sdkModels.SDKOperationOptionObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel) (*repositoryModels.OptionObjectDefinition, error) { +func mapSDKOperationOptionToRepository(definition sdkModels.SDKOperationOptionObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) (*repositoryModels.OptionObjectDefinition, error) { typeVal, ok := sdkOperationOptionsToRepository[definition.Type] if !ok { return nil, fmt.Errorf("internal-error: no OptionObjectDefinition mapping is defined for the OptionObjectDefinition Type %q", string(definition.Type)) @@ -37,7 +37,7 @@ func mapSDKOperationOptionToRepository(definition sdkModels.SDKOperationOptionOb } if definition.NestedItem != nil { - nestedItem, err := mapSDKOperationOptionToRepository(*definition.NestedItem, constants, models) + nestedItem, err := mapSDKOperationOptionToRepository(*definition.NestedItem, constants, models, commonTypes) if err != nil { return nil, fmt.Errorf("mapping nested option object definition: %+v", err) } @@ -45,14 +45,14 @@ func mapSDKOperationOptionToRepository(definition sdkModels.SDKOperationOptionOb } // finally let's do some sanity-checking to ensure the data being output looks legit - if err := validateSDKOperationOptionObjectDefinition(output, constants, models); err != nil { + if err := validateSDKOperationOptionObjectDefinition(output, constants, models, commonTypes); err != nil { return nil, fmt.Errorf("validating mapped OptionObjectDefinition: %+v", err) } return &output, nil } -func validateSDKOperationOptionObjectDefinition(input repositoryModels.OptionObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel) error { +func validateSDKOperationOptionObjectDefinition(input repositoryModels.OptionObjectDefinition, constants map[string]sdkModels.SDKConstant, models map[string]sdkModels.SDKModel, commonTypes sdkModels.CommonTypes) error { requiresNestedItem := input.Type == repositoryModels.CsvOptionObjectDefinitionType || input.Type == repositoryModels.ListOptionObjectDefinitionType requiresReference := input.Type == repositoryModels.ReferenceOptionObjectDefinitionType if requiresNestedItem && input.NestedItem == nil { @@ -66,13 +66,18 @@ func validateSDKOperationOptionObjectDefinition(input repositoryModels.OptionObj return fmt.Errorf("a Reference must be specified for a %q type but didn't get one", string(input.Type)) } - _, isConstant := constants[*input.ReferenceName] - _, isModel := models[*input.ReferenceName] - if !isConstant && !isModel { - return fmt.Errorf("reference %q was not found as a constant or a model", *input.ReferenceName) + _, isLocalConstant := constants[*input.ReferenceName] + var isCommonConstant bool + if commonTypes.Constants != nil { + _, isCommonConstant = commonTypes.Constants[*input.ReferenceName] } - if isConstant && isModel { - return fmt.Errorf("internal-error: %q was found as BOTH a Constant and a Model", *input.ReferenceName) + + if input.ReferenceNameIsCommonType != nil && *input.ReferenceNameIsCommonType { + if !isCommonConstant { + return fmt.Errorf("reference %q was not found as a common constant or model", *input.ReferenceName) + } + } else if !isLocalConstant { + return fmt.Errorf("reference %q was not found as a local constant or model", *input.ReferenceName) } } if !requiresReference && input.ReferenceName != nil { diff --git a/tools/data-api/internal/endpoints/v1/transforms/terraform_resource_definition.go b/tools/data-api/internal/endpoints/v1/transforms/terraform_resource_definition.go index 0409bd5031e..249ad8c731c 100644 --- a/tools/data-api/internal/endpoints/v1/transforms/terraform_resource_definition.go +++ b/tools/data-api/internal/endpoints/v1/transforms/terraform_resource_definition.go @@ -72,7 +72,7 @@ func mapTerraformResourceDefinition(input repositories.TerraformResourceDetails) } // todo remove this when https://github.com/hashicorp/pandora/issues/3352 is fixed - // tests won't be added unless Generate is true when writing this out in dataapigeneratorjson/helpers.go writeTestsHclToFile + // tests won't be added unless Generate is true when writing this out in generatorjson/helpers.go writeTestsHclToFile // so we can set this to true if BasicConfiguration has been written out if output.Tests.BasicConfiguration != "" { output.Tests.Generate = true diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers/filesystem.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers/filesystem.go deleted file mode 100644 index 041b23707e8..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers/filesystem.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package helpers - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var directoryPermissions = os.FileMode(0755) - -// FilePath is a typealias to make it clearer what's being returned from this generationStage. -// This represents the path to a file on disk -type FilePath = string - -// FileBody is a typealias to make it clearer what's being returned from this generationStage. -type FileBody = []byte - -// FileSystem is an abstraction around a set of files within a working directory. -// It's intended to allow a representation around the API Definitions working directory -// containing a reference to both the files that _would_ be written (during saving/testing) -// and that exist (when loading the API Definitions from disk). -type FileSystem struct { - f map[FilePath]FileBody -} - -func NewFileSystem() *FileSystem { - return &FileSystem{ - f: map[FilePath]FileBody{}, - } -} - -// Stage stages the specified body at the specified path, ensuring that it's unique. -// This doesn't persist the file to disk, which is handled in PersistFileSystem. -func (f *FileSystem) Stage(path FilePath, body any) error { - if _, existing := f.f[path]; existing { - return fmt.Errorf("a duplicate file exists at the path %q", path) - } - - fileExtension := strings.ToLower(filepath.Ext(path)) - if fileExtension == ".hcl" { - str, ok := body.(string) - if !ok { - return fmt.Errorf("`body` must be a string for an `*.hcl` file but got %T", body) - } - - f.f[path] = []byte(str) - return nil - } - - if fileExtension == ".json" { - bytes, err := json.MarshalIndent(body, "", " ") - if err != nil { - return fmt.Errorf("marshalling file body for %q as json: %+v", path, err) - } - - f.f[path] = bytes - return nil - } - - return fmt.Errorf("internal-error: unexpected file extension %q for %q", fileExtension, path) -} - -func PersistFileSystem(workingDirectory string, dataType models.SourceDataType, relativeOutputDirectory string, serviceName *string, input *FileSystem) error { - // TODO: note this is going to need to take SourceDataOrigin into account too (manicminer: should it? SourceDataOrigin seems to be a separate concern?) - - rootDir := filepath.Join(workingDirectory, string(dataType)) - logging.Log.Trace(fmt.Sprintf("Persisting files into %q", rootDir)) - - outputDir := filepath.Join(rootDir, relativeOutputDirectory) - - // Delete any existing directory with this service name - // TODO: (manicminer: is this really needed since there is a RemoveService() method to achieve this? we don't always want to blow away the entire service) - //logging.Log.Debug(fmt.Sprintf("Removing any existing Directory for Service %q", serviceName)) - //_ = os.RemoveAll(outputDir) - - if err := os.MkdirAll(outputDir, directoryPermissions); err != nil { - return fmt.Errorf("recreating directory %q: %+v", outputDir, err) - } - - // pull out a list of directories - directories := uniqueDirectories(input.f) - if serviceName != nil { - logging.Log.Debug(fmt.Sprintf("Creating directories for Service %q", *serviceName)) - } else { - logging.Log.Debug("Creating directories") - } - for _, dir := range directories { - dirPath := filepath.Join(rootDir, dir) - if err := os.MkdirAll(dirPath, directoryPermissions); err != nil { - return fmt.Errorf("creating directory %q: %+v", dirPath, err) - } - } - - // write the files - for path, body := range input.f { - fileFullPath := filepath.Join(rootDir, path) - logging.Log.Trace(fmt.Sprintf("Writing file %q", fileFullPath)) - file, err := os.Create(fileFullPath) - if err != nil { - return fmt.Errorf("opening %q: %+v", fileFullPath, err) - } - - _, _ = file.Write(body) - _ = file.Close() - } - - return nil -} - -func uniqueDirectories(input map[FilePath]FileBody) []string { - directories := make(map[string]struct{}) - for path := range input { - dir := filepath.Dir(path) - directories[dir] = struct{}{} - } - - out := make([]string, 0) - for k := range directories { - out = append(out, k) - } - sort.Strings(out) - - return out -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_service.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_service.go deleted file mode 100644 index 4acc2b2f527..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/remove_service.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package dataapigeneratorjson - -import ( - "fmt" - "os" - "path" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" -) - -type RemoveServiceOptions struct { - // ServiceName specifies the name of this Service (e.g. `Compute`). - ServiceName string - - // SourceDataOrigin specifies the origin of this set of source data (e.g. AzureRestAPISpecsSourceDataOrigin). - SourceDataOrigin models.SourceDataOrigin - - // SourceDataType specifies the type of the source data (e.g. ResourceManagerSourceDataType). - SourceDataType models.SourceDataType - - // Version is an optional API version to remove. When omitted, all versions are removed. - Version string -} - -// RemoveService removes any existing API Definitions for the Service specified in opts. -func (r repositoryImpl) RemoveService(opts RemoveServiceOptions) error { - // TODO: note this is going to need to take SourceDataOrigin into account too - - serviceDirectory := path.Join(r.workingDirectory, string(opts.SourceDataType), opts.ServiceName) - - if opts.Version != "" { - serviceDirectory = path.Join(serviceDirectory, opts.Version) - } - - if err := os.RemoveAll(serviceDirectory); err != nil && os.IsNotExist(err) { - return fmt.Errorf("removing any existing directory at %q: %+v", serviceDirectory, err) - } - - return nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/repository.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/repository.go deleted file mode 100644 index c451d024751..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/repository.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package dataapigeneratorjson - -// Repository is an interface defining how to load and save API Definitions from disk. -// This interface is designed to allow the implementation to be switched out for testing purposes if needed. -type Repository interface { - // RemoveService removes any existing API Definitions for the Service specified in opts. - RemoveService(opts RemoveServiceOptions) error - - // SaveService persists the API Definitions for the Service specified in opts. - SaveService(opts SaveServiceOptions) error - - // TODO: LoadService - // TODO: LoadServices - - // RemoveCommonTypes removes any existing Common Types Definitions> - RemoveCommonTypes(opts RemoveCommonTypesOptions) error - - // SaveCommonTypes persists the Common Types Definitions. - SaveCommonTypes(opts SaveCommonTypesOptions) error -} - -// NewRepository returns an instance of Repository configured for the working directory. -func NewRepository(workingDirectory string) Repository { - return repositoryImpl{ - workingDirectory: workingDirectory, - } -} - -var _ Repository = &repositoryImpl{} - -type repositoryImpl struct { - // workingDirectory specifies the directory where the API Definitions exist/should be written to. - // This is the path to the `./api-definitions` directory. - workingDirectory string -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_service.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_service.go deleted file mode 100644 index 77f913e26ae..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/save_service.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package dataapigeneratorjson - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -type SaveServiceOptions struct { - // AzureRestAPISpecsGitSHA specifies the Git Commit SHA that these API Definitions were imported from. - AzureRestAPISpecsGitSHA *string - - // ResourceProvider optionally specifies the Azure Resource Provider associated with this Service. - // This is only present when SourceDataType is ResourceManagerSourceDataType. - ResourceProvider *string - - // Service specifies details about this Service, including the available APIVersions. - Service models.Service - - // ServiceName specifies the name of this Service (e.g. `Compute`). - ServiceName string - - // CommonTypes specifies a map of API Version (key) to CommonTypes (value) - // which defines the available Common Types for this Service. - CommonTypes map[string]models.CommonTypes - - // SourceDataOrigin specifies the origin of this set of source data (e.g. AzureRestAPISpecsSourceDataOrigin). - SourceDataOrigin models.SourceDataOrigin - - // SourceDataType specifies the type of the source data (e.g. ResourceManagerSourceDataType). - SourceDataType models.SourceDataType -} - -// SaveService persists the API Definitions for the Service specified in opts. -func (r repositoryImpl) SaveService(opts SaveServiceOptions) error { - logging.Log.Info(fmt.Sprintf("Processing Service %q", opts.ServiceName)) - - items := []stages.Stage{ - stages.MetaDataStage{ - GitRevision: opts.AzureRestAPISpecsGitSHA, - SourceDataOrigin: opts.SourceDataOrigin, - SourceDataType: opts.SourceDataType, - }, - stages.ServiceDefinitionStage{ - ServiceName: opts.ServiceName, - ResourceProvider: opts.ResourceProvider, - ShouldGenerate: true, - TerraformDefinition: opts.Service.TerraformDefinition, - }, - } - - for apiVersion, apiVersionDetails := range opts.Service.APIVersions { - logging.Log.Info(fmt.Sprintf("Processing Service %q / API Version %q..", opts.ServiceName, apiVersion)) - items = append(items, stages.APIVersionStage{ - APIResources: apiVersionDetails.Resources, - APIVersion: apiVersion, - IsPreviewVersion: apiVersionDetails.Preview, - ServiceName: opts.ServiceName, - SourceDataOrigin: apiVersionDetails.Source, - ShouldGenerate: true, - }) - - for apiResourceName, apiResourceDetails := range apiVersionDetails.Resources { - // Output the API Definitions for this APIResource - - items = append(items, stages.ConstantStage{ - Constants: apiResourceDetails.Constants, - OutputDirectory: filepath.Join(opts.ServiceName, apiVersion, apiResourceName), - ResourceIDs: apiResourceDetails.ResourceIDs, - }) - - items = append(items, stages.ModelsStage{ - APIVersion: apiVersion, - CommonTypes: opts.CommonTypes, - Constants: apiResourceDetails.Constants, - Models: apiResourceDetails.Models, - OutputDirectory: filepath.Join(opts.ServiceName, apiVersion, apiResourceName), - }) - - items = append(items, stages.OperationsStage{ - ServiceName: opts.ServiceName, - APIVersion: apiVersion, - APIResource: apiResourceName, - CommonTypes: opts.CommonTypes, - Constants: apiResourceDetails.Constants, - Models: apiResourceDetails.Models, - Operations: apiResourceDetails.Operations, - }) - - items = append(items, stages.ResourceIDsStage{ - ServiceName: opts.ServiceName, - APIVersion: apiVersion, - APIResource: apiResourceName, - ResourceIDs: apiResourceDetails.ResourceIDs, - }) - } - } - - // Output the Terraform Resource Definitions, if they exist. - if opts.Service.TerraformDefinition != nil { - for terraformResourceLabel, terraformResourceDefinition := range opts.Service.TerraformDefinition.Resources { - items = append(items, stages.TerraformResourceDefinitionStage{ - ServiceName: opts.ServiceName, - ResourceLabel: terraformResourceLabel, - ResourceDetails: terraformResourceDefinition, - }) - - items = append(items, stages.TerraformSchemaModelsStage{ - ServiceName: opts.ServiceName, - ResourceDetails: terraformResourceDefinition, - }) - - items = append(items, stages.TerraformMappingsDefinitionStage{ - ServiceName: opts.ServiceName, - ResourceDetails: terraformResourceDefinition, - }) - - items = append(items, stages.TerraformResourceTestsStage{ - ServiceName: opts.ServiceName, - ResourceDetails: terraformResourceDefinition, - }) - } - } - - fs := helpers.NewFileSystem() - - logging.Log.Debug("Running stages..") - for _, stage := range items { - logging.Log.Trace(fmt.Sprintf("Processing Stage %q", stage.Name())) - if err := stage.Generate(fs); err != nil { - return fmt.Errorf("running Stage %q: %+v", stage.Name(), err) - } - } - - // TODO: ensure that any existing directory for this service is removed - - logging.Log.Debug("Persisting files to disk..") - if err := helpers.PersistFileSystem(r.workingDirectory, opts.SourceDataType, opts.ServiceName, &opts.ServiceName, fs); err != nil { - return fmt.Errorf("persisting files: %+v", err) - } - - return nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/api_version.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/api_version.go deleted file mode 100644 index 4c418ff4d10..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/api_version.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = APIVersionStage{} - -type APIVersionStage struct { - // APIResources specifies a mapping of APIResources available within this APIVersion. - APIResources map[string]models.APIResource - - // APIVersion specifies the APIVersion within the current Service. - APIVersion string - - // IsPreviewVersion specifies whether this APIVersion is a Preview (as opposed to a Stable) - // APIVersion. - IsPreviewVersion bool - - // ServiceName specifies the name of the Service within which this API Version exists. - ServiceName string - - // SourceDataOrigin specifies the Origin of this Source Data. - SourceDataOrigin models.SourceDataOrigin - - // ShouldGenerate specifies whether this APIVersion should be marked as available for generation. - ShouldGenerate bool -} - -func (g APIVersionStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Generating API Version Definition") - mapped, err := transforms.MapAPIVersionToRepository(g.APIVersion, g.IsPreviewVersion, g.APIResources, g.SourceDataOrigin, g.ShouldGenerate) - if err != nil { - return fmt.Errorf("building Api Version Definition: %+v", err) - } - - path := filepath.Join(g.ServiceName, g.APIVersion, "ApiVersionDefinition.json") - logging.Log.Trace(fmt.Sprintf("Staging API Version Definition to %q", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging API Version Definition to %q: %+v", path, err) - } - - return nil -} - -func (g APIVersionStage) Name() string { - return "API Version" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/constants.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/constants.go deleted file mode 100644 index 7e245cb0277..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/constants.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = ConstantStage{} - -type ConstantStage struct { - // Constants specifies the map of Constant Name (key) to SDKConstant (value) which should be - // persisted. - Constants map[string]models.SDKConstant - - // OutputDirectory specifies the path where constants should be persisted. - OutputDirectory string - - // ResourceIDs specifies a map of Resource ID Name (key) to ResourceID (value) that should - // be persisted. - ResourceIDs map[string]models.ResourceID -} - -func (g ConstantStage) Name() string { - return "Constants" -} - -func (g ConstantStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Generating Constants") - - if g.OutputDirectory == "" { - return fmt.Errorf("internal: OutputDirectory cannot be empty") - } - - for constantName, constantVal := range g.Constants { - logging.Log.Trace(fmt.Sprintf("Processing Constant %q", constantName)) - - mapped, err := transforms.MapSDKConstantToRepository(constantName, constantVal) - if err != nil { - return fmt.Errorf("mapping SDKConstant %q: %+v", constantName, err) - } - - path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Constant-%s.json", constantName)) - logging.Log.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Constant %q: %+v", constantName, err) - } - } - - // ResourceIDs also contain Constants - so we need to pull those out and persist them too - if g.ResourceIDs != nil { - for resourceIdName, resourceId := range g.ResourceIDs { - logging.Log.Trace(fmt.Sprintf("Processing Constants within the Resource ID %q", resourceIdName)) - - for constantName, constantVal := range resourceId.Constants { - logging.Log.Trace(fmt.Sprintf("Processing Constant %q", constantName)) - - mapped, err := transforms.MapSDKConstantToRepository(constantName, constantVal) - if err != nil { - return fmt.Errorf("mapping SDKConstant %q: %+v", constantName, err) - } - - path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Constant-%s.json", constantName)) - logging.Log.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Constant %q: %+v", constantName, err) - } - } - } - } - - return nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/metadata.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/metadata.go deleted file mode 100644 index e1295e9ea2b..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/metadata.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = MetaDataStage{} - -type MetaDataStage struct { - // GitRevision optionally specifies the Git Revision (the full SHA) that the API Definitions have been - // parsed from. This can be nil when the APIDefinitions are handwritten. - GitRevision *string - - // SourceDataOrigin specifies the Origin of this Source Data. - SourceDataOrigin models.SourceDataOrigin - - // SourceDataType specifies the Type of Source Data that this set of API Definitions is related to. - SourceDataType models.SourceDataType -} - -func (g MetaDataStage) Generate(input *helpers.FileSystem) error { - metaData, err := transforms.MapMetaDataToRepository(g.GitRevision, g.SourceDataType, g.SourceDataOrigin) - if err != nil { - return fmt.Errorf("mapping metadata: %+v", err) - } - path := "metadata.json" - - logging.Log.Trace(fmt.Sprintf("Staging MetaData at %s", path)) - if err := input.Stage(path, *metaData); err != nil { - return fmt.Errorf("staging metadata: %+v", err) - } - - return nil -} - -func (g MetaDataStage) Name() string { - return "MetaData" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/models.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/models.go deleted file mode 100644 index 0ba23f4ed18..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/models.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = ModelsStage{} - -type ModelsStage struct { - // APIVersion specifies the APIVersion within the Service where the Models exist. - APIVersion string - - // CommonTypes specifies a map of API Version (key) to CommonTypes (value) - // which defines the available Common Types for this Service. - CommonTypes map[string]models.CommonTypes - - // Constants specifies the map of Constant Name (key) to SDKConstant (value) which should be - // persisted. - Constants map[string]models.SDKConstant - - // Models specifies the map of Model Name (key) to SDKModel (value) which should be - // persisted. - Models map[string]models.SDKModel - - // OutputDirectory specifies the path where constants should be persisted. - OutputDirectory string -} - -func (g ModelsStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Generating Models") - - if g.OutputDirectory == "" { - return fmt.Errorf("internal: OutputDirectory cannot be empty") - } - - for modelName := range g.Models { - logging.Log.Trace(fmt.Sprintf("Generating Model %q..", modelName)) - modelValue := g.Models[modelName] - - var parent *models.SDKModel - if modelValue.ParentTypeName != nil { - logging.Log.Trace("Finding parent model %q..", *modelValue.ParentTypeName) - p, ok := g.Models[*modelValue.ParentTypeName] - if ok { - parent = &p - } - } - - var commonTypes models.CommonTypes - if commonTypesForVersion, ok := g.CommonTypes[g.APIVersion]; ok { - commonTypes = commonTypesForVersion - } - - mapped, err := transforms.MapSDKModelToRepository(modelName, modelValue, parent, g.Constants, g.Models, commonTypes) - if err != nil { - return fmt.Errorf("mapping model %q: %+v", modelName, err) - } - - path := filepath.Join(g.OutputDirectory, fmt.Sprintf("Model-%s.json", modelName)) - logging.Log.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Model %q: %+v", modelName, err) - } - } - - return nil -} - -func (g ModelsStage) Name() string { - return "Models" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/operations.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/operations.go deleted file mode 100644 index bf62e89d961..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/operations.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = OperationsStage{} - -type OperationsStage struct { - // APIResource specifies the APIResource within the APIVersion where the Operations exist. - APIResource string - - // APIVersion specifies the APIVersion within the Service where the Operations exist. - APIVersion string - - // Constants specifies the map of Constant Name (key) to SDKConstant (value) which should be - // persisted. - Constants map[string]models.SDKConstant - - // Models specifies the map of Model Name (key) to SDKModel (value) which should be - // persisted. - Models map[string]models.SDKModel - - // CommonTypes specifies a map of API Version (key) to CommonTypes (value) - // which defines the available Common Types for this Service. - CommonTypes map[string]models.CommonTypes - - // Operations specifies the map of Operation Name (key) to SDKOperation (value) which should be - // persisted. - Operations map[string]models.SDKOperation - - // ServiceName specifies the name of the Service within which the Operations exist. - ServiceName string -} - -func (g OperationsStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Generating Operations..") - for operationName := range g.Operations { - logging.Log.Trace(fmt.Sprintf("Generating Operation %q..", operationName)) - - operationDetails := g.Operations[operationName] - - var commonTypes models.CommonTypes - if commonTypesForVersion, ok := g.CommonTypes[g.APIVersion]; ok { - commonTypes = commonTypesForVersion - } - - mapped, err := transforms.MapSDKOperationToRepository(operationName, operationDetails, g.Constants, g.Models, commonTypes) - if err != nil { - return fmt.Errorf("mapping Operation %q: %+v", operationName, err) - } - - // {workingDirectory}/Service/APIVersion/APIResource/Operation-{Name}.json - path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("Operation-%s.json", operationName)) - logging.Log.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Operation %q: %+v", operationName, err) - } - } - - return nil -} - -func (g OperationsStage) Name() string { - return "Operations" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/resource_ids.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/resource_ids.go deleted file mode 100644 index 96f51339320..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/resource_ids.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = ResourceIDsStage{} - -type ResourceIDsStage struct { - // APIVersion specifies the APIVersion within the Service where the Resource IDs exist. - APIVersion string - - // APIResource specifies the APIResource within the APIVersion where the Resource IDs exist. - APIResource string - - // ResourceIDs specifies a map of Resource ID Name (key) to ResourceID (value) that should - // be persisted. - ResourceIDs map[string]models.ResourceID - - // ServiceName specifies the name of the Service within which the Resource IDs exist. - ServiceName string -} - -func (g ResourceIDsStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Generating Resource IDs") - for resourceIDName, resourceIDValue := range g.ResourceIDs { - logging.Log.Trace(fmt.Sprintf("Generating Resource ID %q", resourceIDName)) - mapped, err := transforms.MapResourceIDToRepository(resourceIDName, resourceIDValue) - if err != nil { - return fmt.Errorf("mapping Resource ID %q: %+v", resourceIDName, err) - } - - // {workingDirectory}/Service/APIVersion/APIResource/ResourceId-{Name}.json - path := filepath.Join(g.ServiceName, g.APIVersion, g.APIResource, fmt.Sprintf("ResourceId-%s.json", resourceIDName)) - logging.Log.Trace(fmt.Sprintf("Staging to %s", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Resource ID %q: %+v", resourceIDName, err) - } - } - - return nil -} - -func (g ResourceIDsStage) Name() string { - return "Resource IDs" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/service_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/service_definition.go deleted file mode 100644 index d42e53621b2..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/service_definition.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" -) - -var _ Stage = ServiceDefinitionStage{} - -type ServiceDefinitionStage struct { - // ResourceProvider optionally specifies the Azure Resource Provider related to this Service. - // This will only be set for Azure Resource Manager related Services. - ResourceProvider *string - - // ServiceName specifies the name of the Service. - ServiceName string - - // ShouldGenerate specifies whether this Service should be marked as available for generation. - ShouldGenerate bool - - // TerraformDefinition optionally specifies the Terraform Definition for this Service. - TerraformDefinition *models.TerraformDefinition -} - -func (g ServiceDefinitionStage) Generate(input *helpers.FileSystem) error { - serviceDefinition, err := transforms.MapServiceDefinitionToRepository(g.ServiceName, g.ResourceProvider, g.TerraformDefinition) - if err != nil { - return fmt.Errorf("mapping Service Definition for %q: %+v", g.ServiceName, err) - } - - path := filepath.Join(g.ServiceName, "ServiceDefinition.json") - if err := input.Stage(path, *serviceDefinition); err != nil { - return fmt.Errorf("staging ServiceDefinition to %q: %+v", path, err) - } - - return nil -} - -func (g ServiceDefinitionStage) Name() string { - return "Service Definition" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/stages.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/stages.go deleted file mode 100644 index 113eb3695c1..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/stages.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - -type Stage interface { - // Generate runs this generation Stage which returns a map of files to be output or an error - Generate(input *helpers.FileSystem) error - - // Name returns the name of this generator Stage, for logging purposes. - Name() string -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_mappings_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_mappings_definition.go deleted file mode 100644 index a76e5b97973..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_mappings_definition.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = TerraformMappingsDefinitionStage{} - -type TerraformMappingsDefinitionStage struct { - // ResourceDetails specifies the Terraform Resource Definition. - ResourceDetails models.TerraformResourceDefinition - - // ServiceName specifies the name of the Service. - ServiceName string -} - -func (g TerraformMappingsDefinitionStage) Generate(input *helpers.FileSystem) error { - mapped, err := transforms.MapTerraformSchemaMappingsToRepository(g.ResourceDetails.Mappings) - if err != nil { - return fmt.Errorf("building Mappings for the Terraform Resource %q: %+v", g.ResourceDetails.ResourceName, err) - } - - path := filepath.Join(g.ServiceName, "Terraform", fmt.Sprintf("%s-Resource-Mappings.json", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging Terraform Mappings to %q", path)) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Terraform Mappings to %q: %+v", path, err) - } - - return nil -} - -func (g TerraformMappingsDefinitionStage) Name() string { - return "Terraform Mappings Definition" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_definition.go deleted file mode 100644 index 6f8ed1eb19c..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_definition.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = TerraformResourceDefinitionStage{} - -type TerraformResourceDefinitionStage struct { - // ResourceDetails specifies the Terraform Resource Definition. - ResourceDetails models.TerraformResourceDefinition - - // ResourceLabel specifies the Label for this Terraform Resource without the Provider Prefix. - // Example: `container_service` rather than `azurerm_container_service`. - ResourceLabel string - - // ServiceName specifies the name of the Service. - ServiceName string -} - -func (g TerraformResourceDefinitionStage) Generate(input *helpers.FileSystem) error { - logging.Log.Trace("Mapping Terraform Resource Definition..") - mapped, err := transforms.MapTerraformResourceDefinitionToRepository(g.ResourceLabel, g.ResourceDetails) - if err != nil { - return fmt.Errorf("building Terraform Resource Definition: %+v", err) - } - - path := filepath.Join(g.ServiceName, "Terraform", fmt.Sprintf("%s-Resource.json", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging Terraform Resource Definition at %q", path)) - if err := input.Stage(path, mapped); err != nil { - return fmt.Errorf("staging Terraform Resource Definition at %q: %+v", path, err) - } - - return nil -} - -func (g TerraformResourceDefinitionStage) Name() string { - return "Terraform Resource Definition" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_tests.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_tests.go deleted file mode 100644 index 17ea7c226a6..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_resource_tests.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = TerraformResourceTestsStage{} - -type TerraformResourceTestsStage struct { - // ResourceDetails specifies the Terraform Resource Definition. - ResourceDetails models.TerraformResourceDefinition - - // ServiceName specifies the name of the Service. - ServiceName string -} - -func (g TerraformResourceTestsStage) Generate(input *helpers.FileSystem) error { - if !g.ResourceDetails.Tests.Generate { - logging.Log.Trace("Test Generation is Disabled - skipping.") - return nil - } - - workingDirectory := filepath.Join(g.ServiceName, "Terraform", "Tests") - - basicPath := filepath.Join(workingDirectory, fmt.Sprintf("%s-Resource-Basic-Test.hcl", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging Basic Test Configuration to %q", basicPath)) - if err := input.Stage(basicPath, g.ResourceDetails.Tests.BasicConfiguration); err != nil { - return fmt.Errorf("staging Basic Test Configuration: %+v", err) - } - - requiresImportPath := filepath.Join(workingDirectory, fmt.Sprintf("%s-Resource-Requires-Import-Test.hcl", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging RequiresImport Test Configuration to %q", requiresImportPath)) - if err := input.Stage(requiresImportPath, g.ResourceDetails.Tests.RequiresImportConfiguration); err != nil { - return fmt.Errorf("staging RequiresImport Test Configuration: %+v", err) - } - - if g.ResourceDetails.Tests.TemplateConfiguration != nil { - templatePath := filepath.Join(workingDirectory, fmt.Sprintf("%s-Resource-Template-Test.hcl", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging Template Test Configuration to %q", templatePath)) - if err := input.Stage(templatePath, *g.ResourceDetails.Tests.TemplateConfiguration); err != nil { - return fmt.Errorf("staging Template Test Configuration: %+v", err) - } - } - - if g.ResourceDetails.Tests.CompleteConfiguration != nil { - completePath := filepath.Join(workingDirectory, fmt.Sprintf("%s-Resource-Complete-Test.hcl", g.ResourceDetails.ResourceName)) - logging.Log.Trace(fmt.Sprintf("Staging Complete Test Configuration to %q", completePath)) - if err := input.Stage(completePath, *g.ResourceDetails.Tests.CompleteConfiguration); err != nil { - return fmt.Errorf("staging Complete Test Configuration: %+v", err) - } - } - - if g.ResourceDetails.Tests.OtherTests != nil { - for otherTestName, otherTest := range *g.ResourceDetails.Tests.OtherTests { - for index, testStage := range otherTest { - testStageFileName := filepath.Join(workingDirectory, fmt.Sprintf("%s-Resource-Other-%s-%d-Test.hcl", g.ResourceDetails.ResourceName, otherTestName, index)) - logging.Log.Trace(fmt.Sprintf("Staging Test %q Stage %d Test Configuration to %q", otherTestName, index, testStageFileName)) - if err := input.Stage(testStageFileName, testStage); err != nil { - return fmt.Errorf("staging Test %q Stage %d Test Configuration: %+v", otherTestName, index, err) - } - } - } - } - - return nil -} - -func (g TerraformResourceTestsStage) Name() string { - return "Terraform Resource Tests" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_schema_models.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_schema_models.go deleted file mode 100644 index b281091f9aa..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/stages/terraform_schema_models.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package stages - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/helpers" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/internal/logging" -) - -var _ Stage = TerraformSchemaModelsStage{} - -type TerraformSchemaModelsStage struct { - // ServiceName specifies the name of the Service. - ServiceName string - - // ResourceDetails specifies the Terraform Resource Definition. - ResourceDetails models.TerraformResourceDefinition -} - -func (g TerraformSchemaModelsStage) Generate(input *helpers.FileSystem) error { - logging.Log.Debug("Processing Terraform Schema Models..") - for schemaModelName, schemaModel := range g.ResourceDetails.SchemaModels { - logging.Log.Trace(fmt.Sprintf("Processing Terraform Schema Model %q", schemaModelName)) - mapped, err := transforms.MapTerraformSchemaModelToRepository(schemaModelName, schemaModel) - if err != nil { - return fmt.Errorf("mapping Terraform Schema Model %q: %+v", schemaModelName, err) - } - - fileName := fmt.Sprintf("%s-Resource-Schema-%s.json", g.ResourceDetails.ResourceName, strings.TrimPrefix(schemaModelName, g.ResourceDetails.SchemaModelName)) - if schemaModelName == g.ResourceDetails.SchemaModelName { - // Special-case the Resources Model so that it's easier to find the Resource's Schema quickly - fileName = fmt.Sprintf("%s-Resource-Schema.json", g.ResourceDetails.ResourceName) - } - path := filepath.Join(g.ServiceName, "Terraform", fileName) - if err := input.Stage(path, *mapped); err != nil { - return fmt.Errorf("staging Terraform Schema Model %q at %q: %+v", schemaModelName, path, err) - } - logging.Log.Trace("Processed Schema Model %q.", schemaModelName) - } - - return nil -} - -func (g TerraformSchemaModelsStage) Name() string { - return "Terraform Schema Models" -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/api_version.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/api_version.go deleted file mode 100644 index 3f387afd507..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/api_version.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapAPIVersionToRepository(apiVersion string, isPreview bool, resources map[string]models.APIResource, sourceDataOrigin models.SourceDataOrigin, shouldGenerate bool) (*dataapimodels.ApiVersionDefinition, error) { - dataOrigin, ok := sourceDataOriginsToRepository[sourceDataOrigin] - if !ok { - return nil, fmt.Errorf("internal-error: missing mapping for Source Data Origin %q", string(sourceDataOrigin)) - } - - versionDefinition := dataapimodels.ApiVersionDefinition{ - ApiVersion: apiVersion, - IsPreview: isPreview, - Generate: shouldGenerate, - Source: dataOrigin, - } - - names := make([]string, 0) - for name, value := range resources { - // skip ones which are filtered out - if len(value.Operations) == 0 { - continue - } - names = append(names, name) - } - sort.Strings(names) - - versionDefinition.Resources = names - - return &versionDefinition, nil -} - -var sourceDataOriginsToRepository = map[models.SourceDataOrigin]dataapimodels.ApiDefinitionsSource{ - models.AzureRestAPISpecsSourceDataOrigin: dataapimodels.AzureRestApiSpecsRepositoryApiDefinitionsSource, - models.MicrosoftGraphMetaDataSourceDataOrigin: dataapimodels.MicrosoftGraphMetaDataRepositoryApiDefinitionsSource, - models.HandWrittenSourceDataOrigin: dataapimodels.HandWrittenApiDefinitionsSource, -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/metadata.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/metadata.go deleted file mode 100644 index 6a1b54ba089..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/metadata.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapMetaDataToRepository(gitRevision *string, sourceDataType models.SourceDataType, sourceDataOrigin models.SourceDataOrigin) (*dataapimodels.MetaData, error) { - dataType, ok := sourceDataTypesToRepository[sourceDataType] - if !ok { - return nil, fmt.Errorf("internal-error: missing mapping for Source Data Type %q", string(sourceDataType)) - } - dataOrigin, ok := sourceDataOriginsToRepository[sourceDataOrigin] - if !ok { - return nil, fmt.Errorf("internal-error: missing mapping for Source Data Origin %q", string(sourceDataOrigin)) - } - - return &dataapimodels.MetaData{ - DataSource: dataType, - SourceInformation: dataOrigin, - GitRevision: gitRevision, - }, nil -} - -var sourceDataTypesToRepository = map[models.SourceDataType]dataapimodels.DataSource{ - models.ResourceManagerSourceDataType: dataapimodels.AzureResourceManagerDataSource, - models.MicrosoftGraphSourceDataType: dataapimodels.MicrosoftGraphDataSource, -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id.go deleted file mode 100644 index 94783e63917..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapResourceIDToRepository(name string, input models.ResourceID) (*dataapimodels.ResourceId, error) { - segments := make([]dataapimodels.ResourceIdSegment, 0) - for _, inputSegment := range input.Segments { - outputSegment, err := mapResourceIdSegmentToRepository(inputSegment) - if err != nil { - return nil, fmt.Errorf("mapping the Resource ID segment: %+v", err) - } - segments = append(segments, *outputSegment) - } - - return &dataapimodels.ResourceId{ - Name: name, - CommonAlias: input.CommonIDAlias, - Id: input.ExampleValue, - Segments: segments, - }, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id_segment.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id_segment.go deleted file mode 100644 index a1371b9dabf..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/resource_id_segment.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapResourceIdSegmentToRepository(input models.ResourceIDSegment) (*dataapimodels.ResourceIdSegment, error) { - if input.Type == models.ConstantResourceIDSegmentType { - if input.ConstantReference == nil { - return nil, fmt.Errorf("constant segment type with missing constant reference: %+v", input) - } - return &dataapimodels.ResourceIdSegment{ - Name: input.Name, - Type: dataapimodels.ConstantResourceIdSegmentType, - ConstantName: input.ConstantReference, - }, nil - } - - if input.Type == models.ResourceGroupResourceIDSegmentType { - return &dataapimodels.ResourceIdSegment{ - Name: input.Name, - Type: dataapimodels.ResourceGroupResourceIdSegmentType, - }, nil - } - - if input.Type == models.ResourceProviderResourceIDSegmentType { - if input.FixedValue == nil { - return nil, fmt.Errorf("resource provider segment type with missing fixed value: %+v", input) - } - - return &dataapimodels.ResourceIdSegment{ - Name: input.Name, - Type: dataapimodels.ResourceProviderResourceIdSegmentType, - Value: input.FixedValue, - }, nil - } - - if input.Type == models.ScopeResourceIDSegmentType { - return &dataapimodels.ResourceIdSegment{ - Name: input.Name, - Type: dataapimodels.ScopeResourceIdSegmentType, - }, nil - } - - if input.Type == models.StaticResourceIDSegmentType { - if input.FixedValue == nil { - return nil, fmt.Errorf("static segment type with missing fixed value: %+v", input) - } - return &dataapimodels.ResourceIdSegment{ - Type: dataapimodels.StaticResourceIdSegmentType, - Name: input.Name, - Value: input.FixedValue, - }, nil - } - - if input.Type == models.SubscriptionIDResourceIDSegmentType { - return &dataapimodels.ResourceIdSegment{ - Type: dataapimodels.SubscriptionIdResourceIdSegmentType, - Name: input.Name, - }, nil - } - - if input.Type == models.UserSpecifiedResourceIDSegmentType { - return &dataapimodels.ResourceIdSegment{ - Type: dataapimodels.UserSpecifiedResourceIdSegmentType, - Name: input.Name, - }, nil - } - - return nil, fmt.Errorf("internal-error: unimplemented segment type %q", string(input.Type)) -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_constant.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_constant.go deleted file mode 100644 index c4d9568537e..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_constant.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapSDKConstantToRepository(constantName string, details models.SDKConstant) (*dataapimodels.Constant, error) { - keys := make([]string, 0) - keysToValues := make(map[string]dataapimodels.ConstantValue) - for k, v := range details.Values { - keys = append(keys, k) - keysToValues[k] = dataapimodels.ConstantValue{ - Key: k, - Value: v, - // TODO: expose Description in the future when this is surfaced from the Parser - } - } - sort.Strings(keys) - - values := make([]dataapimodels.ConstantValue, 0) - for _, key := range keys { - value := keysToValues[key] - values = append(values, value) - } - - constantType, err := mapConstantTypeToRepository(details.Type) - if err != nil { - return nil, fmt.Errorf("mapping constant field type %q: %+v", string(details.Type), err) - } - - return &dataapimodels.Constant{ - Name: constantName, - Type: pointer.From(constantType), - Values: values, - }, nil -} - -func mapConstantTypeToRepository(input models.SDKConstantType) (*dataapimodels.ConstantType, error) { - mappings := map[models.SDKConstantType]dataapimodels.ConstantType{ - models.FloatSDKConstantType: dataapimodels.FloatConstant, - models.IntegerSDKConstantType: dataapimodels.IntegerConstant, - models.StringSDKConstantType: dataapimodels.StringConstant, - } - if v, ok := mappings[input]; ok { - return &v, nil - } - - return nil, fmt.Errorf("unmapped Constant Type %q", string(input)) -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field.go deleted file mode 100644 index 38c6efd5a23..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapSDKFieldToRepository(fieldName string, fieldDetails models.SDKField, isTypeHint bool, constants map[string]models.SDKConstant, knownModels map[string]models.SDKModel, commonTypes models.CommonTypes) (*dataapimodels.ModelField, error) { - // TODO: thread through logging - objectDefinition, err := mapSDKObjectDefinitionToRepository(fieldDetails.ObjectDefinition, constants, knownModels, commonTypes) - if err != nil { - return nil, fmt.Errorf("mapping the ObjectDefinition for field %q: %+v", fieldName, err) - } - - return &dataapimodels.ModelField{ - ContainsDiscriminatedTypeValue: isTypeHint, - DateFormat: nil, - Description: nil, - // TODO this can be uncommented when #3325 has been fixed - // Description: fieldDetails.Description, - JsonName: fieldDetails.JsonName, - Name: fieldName, - ObjectDefinition: *objectDefinition, - Optional: fieldDetails.Optional, - ReadOnly: fieldDetails.ReadOnly, - Required: fieldDetails.Required, - Sensitive: fieldDetails.Sensitive, - }, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field_object_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field_object_definition.go deleted file mode 100644 index acdc09612fc..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_field_object_definition.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapSDKObjectDefinitionToRepository(details models.SDKObjectDefinition, constants map[string]models.SDKConstant, models map[string]models.SDKModel, commonTypes models.CommonTypes) (*dataapimodels.ObjectDefinition, error) { - typeVal, ok := internalObjectDefinitionsToObjectDefinitionTypes[details.Type] - if !ok { - return nil, fmt.Errorf("internal-error: no ObjectDefinition mapping is defined for the ObjectDefinition Type %q", string(details.Type)) - } - - output := dataapimodels.ObjectDefinition{ - Type: typeVal, - ReferenceName: nil, - NestedItem: nil, - } - - if details.ReferenceName != nil { - output.ReferenceName = details.ReferenceName - } - - if details.ReferenceNameIsCommonType != nil { - output.ReferenceNameIsCommonType = details.ReferenceNameIsCommonType - } - - if details.NestedItem != nil { - nestedItem, err := mapSDKObjectDefinitionToRepository(*details.NestedItem, constants, models, commonTypes) - if err != nil { - return nil, fmt.Errorf("mapping nested object definition: %+v", err) - } - output.NestedItem = nestedItem - } - - // TODO: come back to these after the SDK switch - //if definition.Maximum != nil { - // output.MaxItems = definition.Maximum - //} - //if definition.Minimum != nil { - // output.MinItems = definition.Minimum - //} - if output.Type == dataapimodels.DateTimeObjectDefinitionType { - // TODO: support additional types of Date Formats (#8) - output.DateFormat = pointer.To(dataapimodels.RFC3339DateFormat) - } - - // finally let's do some sanity-checking to ensure the data being output looks legit - if err := validateObjectDefinition(output, constants, models, commonTypes); err != nil { - return nil, fmt.Errorf("validating mapped ObjectDefinition: %+v", err) - } - - return &output, nil -} - -func validateObjectDefinition(input dataapimodels.ObjectDefinition, constants map[string]models.SDKConstant, models map[string]models.SDKModel, commonTypes models.CommonTypes) error { - requiresNestedItem := input.Type == dataapimodels.CsvObjectDefinitionType || - input.Type == dataapimodels.DictionaryObjectDefinitionType || - input.Type == dataapimodels.ListObjectDefinitionType - requiresReference := input.Type == dataapimodels.ReferenceObjectDefinitionType - if requiresNestedItem && input.NestedItem == nil { - return fmt.Errorf("a Nested Object Definition must be specified for a %q type but didn't get one", string(input.Type)) - } - if !requiresNestedItem && input.NestedItem != nil { - return fmt.Errorf("a Nested Object Definition must not be specified for a %q type but got %q", string(input.Type), string(input.NestedItem.Type)) - } - if requiresReference { - if input.ReferenceName == nil { - return fmt.Errorf("a Reference must be specified for a %q type but didn't get one", string(input.Type)) - } - - _, isLocalConstant := constants[*input.ReferenceName] - _, isLocalModel := models[*input.ReferenceName] - var isCommonConstant, isCommonModel bool - if commonTypes.Constants != nil { - _, isCommonConstant = commonTypes.Constants[*input.ReferenceName] - } - if commonTypes.Models != nil { - _, isCommonModel = commonTypes.Models[*input.ReferenceName] - } - - if input.ReferenceNameIsCommonType != nil && *input.ReferenceNameIsCommonType { - if !isCommonConstant && !isCommonModel { - return fmt.Errorf("reference %q was not found as a common constant or model", *input.ReferenceName) - } - if isCommonConstant && isCommonModel { - return fmt.Errorf("internal-error: %q was found as BOTH a common constant and model", *input.ReferenceName) - } - } else { - if !isLocalConstant && !isLocalModel { - return fmt.Errorf("reference %q was not found as a local constant or model", *input.ReferenceName) - } - if isLocalConstant && isLocalModel { - return fmt.Errorf("internal-error: %q was found as BOTH a local constant and model", *input.ReferenceName) - } - } - } - if !requiresReference && input.ReferenceName != nil { - return fmt.Errorf("a Reference must not be specified for a %q type but got %q", string(input.Type), *input.ReferenceName) - } - - return nil -} - -var internalObjectDefinitionsToObjectDefinitionTypes = map[models.SDKObjectDefinitionType]dataapimodels.ObjectDefinitionType{ - // Simple Types - models.BooleanSDKObjectDefinitionType: dataapimodels.BooleanObjectDefinitionType, - models.DateTimeSDKObjectDefinitionType: dataapimodels.DateTimeObjectDefinitionType, - models.IntegerSDKObjectDefinitionType: dataapimodels.IntegerObjectDefinitionType, - models.FloatSDKObjectDefinitionType: dataapimodels.FloatObjectDefinitionType, - models.StringSDKObjectDefinitionType: dataapimodels.StringObjectDefinitionType, - - // Complex Types - models.CSVSDKObjectDefinitionType: dataapimodels.CsvObjectDefinitionType, - models.DictionarySDKObjectDefinitionType: dataapimodels.DictionaryObjectDefinitionType, - models.ListSDKObjectDefinitionType: dataapimodels.ListObjectDefinitionType, - models.RawFileSDKObjectDefinitionType: dataapimodels.RawFileObjectDefinitionType, - models.RawObjectSDKObjectDefinitionType: dataapimodels.RawObjectObjectDefinitionType, - models.ReferenceSDKObjectDefinitionType: dataapimodels.ReferenceObjectDefinitionType, - - // Common Schema - models.EdgeZoneSDKObjectDefinitionType: dataapimodels.EdgeZoneObjectDefinitionType, - models.LocationSDKObjectDefinitionType: dataapimodels.LocationObjectDefinitionType, - models.SystemAssignedIdentitySDKObjectDefinitionType: dataapimodels.SystemAssignedIdentityObjectDefinitionType, - models.SystemAndUserAssignedIdentityListSDKObjectDefinitionType: dataapimodels.SystemAndUserAssignedIdentityListObjectDefinitionType, - models.SystemAndUserAssignedIdentityMapSDKObjectDefinitionType: dataapimodels.SystemAndUserAssignedIdentityMapObjectDefinitionType, - models.LegacySystemAndUserAssignedIdentityListSDKObjectDefinitionType: dataapimodels.LegacySystemAndUserAssignedIdentityListObjectDefinitionType, - models.LegacySystemAndUserAssignedIdentityMapSDKObjectDefinitionType: dataapimodels.LegacySystemAndUserAssignedIdentityMapObjectDefinitionType, - models.SystemOrUserAssignedIdentityListSDKObjectDefinitionType: dataapimodels.SystemOrUserAssignedIdentityListObjectDefinitionType, - models.SystemOrUserAssignedIdentityMapSDKObjectDefinitionType: dataapimodels.SystemOrUserAssignedIdentityMapObjectDefinitionType, - models.UserAssignedIdentityListSDKObjectDefinitionType: dataapimodels.UserAssignedIdentityListObjectDefinitionType, - models.UserAssignedIdentityMapSDKObjectDefinitionType: dataapimodels.UserAssignedIdentityMapObjectDefinitionType, - models.TagsSDKObjectDefinitionType: dataapimodels.TagsObjectDefinitionType, - models.SystemDataSDKObjectDefinitionType: dataapimodels.SystemDataObjectDefinitionType, - models.ZoneSDKObjectDefinitionType: dataapimodels.ZoneObjectDefinitionType, - models.ZonesSDKObjectDefinitionType: dataapimodels.ZonesObjectDefinitionType, -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_model.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_model.go deleted file mode 100644 index 7813707b1f9..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_model.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - "strings" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapSDKModelToRepository(modelName string, model models.SDKModel, parentModel *models.SDKModel, knownConstants map[string]models.SDKConstant, knownModels map[string]models.SDKModel, commonTypes models.CommonTypes) (*dataapimodels.Model, error) { - if len(model.Fields) == 0 { - return nil, fmt.Errorf("the model %q has no fields", modelName) - } - - fields, err := mapSDKFieldsForModel(model, parentModel, knownConstants, knownModels, commonTypes) - if err != nil { - return nil, fmt.Errorf("mapping fields for model %q: %+v", modelName, err) - } - - dataApiModel := dataapimodels.Model{ - Name: modelName, - Fields: *fields, - } - - // NOTE: `Parent` types don't get a `DiscriminatedValue` - if model.ParentTypeName != nil { - dataApiModel.DiscriminatedParentModelName = model.ParentTypeName - } - if model.DiscriminatedValue != nil { - dataApiModel.DiscriminatedTypeValue = model.DiscriminatedValue - } - - if model.FieldNameContainingDiscriminatedValue != nil { - dataApiModel.TypeHintIn = model.FieldNameContainingDiscriminatedValue - } - - return &dataApiModel, nil -} - -func mapSDKFieldsForModel(model models.SDKModel, parentModel *models.SDKModel, knownConstants map[string]models.SDKConstant, knownModels map[string]models.SDKModel, commonTypes models.CommonTypes) (*[]dataapimodels.ModelField, error) { - // ensure consistency in the output - sortedFieldNames := make([]string, 0) - for fieldName := range model.Fields { - sortedFieldNames = append(sortedFieldNames, fieldName) - } - sort.Strings(sortedFieldNames) - - fields := make([]dataapimodels.ModelField, 0) - - for _, fieldName := range sortedFieldNames { - // we should skip outputting this field if it's present on the parent - fieldInParent := false - if parentModel != nil { - // the importer flattens fields from parents/AllOf, since we don't use inheritance for that within the - // data layer - as such we only want to skip the fields when the parent type is output, e.g. when there's - // a discriminator involved - for name := range parentModel.Fields { - if strings.EqualFold(name, fieldName) { - fieldInParent = true - break - } - } - } - if fieldInParent { - continue - } - - field := model.Fields[fieldName] - isTypeHint := model.FieldNameContainingDiscriminatedValue != nil && strings.EqualFold(*model.FieldNameContainingDiscriminatedValue, fieldName) - fieldCode, err := mapSDKFieldToRepository(fieldName, field, isTypeHint, knownConstants, knownModels, commonTypes) - if err != nil { - return nil, fmt.Errorf("generating code for field %q: %+v", fieldName, err) - } - - fields = append(fields, *fieldCode) - } - - return &fields, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation.go deleted file mode 100644 index 83ae9e6dda6..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - "strings" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapSDKOperationToRepository(operationName string, input models.SDKOperation, knownConstants map[string]models.SDKConstant, knownModels map[string]models.SDKModel, knownCommonTypes models.CommonTypes) (*dataapimodels.Operation, error) { - contentType := input.ContentType - if strings.Contains(strings.ToLower(contentType), "application/json") { - contentType = fmt.Sprintf("%s; charset=utf-8", contentType) - } - - output := dataapimodels.Operation{ - Name: operationName, - ContentType: contentType, - ExpectedStatusCodes: input.ExpectedStatusCodes, - FieldContainingPaginationDetails: input.FieldContainingPaginationDetails, - LongRunning: input.LongRunning, - HTTPMethod: strings.ToUpper(input.Method), - ResourceIdName: input.ResourceIDName, - UriSuffix: input.URISuffix, - } - - if input.RequestObject != nil { - requestObject, err := mapSDKObjectDefinitionToRepository(*input.RequestObject, knownConstants, knownModels, knownCommonTypes) - if err != nil { - return nil, fmt.Errorf("mapping the request object definition: %+v", err) - } - output.RequestObject = requestObject - } - - if input.ResponseObject != nil { - responseObject, err := mapSDKObjectDefinitionToRepository(*input.ResponseObject, knownConstants, knownModels, knownCommonTypes) - if err != nil { - return nil, fmt.Errorf("mapping the response object definition: %+v", err) - } - output.ResponseObject = responseObject - } - - if len(input.Options) > 0 { - options := make([]dataapimodels.Option, 0) - sortedOptionsKeys := make([]string, 0) - for k := range input.Options { - sortedOptionsKeys = append(sortedOptionsKeys, k) - } - sort.Strings(sortedOptionsKeys) - - for _, optionName := range sortedOptionsKeys { - optionDetails := input.Options[optionName] - - optionObjectDefinition, err := mapSDKOperationOptionToRepository(optionDetails.ObjectDefinition, knownConstants, knownModels, knownCommonTypes) - if err != nil { - return nil, fmt.Errorf("mapping the object definition: %+v", err) - } - - option := dataapimodels.Option{ - HeaderName: optionDetails.HeaderName, - QueryString: optionDetails.QueryStringName, - Field: optionName, - ObjectDefinition: optionObjectDefinition, - } - - if !optionDetails.Required { - option.Optional = true - } else { - option.Required = true - } - - options = append(options, option) - } - output.Options = pointer.To(options) - } - - return &output, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation_option.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation_option.go deleted file mode 100644 index 2ab4c94d2ff..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/sdk_operation_option.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -var sdkOperationOptionsToRepository = map[models.SDKOperationOptionObjectDefinitionType]dataapimodels.OptionObjectDefinitionType{ - models.BooleanSDKOperationOptionObjectDefinitionType: dataapimodels.BooleanOptionObjectDefinitionType, - models.CSVSDKOperationOptionObjectDefinitionType: dataapimodels.CsvOptionObjectDefinitionType, - models.IntegerSDKOperationOptionObjectDefinitionType: dataapimodels.IntegerOptionObjectDefinitionType, - models.FloatSDKOperationOptionObjectDefinitionType: dataapimodels.FloatOptionObjectDefinitionType, - models.ListSDKOperationOptionObjectDefinitionType: dataapimodels.ListOptionObjectDefinitionType, - models.ReferenceSDKOperationOptionObjectDefinitionType: dataapimodels.ReferenceOptionObjectDefinitionType, - models.StringSDKOperationOptionObjectDefinitionType: dataapimodels.StringOptionObjectDefinitionType, -} - -func mapSDKOperationOptionToRepository(definition models.SDKOperationOptionObjectDefinition, constants map[string]models.SDKConstant, models map[string]models.SDKModel, commonTypes models.CommonTypes) (*dataapimodels.OptionObjectDefinition, error) { - typeVal, ok := sdkOperationOptionsToRepository[definition.Type] - if !ok { - return nil, fmt.Errorf("internal-error: no OptionObjectDefinition mapping is defined for the OptionObjectDefinition Type %q", string(definition.Type)) - } - - output := dataapimodels.OptionObjectDefinition{ - Type: typeVal, - ReferenceName: nil, - NestedItem: nil, - } - - if definition.ReferenceName != nil { - output.ReferenceName = definition.ReferenceName - } - - if definition.NestedItem != nil { - nestedItem, err := mapSDKOperationOptionToRepository(*definition.NestedItem, constants, models, commonTypes) - if err != nil { - return nil, fmt.Errorf("mapping nested option object definition: %+v", err) - } - output.NestedItem = nestedItem - } - - // finally let's do some sanity-checking to ensure the data being output looks legit - if err := validateSDKOperationOptionObjectDefinition(output, constants, models, commonTypes); err != nil { - return nil, fmt.Errorf("validating mapped OptionObjectDefinition: %+v", err) - } - - return &output, nil -} - -func validateSDKOperationOptionObjectDefinition(input dataapimodels.OptionObjectDefinition, constants map[string]models.SDKConstant, models map[string]models.SDKModel, commonTypes models.CommonTypes) error { - requiresNestedItem := input.Type == dataapimodels.CsvOptionObjectDefinitionType || input.Type == dataapimodels.ListOptionObjectDefinitionType - requiresReference := input.Type == dataapimodels.ReferenceOptionObjectDefinitionType - if requiresNestedItem && input.NestedItem == nil { - return fmt.Errorf("a Nested Object Definition must be specified for a %q type but didn't get one", string(input.Type)) - } - if !requiresNestedItem && input.NestedItem != nil { - return fmt.Errorf("a Nested Object Definition must not be specified for a %q type but got %q", string(input.Type), string(input.NestedItem.Type)) - } - if requiresReference { - if input.ReferenceName == nil { - return fmt.Errorf("a Reference must be specified for a %q type but didn't get one", string(input.Type)) - } - - _, isLocalConstant := constants[*input.ReferenceName] - var isCommonConstant bool - if commonTypes.Constants != nil { - _, isCommonConstant = commonTypes.Constants[*input.ReferenceName] - } - - if input.ReferenceNameIsCommonType != nil && *input.ReferenceNameIsCommonType { - if !isCommonConstant { - return fmt.Errorf("reference %q was not found as a common constant or model", *input.ReferenceName) - } - } else if !isLocalConstant { - return fmt.Errorf("reference %q was not found as a local constant or model", *input.ReferenceName) - } - } - if !requiresReference && input.ReferenceName != nil { - return fmt.Errorf("a Reference must not be specified for a %q type but got %q", string(input.Type), *input.ReferenceName) - } - - return nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/service_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/service_definition.go deleted file mode 100644 index 3addc7b6d82..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/service_definition.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "sort" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapServiceDefinitionToRepository(serviceName string, resourceProvider *string, terraformDefinition *models.TerraformDefinition) (*dataapimodels.ServiceDefinition, error) { - output := dataapimodels.ServiceDefinition{ - Name: serviceName, - ResourceProvider: resourceProvider, - Generate: true, - } - - if terraformDefinition != nil { - // TODO: remove this once the repository is consolidated since this should be inferrable - terraformResourceNames := make([]string, 0) - for _, resource := range terraformDefinition.Resources { - terraformResourceNames = append(terraformResourceNames, resource.ResourceName) - } - sort.Strings(terraformResourceNames) - - //TODO: remove this field once the repository package is consolidated - output.TerraformPackageName = pointer.To(terraformDefinition.TerraformPackageName) - output.Terraform = &dataapimodels.TerraformServiceDefinition{ - ServicePackageName: terraformDefinition.TerraformPackageName, - Resources: terraformResourceNames, - } - } - - return &output, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_mapping_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_mapping_definition.go deleted file mode 100644 index 19c6fc8bac8..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_mapping_definition.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapTerraformSchemaMappingsToRepository(input models.TerraformMappingDefinition) (*dataapimodels.TerraformMappingDefinition, error) { - output := dataapimodels.TerraformMappingDefinition{} - - fieldMappings := make([]dataapimodels.TerraformFieldMappingDefinition, 0) - modelToModelMappings := make([]dataapimodels.TerraformModelToModelMappingDefinition, 0) - for _, item := range input.Fields { - if v, ok := item.(models.TerraformDirectAssignmentFieldMappingDefinition); ok { - // DirectAssignment Mappings come solely from the Mapping themselves - fieldMappings = append(fieldMappings, dataapimodels.TerraformFieldMappingDefinition{ - Type: dataapimodels.DirectAssignmentTerraformFieldMappingDefinitionType, - DirectAssignment: &dataapimodels.TerraformFieldMappingDirectAssignmentDefinition{ - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", v.DirectAssignment.TerraformSchemaModelName), - SchemaFieldPath: v.DirectAssignment.TerraformSchemaFieldName, - SdkModelName: v.DirectAssignment.SDKModelName, - SdkFieldPath: v.DirectAssignment.SDKFieldName, - }, - }) - // NOTE: any duplications get removed below - so this is safe for now - modelToModelMappings = append(modelToModelMappings, dataapimodels.TerraformModelToModelMappingDefinition{ - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", v.DirectAssignment.TerraformSchemaModelName), - SdkModelName: v.DirectAssignment.SDKModelName, - }) - continue - } - - if v, ok := item.(models.TerraformModelToModelFieldMappingDefinition); ok { - // ModelToModel mappings need to be output both for Fields and for the Models themselves - // this is because a ModelToModel mapping must exist from the Schema Model to the SDK Model - // but also from a given Schema Field to a given SDK Model. - // - // This allows both the mapping function between two models to be generated (the `ModelToModelMappings`) - // and the mapping between a given Schema Field and an SDK Model (so that we know to call the - // mapping function defined in the `ModelToModelMappings`). - fieldMappings = append(fieldMappings, dataapimodels.TerraformFieldMappingDefinition{ - Type: dataapimodels.ModelToModelTerraformFieldMappingDefinitionType, - ModelToModel: &dataapimodels.TerraformFieldMappingModelToModelDefinition{ - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", v.ModelToModel.TerraformSchemaModelName), - SdkModelName: v.ModelToModel.SDKModelName, - SdkFieldName: v.ModelToModel.SDKFieldName, - }, - }) - // NOTE: any duplications get removed below - so this is safe for now - modelToModelMappings = append(modelToModelMappings, dataapimodels.TerraformModelToModelMappingDefinition{ - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", v.ModelToModel.TerraformSchemaModelName), - SdkModelName: v.ModelToModel.SDKModelName, - }) - continue - } - - return nil, fmt.Errorf("internal-error: missing mapping implementation for %T", item) - } - - for _, item := range input.ModelToModels { - // NOTE: any duplications get removed below - modelToModelMappings = append(modelToModelMappings, dataapimodels.TerraformModelToModelMappingDefinition{ - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", item.TerraformSchemaModelName), - SdkModelName: item.SDKModelName, - }) - } - - // Now that we've collated everything, we should sort the keys in the output - // to prevent superfluous reordering between regenerations - outputFieldMappings, err := orderFieldMappings(fieldMappings) - if err != nil { - return nil, fmt.Errorf("ordering the field mappings: %+v", err) - } - if len(*outputFieldMappings) > 0 { - output.FieldMappings = outputFieldMappings - } - - modelToModelMappings = uniqueAndSortModelToModelMappings(modelToModelMappings) - if len(modelToModelMappings) > 0 { - output.ModelToModelMappings = &modelToModelMappings - } - - // Finally ResourceId Mappings are between a given (root-level) Schema Field and a Resource ID Segment - resourceIdMappings := mapTerraformSchemaResourceIdMappingsToRepository(input.ResourceID) - if len(resourceIdMappings) > 0 { - output.ResourceIdMappings = &resourceIdMappings - } - - return &output, nil -} - -func mapTerraformSchemaResourceIdMappingsToRepository(input []models.TerraformResourceIDMappingDefinition) []dataapimodels.TerraformResourceIdMappingDefinition { - // we need the ordering to be consistent else to avoid noisy regenerations, so let's order this on one of the keys - segmentNames := make([]string, 0) - segmentNamesToResourceIdMappings := make(map[string]models.TerraformResourceIDMappingDefinition) - for _, item := range input { - segmentNames = append(segmentNames, item.SegmentName) - segmentNamesToResourceIdMappings[item.SegmentName] = item - } - sort.Strings(segmentNames) - - output := make([]dataapimodels.TerraformResourceIdMappingDefinition, 0) - for _, schemaFieldName := range segmentNames { - resourceIdMapping := segmentNamesToResourceIdMappings[schemaFieldName] - output = append(output, dataapimodels.TerraformResourceIdMappingDefinition{ - SchemaFieldName: resourceIdMapping.TerraformSchemaFieldName, - SegmentName: resourceIdMapping.SegmentName, - ParsedFromParentId: resourceIdMapping.ParsedFromParentID, - }) - } - return output -} - -func orderFieldMappings(input []dataapimodels.TerraformFieldMappingDefinition) (*[]dataapimodels.TerraformFieldMappingDefinition, error) { - keys := make([]string, 0) - keysToValues := make(map[string]dataapimodels.TerraformFieldMappingDefinition) - for _, item := range input { - key := "" - switch item.Type { - case dataapimodels.DirectAssignmentTerraformFieldMappingDefinitionType: - { - key = fmt.Sprintf("%s-%s-%s-%s-%s", string(item.Type), item.DirectAssignment.SchemaModelName, item.DirectAssignment.SchemaFieldPath, item.DirectAssignment.SdkModelName, item.DirectAssignment.SdkFieldPath) - } - - case dataapimodels.ModelToModelTerraformFieldMappingDefinitionType: - { - key = fmt.Sprintf("%s-%s-%s-%s", string(item.Type), item.ModelToModel.SchemaModelName, item.ModelToModel.SdkModelName, item.ModelToModel.SdkFieldName) - } - - case dataapimodels.ManualTerraformFieldMappingDefinitionType: - { - key = fmt.Sprintf("%s-%s", string(item.Type), item.Manual.MethodName) - } - - default: - { - // the likelihood of us getting here without being caught above is low, and so would - // only happen during development - whilst we could panic it's probably easiest to - // reuse the same error as above so both get fixed concurrently. - return nil, fmt.Errorf("internal-error: missing mapping implementation for %q", string(item.Type)) - } - } - - // using this key format means we'll also de-dupe this slice at the same time - keys = append(keys, key) - keysToValues[key] = item - } - sort.Strings(keys) - - output := make([]dataapimodels.TerraformFieldMappingDefinition, 0) - for _, key := range keys { - value := keysToValues[key] - output = append(output, value) - } - return &output, nil -} - -func uniqueAndSortModelToModelMappings(input []dataapimodels.TerraformModelToModelMappingDefinition) []dataapimodels.TerraformModelToModelMappingDefinition { - keysToValues := make(map[string]dataapimodels.TerraformModelToModelMappingDefinition) - for _, item := range input { - // using this key format means we'll also de-dupe this slice at the same time - key := fmt.Sprintf("%s-%s", item.SchemaModelName, item.SdkModelName) - keysToValues[key] = item - } - - keys := make([]string, 0) - for k := range keysToValues { - keys = append(keys, k) - } - sort.Strings(keys) - - output := make([]dataapimodels.TerraformModelToModelMappingDefinition, 0) - for _, key := range keys { - output = append(output, keysToValues[key]) - } - - return output -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_method_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_method_definition.go deleted file mode 100644 index f79ec9cc18f..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_method_definition.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapTerraformMethodDefinitionToRepository(input models.TerraformMethodDefinition) dataapimodels.TerraformMethodDefinition { - return dataapimodels.TerraformMethodDefinition{ - Generate: input.Generate, - Name: input.SDKOperationName, - TimeoutInMinutes: input.TimeoutInMinutes, - } -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_resource_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_resource_definition.go deleted file mode 100644 index 0d5457ec0c0..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_resource_definition.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapTerraformResourceDefinitionToRepository(resourceLabel string, input models.TerraformResourceDefinition) (*dataapimodels.TerraformResourceDefinition, error) { - // TODO: ExampleUsage should probably go out into a file - perhaps `Resource-ExampleUsage.hcl`? - output := dataapimodels.TerraformResourceDefinition{ - ApiVersion: input.APIVersion, - Category: input.Documentation.Category, - CreateMethod: mapTerraformMethodDefinitionToRepository(input.CreateMethod), - DeleteMethod: mapTerraformMethodDefinitionToRepository(input.DeleteMethod), - Description: input.Documentation.Description, - DisplayName: input.DisplayName, - ExampleUsage: input.Documentation.ExampleUsageHCL, - Generate: input.Generate, - GenerateIdValidationFunction: input.GenerateIDValidation, - GenerateModel: input.GenerateModel, - GenerateSchema: input.GenerateSchema, - Label: resourceLabel, - ReadMethod: mapTerraformMethodDefinitionToRepository(input.ReadMethod), - Resource: input.APIResource, - ResourceIdName: input.ResourceIDName, - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - SchemaModelName: fmt.Sprintf("%sSchema", input.SchemaModelName), - // TODO: output tests here - UpdateMethod: nil, - } - if input.UpdateMethod != nil { - mapped := mapTerraformMethodDefinitionToRepository(*input.UpdateMethod) - output.UpdateMethod = pointer.To(mapped) - } - - return &output, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field.go deleted file mode 100644 index c73e0108e92..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapTerraformSchemaFieldToRepository(fieldName string, input models.TerraformSchemaField) (*dataapimodels.TerraformSchemaField, error) { - objectDefinition, err := MapTerraformSchemaObjectDefinitionToRepository(input.ObjectDefinition) - if err != nil { - return nil, fmt.Errorf("mapping Terraform Schema Object Definition: %+v", err) - } - - output := dataapimodels.TerraformSchemaField{ - HclName: input.HCLName, - Name: fieldName, - ObjectDefinition: *objectDefinition, - } - - if input.Computed { - output.Computed = pointer.To(true) - } - if input.ForceNew { - output.ForceNew = pointer.To(true) - } - if input.Optional { - output.Optional = pointer.To(true) - } - if input.Required { - output.Required = pointer.To(true) - } - if input.Documentation.Markdown != "" { - output.Documentation = &dataapimodels.TerraformSchemaFieldDocumentation{ - Markdown: input.Documentation.Markdown, - } - } - if input.Validation != nil { - validation, err := mapTerraformSchemaFieldValidationToRepository(input.Validation) - if err != nil { - return nil, fmt.Errorf("building validation: %+v", err) - } - output.Validation = validation - } - - // sanity-check - if !input.Computed && !input.Optional && !input.Required { - return nil, fmt.Errorf("the field %q is neither Computed, Optional or Required - this is a bug", fieldName) - } - - return &output, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field_validation.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field_validation.go deleted file mode 100644 index 71bda1d61e2..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_field_validation.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func mapTerraformSchemaFieldValidationToRepository(input models.TerraformSchemaFieldValidationDefinition) (*dataapimodels.TerraformSchemaFieldValidationDefinition, error) { - - if v, ok := input.(models.TerraformSchemaFieldValidationPossibleValuesDefinition); ok { - val, ok := terraformSchemaFieldPossibleValuesTypesToRepository[v.PossibleValues.Type] - if !ok { - return nil, fmt.Errorf("internal-error: missing mapping for Validation PossibleValueType %q", string(v.PossibleValues.Type)) - } - - return &dataapimodels.TerraformSchemaFieldValidationDefinition{ - Type: dataapimodels.PossibleValuesTerraformSchemaValidationType, - PossibleValues: &dataapimodels.TerraformSchemaValidationPossibleValuesDefinition{ - Type: val, - Values: v.PossibleValues.Values, - }, - }, nil - } - - return nil, fmt.Errorf("internal-error: missing mapping for Schema Field Validation Type %T", input) -} - -var terraformSchemaFieldPossibleValuesTypesToRepository = map[models.TerraformSchemaFieldValidationPossibleValuesType]dataapimodels.TerraformSchemaValidationPossibleValuesType{ - models.IntegerTerraformSchemaFieldValidationPossibleValuesType: dataapimodels.FloatTerraformSchemaValidationPossibleValuesType, - models.FloatTerraformSchemaFieldValidationPossibleValuesType: dataapimodels.IntegerTerraformSchemaValidationPossibleValuesType, - models.StringTerraformSchemaFieldValidationPossibleValuesType: dataapimodels.StringTerraformSchemaValidationPossibleValuesType, -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_model.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_model.go deleted file mode 100644 index dc4cfec0417..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_model.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "sort" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapTerraformSchemaModelToRepository(modelName string, schemaModel models.TerraformSchemaModelDefinition) (*dataapimodels.TerraformSchemaModel, error) { - fieldList := make([]string, 0) - for f := range schemaModel.Fields { - fieldList = append(fieldList, f) - } - sort.Strings(fieldList) - - schemaFields := make([]dataapimodels.TerraformSchemaField, 0) - for _, fieldName := range fieldList { - def := schemaModel.Fields[fieldName] - - fieldBody, err := mapTerraformSchemaFieldToRepository(fieldName, def) - if err != nil { - return nil, fmt.Errorf("mapping the terraform schema field %q: %+v", fieldName, err) - } - - schemaFields = append(schemaFields, *fieldBody) - } - - return &dataapimodels.TerraformSchemaModel{ - Fields: schemaFields, - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - Name: fmt.Sprintf("%sSchema", modelName), - }, nil -} diff --git a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_object_definition.go b/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_object_definition.go deleted file mode 100644 index 17f21248d99..00000000000 --- a/tools/importer-msgraph-metadata/components/dataapigeneratorjson/transforms/terraform_schema_object_definition.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package transforms - -import ( - "fmt" - "strings" - - "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/sdk/dataapimodels" -) - -func MapTerraformSchemaObjectDefinitionToRepository(input models.TerraformSchemaObjectDefinition) (*dataapimodels.TerraformSchemaObjectDefinition, error) { - mapped, ok := terraformSchemaObjectDefinitionTypesToRepository[input.Type] - if !ok { - return nil, fmt.Errorf("internal-error: missing mapping for the Terraform Schema Field Object Definition %q", string(input.Type)) - } - - objectDefinition := dataapimodels.TerraformSchemaObjectDefinition{ - ReferenceName: input.ReferenceName, - Type: mapped, - } - - if input.ReferenceName != nil && !strings.HasSuffix(*input.ReferenceName, "Schema") { - // todo remove Schema when https://github.com/hashicorp/pandora/issues/3346 is addressed - referenceName := fmt.Sprintf("%sSchema", *input.ReferenceName) - objectDefinition.ReferenceName = &referenceName - } - - if input.NestedObject != nil { - nestedItem, err := MapTerraformSchemaObjectDefinitionToRepository(*input.NestedObject) - if err != nil { - return nil, fmt.Errorf("mapping nested Object Definition: %+v", err) - } - objectDefinition.NestedItem = nestedItem - } - - return &objectDefinition, nil -} - -var terraformSchemaObjectDefinitionTypesToRepository = map[models.TerraformSchemaObjectDefinitionType]dataapimodels.TerraformSchemaObjectDefinitionType{ - // Simple Types - models.BooleanTerraformSchemaObjectDefinitionType: dataapimodels.BooleanTerraformSchemaObjectDefinitionType, - models.DateTimeTerraformSchemaObjectDefinitionType: dataapimodels.DateTimeTerraformSchemaObjectDefinitionType, - models.FloatTerraformSchemaObjectDefinitionType: dataapimodels.FloatTerraformSchemaObjectDefinitionType, - models.IntegerTerraformSchemaObjectDefinitionType: dataapimodels.IntegerTerraformSchemaObjectDefinitionType, - models.StringTerraformSchemaObjectDefinitionType: dataapimodels.StringTerraformSchemaObjectDefinitionType, - - // Complex Types - models.DictionaryTerraformSchemaObjectDefinitionType: dataapimodels.DictionaryTerraformSchemaObjectDefinitionType, - models.ListTerraformSchemaObjectDefinitionType: dataapimodels.ListTerraformSchemaObjectDefinitionType, - models.ReferenceTerraformSchemaObjectDefinitionType: dataapimodels.ReferenceTerraformSchemaObjectDefinitionType, - models.SetTerraformSchemaObjectDefinitionType: dataapimodels.SetTerraformSchemaObjectDefinitionType, - - // Common Schema Types - models.EdgeZoneTerraformSchemaObjectDefinitionType: dataapimodels.EdgeZoneTerraformSchemaObjectDefinitionType, - models.LocationTerraformSchemaObjectDefinitionType: dataapimodels.LocationTerraformSchemaObjectDefinitionType, - models.ResourceGroupTerraformSchemaObjectDefinitionType: dataapimodels.ResourceGroupTerraformSchemaObjectDefinitionType, - models.SystemAssignedIdentityTerraformSchemaObjectDefinitionType: dataapimodels.SystemAssignedIdentityTerraformSchemaObjectDefinitionType, - models.SystemAndUserAssignedIdentityTerraformSchemaObjectDefinitionType: dataapimodels.SystemAndUserAssignedIdentityTerraformSchemaObjectDefinitionType, - models.SystemOrUserAssignedIdentityTerraformSchemaObjectDefinitionType: dataapimodels.SystemOrUserAssignedIdentityTerraformSchemaObjectDefinitionType, - models.TagsTerraformSchemaObjectDefinitionType: dataapimodels.TagsTerraformSchemaObjectDefinitionType, - models.UserAssignedIdentityTerraformSchemaObjectDefinitionType: dataapimodels.UserAssignedIdentityTerraformSchemaObjectDefinitionType, - models.ZoneTerraformSchemaObjectDefinitionType: dataapimodels.ZoneTerraformSchemaObjectDefinitionType, - models.ZonesTerraformSchemaObjectDefinitionType: dataapimodels.ZonesTerraformSchemaObjectDefinitionType, -} diff --git a/tools/importer-msgraph-metadata/go.mod b/tools/importer-msgraph-metadata/go.mod index dd6760d505b..8fea7689338 100644 --- a/tools/importer-msgraph-metadata/go.mod +++ b/tools/importer-msgraph-metadata/go.mod @@ -1,6 +1,8 @@ module github.com/hashicorp/pandora/tools/importer-msgraph-metadata -go 1.21 +go 1.22.1 + +toolchain go1.22.3 require ( github.com/davecgh/go-spew v1.1.1 @@ -8,6 +10,7 @@ require ( github.com/go-git/go-git/v5 v5.11.0 github.com/hashicorp/go-azure-helpers v0.66.2 github.com/hashicorp/go-hclog v1.4.0 + github.com/hashicorp/pandora/tools/data-api-repository v0.0.0-00010101000000-000000000000 github.com/hashicorp/pandora/tools/data-api-sdk v0.0.0-00010101000000-000000000000 github.com/hashicorp/pandora/tools/sdk v0.0.0-20230809001200-97c549958463 github.com/jedib0t/go-pretty/v6 v6.4.6 @@ -74,6 +77,8 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) +replace github.com/hashicorp/pandora/tools/data-api-repository => ../data-api-repository + replace github.com/hashicorp/pandora/tools/sdk => ../sdk replace github.com/hashicorp/pandora/tools/data-api-sdk => ../data-api-sdk diff --git a/tools/importer-msgraph-metadata/internal/logging/log.go b/tools/importer-msgraph-metadata/internal/logging/log.go deleted file mode 100644 index 4fc7607cad8..00000000000 --- a/tools/importer-msgraph-metadata/internal/logging/log.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) HashiCorp, Inc. -// SPDX-License-Identifier: MPL-2.0 - -package logging - -import "github.com/hashicorp/go-hclog" - -var Log hclog.Logger - -func init() { - Log = hclog.NewNullLogger() -} diff --git a/tools/importer-msgraph-metadata/internal/pipeline/pipeline.go b/tools/importer-msgraph-metadata/internal/pipeline/pipeline.go index ed67a41b901..f1792451c08 100644 --- a/tools/importer-msgraph-metadata/internal/pipeline/pipeline.go +++ b/tools/importer-msgraph-metadata/internal/pipeline/pipeline.go @@ -9,15 +9,15 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/getkin/kin-openapi/openapi3" "github.com/hashicorp/go-hclog" + "github.com/hashicorp/pandora/tools/data-api-repository/repository" sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson" "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/parser" ) type pipeline struct { apiVersion string commonTypesForVersion sdkModels.CommonTypes - repo dataapigeneratorjson.Repository + repo repository.Repository logger hclog.Logger metadataGitSha string outputDirectory string diff --git a/tools/importer-msgraph-metadata/internal/pipeline/run_importer.go b/tools/importer-msgraph-metadata/internal/pipeline/run_importer.go index f59f3084143..6dd2ffbbce8 100644 --- a/tools/importer-msgraph-metadata/internal/pipeline/run_importer.go +++ b/tools/importer-msgraph-metadata/internal/pipeline/run_importer.go @@ -8,7 +8,7 @@ import ( "path/filepath" "github.com/getkin/kin-openapi/openapi3" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson" + "github.com/hashicorp/pandora/tools/data-api-repository/repository" "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/parser" "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/tags" "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/versions" @@ -62,7 +62,7 @@ func runImportForVersion(input RunInput, apiVersion, openApiFile, metadataGitSha logger: input.Logger, metadataGitSha: metadataGitSha, outputDirectory: input.OutputDirectory, - repo: dataapigeneratorjson.NewRepository(input.OutputDirectory), + repo: repository.NewRepository(input.OutputDirectory, input.Logger), spec: spec, } diff --git a/tools/importer-msgraph-metadata/internal/pipeline/task_persist_common_types.go b/tools/importer-msgraph-metadata/internal/pipeline/task_persist_common_types.go index 06a6e51916e..71370f56585 100644 --- a/tools/importer-msgraph-metadata/internal/pipeline/task_persist_common_types.go +++ b/tools/importer-msgraph-metadata/internal/pipeline/task_persist_common_types.go @@ -3,18 +3,16 @@ package pipeline import ( "fmt" - "github.com/hashicorp/go-azure-helpers/lang/pointer" - dataapisdk "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" + "github.com/hashicorp/pandora/tools/data-api-repository/repository" sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson" ) func (p pipeline) PersistCommonTypesDefinitions() error { p.logger.Debug(fmt.Sprintf("removing any existing Common Types Definitions with Version %q", p.apiVersion)) - removeCommonTypesOpts := dataapigeneratorjson.RemoveCommonTypesOptions{ - SourceDataOrigin: dataapisdk.MicrosoftGraphMetaDataSourceDataOrigin, - SourceDataType: dataapisdk.MicrosoftGraphSourceDataType, + removeCommonTypesOpts := repository.RemoveCommonTypesOptions{ + SourceDataOrigin: sdkModels.MicrosoftGraphMetaDataSourceDataOrigin, + SourceDataType: sdkModels.MicrosoftGraphSourceDataType, Version: p.apiVersion, } @@ -28,11 +26,11 @@ func (p pipeline) PersistCommonTypesDefinitions() error { p.apiVersion: p.commonTypesForVersion, } - opts := dataapigeneratorjson.SaveCommonTypesOptions{ - AzureRestAPISpecsGitSHA: pointer.To(p.metadataGitSha), - CommonTypes: commonTypes, - SourceDataOrigin: dataapisdk.MicrosoftGraphMetaDataSourceDataOrigin, - SourceDataType: dataapisdk.MicrosoftGraphSourceDataType, + opts := repository.SaveCommonTypesOptions{ + SourceCommitSHA: pointerTo(p.metadataGitSha), + CommonTypes: commonTypes, + SourceDataOrigin: sdkModels.MicrosoftGraphMetaDataSourceDataOrigin, + SourceDataType: sdkModels.MicrosoftGraphSourceDataType, } if err := p.repo.SaveCommonTypes(opts); err != nil { diff --git a/tools/importer-msgraph-metadata/internal/pipeline/task_persist_service.go b/tools/importer-msgraph-metadata/internal/pipeline/task_persist_service.go index f1c03fd18f6..1aecae53bc4 100644 --- a/tools/importer-msgraph-metadata/internal/pipeline/task_persist_service.go +++ b/tools/importer-msgraph-metadata/internal/pipeline/task_persist_service.go @@ -3,10 +3,8 @@ package pipeline import ( "fmt" - "github.com/hashicorp/go-azure-helpers/lang/pointer" - dataapisdk "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" + "github.com/hashicorp/pandora/tools/data-api-repository/repository" sdkModels "github.com/hashicorp/pandora/tools/data-api-sdk/v1/models" - "github.com/hashicorp/pandora/tools/importer-msgraph-metadata/components/dataapigeneratorjson" ) func (p pipelineForService) persistApiDefinitions(sdkServices map[string]sdkModels.Service, commonTypes map[string]sdkModels.CommonTypes) error { @@ -14,10 +12,10 @@ func (p pipelineForService) persistApiDefinitions(sdkServices map[string]sdkMode for version := range service.APIVersions { p.logger.Debug(fmt.Sprintf("removing any existing API Definitions for the Service %q with Version %q", serviceName, version)) - removeServiceOpts := dataapigeneratorjson.RemoveServiceOptions{ + removeServiceOpts := repository.RemoveServiceOptions{ ServiceName: serviceName, - SourceDataOrigin: dataapisdk.MicrosoftGraphMetaDataSourceDataOrigin, - SourceDataType: dataapisdk.MicrosoftGraphSourceDataType, + SourceDataOrigin: sdkModels.MicrosoftGraphMetaDataSourceDataOrigin, + SourceDataType: sdkModels.MicrosoftGraphSourceDataType, Version: version, } @@ -28,13 +26,13 @@ func (p pipelineForService) persistApiDefinitions(sdkServices map[string]sdkMode p.logger.Info(fmt.Sprintf("persisting API Definitions for Service %q..", serviceName)) - opts := dataapigeneratorjson.SaveServiceOptions{ - AzureRestAPISpecsGitSHA: pointer.To(p.metadataGitSha), - CommonTypes: commonTypes, - Service: service, - ServiceName: serviceName, - SourceDataOrigin: dataapisdk.MicrosoftGraphMetaDataSourceDataOrigin, - SourceDataType: dataapisdk.MicrosoftGraphSourceDataType, + opts := repository.SaveServiceOptions{ + CommonTypes: commonTypes, + Service: service, + ServiceName: serviceName, + SourceCommitSHA: pointerTo(p.metadataGitSha), + SourceDataOrigin: sdkModels.MicrosoftGraphMetaDataSourceDataOrigin, + SourceDataType: sdkModels.MicrosoftGraphSourceDataType, } if err := p.repo.SaveService(opts); err != nil { diff --git a/tools/importer-rest-api-specs/pipeline/run_importer.go b/tools/importer-rest-api-specs/pipeline/run_importer.go index f19e2133e77..dd9ef35d1d3 100644 --- a/tools/importer-rest-api-specs/pipeline/run_importer.go +++ b/tools/importer-rest-api-specs/pipeline/run_importer.go @@ -128,7 +128,7 @@ func runImportForService(input RunInput, serviceName string, apiVersionsForServi } } - // Populate all of the data for this API Version.. + // Populate all the data for this API Version.. dataForApiVersions := make([]importerModels.AzureApiDefinition, 0) for apiVersion, api := range consolidatedApiVersions { versionLogger := logger.Named(fmt.Sprintf("Importer for API Version %q", apiVersion)) @@ -155,7 +155,7 @@ func runImportForService(input RunInput, serviceName string, apiVersionsForServi dataForApiVersions = append(dataForApiVersions, *dataForApiVersion) } - // Now that we've got all of the API Versions, build up the Terraform Resources + // Now that we've got all the API Versions, build up the Terraform Resources // NOTE: in the near future this will be refactored to be for a Service, this is a stepping-stone refactor // in that direction - as that requires more significant refactoring to the `terraform` package. dataForApiVersionsWithTerraformDetails := make([]importerModels.AzureApiDefinition, 0) @@ -178,14 +178,14 @@ func runImportForService(input RunInput, serviceName string, apiVersionsForServi logger.Info(fmt.Sprintf("Persisting API Definitions for Service %s..", serviceName)) opts := repository.SaveServiceOptions{ - SourceCommitSHA: pointer.To(swaggerGitSha), ResourceProvider: resourceProvider, Service: *service, ServiceName: serviceName, + SourceCommitSHA: pointer.To(swaggerGitSha), SourceDataOrigin: sourceDataOrigin, SourceDataType: sourceDataType, } - if err := repo.SaveService(opts); err != nil { + if err = repo.SaveService(opts); err != nil { return fmt.Errorf("persisting Data API Definitions for Service %q: %+v", serviceName, err) }