utils/helper.go (133 lines of code) (raw):

package utils import ( "fmt" "net/url" "strings" "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm" "github.com/Azure/terraform-provider-azapi/internal/azure/types" tf_types "github.com/hashicorp/terraform-plugin-framework/types" ) func GetId(resource interface{}) *string { if resource == nil { return nil } if resourceMap, ok := resource.(map[string]interface{}); ok { if id, ok := resourceMap["id"]; ok { idStr := "" if id != nil { idStr = id.(string) } return &idStr } } return nil } func GetResourceType(id string) string { if id == "/" { return arm.TenantResourceType.String() } resourceType, err := arm.ParseResourceType(id) if err != nil { return "" } return resourceType.String() } func GetName(id string) string { resourceId, err := arm.ParseResourceID(id) if err != nil { return "" } return resourceId.Name } func GetParentId(id string) string { resourceId, err := arm.ParseResourceID(id) if err != nil { return "" } if resourceId.Parent.ResourceType.String() == arm.TenantResourceType.String() { return "/" } return resourceId.Parent.String() } func GetParentType(resourceType string) string { parts := strings.Split(resourceType, "/") if len(parts) <= 2 { return "" } return strings.Join(parts[0:len(parts)-1], "/") } func GetScopeType(id string) types.ScopeType { if len(id) == 0 || id == "/" { return types.Tenant } idURL, err := url.ParseRequestURI(id) if err != nil { return types.Unknown } path := idURL.Path path = strings.TrimPrefix(path, "/") path = strings.TrimSuffix(path, "/") components := strings.Split(path, "/") componentsBeforeProvider := make([]string, 0) for _, part := range components { if strings.EqualFold(part, "providers") { break } componentsBeforeProvider = append(componentsBeforeProvider, part) } if len(componentsBeforeProvider) == 0 { mgmtPrefix := "providers/Microsoft.Management/managementGroups" if len(path) >= len(mgmtPrefix) && strings.EqualFold(path[0:len(mgmtPrefix)], mgmtPrefix) { return types.ManagementGroup } else { return types.Tenant } } // #nosec G602 if len(componentsBeforeProvider) == 2 && strings.EqualFold(componentsBeforeProvider[0], "subscriptions") { return types.Subscription } // #nosec G602 if len(componentsBeforeProvider) == 4 && strings.EqualFold(componentsBeforeProvider[0], "subscriptions") && // #nosec G602 strings.EqualFold(componentsBeforeProvider[2], "resourceGroups") { return types.ResourceGroup } return types.Unknown } func GetAzureResourceTypeApiVersion(resourceType string) (string, string, error) { parts := strings.Split(resourceType, "@") apiVersion := "" azureResourceType := "" if len(parts) == 2 { apiVersion = parts[1] azureResourceType = parts[0] } else { return "", "", fmt.Errorf("`type` is invalid, it should be like `ResourceProvider/resourceTypes@ApiVersion`") } return azureResourceType, apiVersion, nil } func IsTopLevelResourceType(resourceType string) bool { return len(strings.Split(resourceType, "/")) == 2 } func GetAzureResourceType(resourceType string, apiVersion string) string { return fmt.Sprintf("%s@%s", resourceType, apiVersion) } func GetAzureResourceTypeParts(azureResourceType string) (resourceProvider string, parts []string, err error) { parts = strings.Split(azureResourceType, "/") if len(parts) < 2 { return "", nil, fmt.Errorf("invalid azure resource type, it should be like `ResourceProvider/resourceTypes`") } return parts[0], parts[1:], nil } func ParseResourceNames(resourceNamesParam tf_types.List) []string { resourceNamesList := resourceNamesParam.Elements() resourceNames := make([]string, len(resourceNamesList)) for i, element := range resourceNamesList { resourceNames[i] = element.(tf_types.String).ValueString() } return resourceNames } // TryAppendDefaultApiVersion appends the default api version to the resource type if it is not already present. func TryAppendDefaultApiVersion(resourceType string) string { if !strings.Contains(resourceType, "@") { resourceType += "@latest" } return resourceType }