Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 154 additions & 7 deletions config/external_name.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,22 +105,169 @@ var storageIdentifierFromProvider = config.ExternalName{
DisableNameInitializer: true,
}

var privateNetworkIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// If external-name is empty, the resource hasn't been created yet,
// so we should return empty string instead of constructing an incomplete ID
if externalName == "" {
return "", nil
}
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}
return fmt.Sprintf("%s/%s", serviceName, externalName), nil
},
DisableNameInitializer: true,
}

var subnetIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// If external-name is empty, the resource hasn't been created yet,
// so we should return empty string instead of constructing an incomplete ID
if externalName == "" {
return "", nil
}
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}

networkID, ok := parameters["network_id"]
if !ok {
return "", errors.Errorf(ErrFmtNoAttribute, "network_id")
}
networkIDStr, ok := networkID.(string)
if !ok {
return "", errors.Errorf(ErrFmtUnexpectedType, "network_id")
}

return fmt.Sprintf("%s/%s/%s", serviceName, networkIDStr, externalName), nil
},
DisableNameInitializer: true,
}

var userIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// If external-name is empty, the resource hasn't been created yet,
// so we should return empty string instead of constructing an incomplete ID
if externalName == "" {
return "", nil
}
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}
return fmt.Sprintf("%s/%s", serviceName, externalName), nil
},
DisableNameInitializer: true,
}

var s3CredentialsIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// If external-name is empty, the resource hasn't been created yet,
// so we should return empty string instead of constructing an incomplete ID
if externalName == "" {
return "", nil
}
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}

userID, ok := parameters["user_id"]
if !ok {
return "", errors.Errorf(ErrFmtNoAttribute, "user_id")
}
userIDStr, ok := userID.(string)
if !ok {
return "", errors.Errorf(ErrFmtUnexpectedType, "user_id")
}

return fmt.Sprintf("%s/%s/%s", serviceName, userIDStr, externalName), nil
},
DisableNameInitializer: true,
}

var s3PolicyIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// S3Policy doesn't use external-name in its ID format, but we still need
// to check if required parameters are available. For newly created resources
// without an external-name, we should still be able to construct the ID
// since it only depends on service_name/user_id.
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}

userID, ok := parameters["user_id"]
if !ok {
return "", errors.Errorf(ErrFmtNoAttribute, "user_id")
}
userIDStr, ok := userID.(string)
if !ok {
return "", errors.Errorf(ErrFmtUnexpectedType, "user_id")
}

return fmt.Sprintf("%s/%s", serviceName, userIDStr), nil
},
DisableNameInitializer: true,
}

var gatewayIdentifierFromProvider = config.ExternalName{
SetIdentifierArgumentFn: config.NopSetIdentifierArgument,
GetExternalNameFn: config.IDAsExternalName,
GetIDFn: func(ctx context.Context, externalName string, parameters map[string]any, providerConfig map[string]any) (string, error) {
// If external-name is empty, the resource hasn't been created yet,
// so we should return empty string instead of constructing an incomplete ID
if externalName == "" {
return "", nil
}
serviceName, err := serviceName(parameters)
if err != nil {
return serviceName, err
}

region, ok := parameters["region"]
if !ok {
return "", errors.Errorf(ErrFmtNoAttribute, "region")
}
regionStr, ok := region.(string)
if !ok {
return "", errors.Errorf(ErrFmtUnexpectedType, "region")
}

return fmt.Sprintf("%s/%s/%s", serviceName, regionStr, externalName), nil
},
DisableNameInitializer: true,
}

// ExternalNameConfigs contains all external name configurations for this
// provider.
var ExternalNameConfigs = map[string]config.ExternalName{
// Import requires using a randomly generated ID from provider: nl-2e21sda
"ovh_cloud_project_network_private": config.IdentifierFromProvider,
"ovh_cloud_project_network_private_subnet": config.IdentifierFromProvider,
"ovh_cloud_project_network_private_subnet_v2": config.IdentifierFromProvider,
"ovh_cloud_project_network_private": privateNetworkIdentifierFromProvider,
"ovh_cloud_project_network_private_subnet": subnetIdentifierFromProvider,
"ovh_cloud_project_network_private_subnet_v2": subnetIdentifierFromProvider,

"ovh_cloud_project_workflow_backup": config.NameAsIdentifier,
"ovh_cloud_project": config.IdentifierFromProvider,
// The ovh_cloud_project_alerting resource uses a nested type which is not supported yet in upjet.
// there is an open issue in upjet regarding this issue: https://github.com/crossplane/upjet/v2/issues/372
// "ovh_cloud_project_alerting": config.IdentifierFromProvider,
"ovh_cloud_project_user": config.IdentifierFromProvider,
"ovh_cloud_project_user_s3_credential": config.IdentifierFromProvider,
"ovh_cloud_project_user_s3_policy": config.IdentifierFromProvider,
"ovh_cloud_project_user": userIdentifierFromProvider,
"ovh_cloud_project_user_s3_credential": s3CredentialsIdentifierFromProvider,
"ovh_cloud_project_user_s3_policy": s3PolicyIdentifierFromProvider,
"ovh_iam_policy": config.IdentifierFromProvider,
"ovh_iam_resource_group": config.IdentifierFromProvider,
"ovh_iam_permissions_group": config.IdentifierFromProvider,
Expand Down Expand Up @@ -215,7 +362,7 @@ var ExternalNameConfigs = map[string]config.ExternalName{
"ovh_vrack_ip": config.IdentifierFromProvider,
"ovh_vrack_iploadbalancing": config.IdentifierFromProvider,
"ovh_vps": config.IdentifierFromProvider,
"ovh_cloud_project_gateway": config.IdentifierFromProvider,
"ovh_cloud_project_gateway": gatewayIdentifierFromProvider,
"ovh_okms": config.IdentifierFromProvider,
"ovh_okms_credential": config.IdentifierFromProvider,
"ovh_okms_service_key": config.IdentifierFromProvider,
Expand Down
Loading