ec/ecresource/organizationresource/mapper_to_model.go (159 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package organizationresource
import (
"context"
"github.com/elastic/cloud-sdk-go/pkg/models"
"github.com/hashicorp/terraform-plugin-framework/attr"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
)
func apiToModel(ctx context.Context, member models.OrganizationMembership, invitationPending bool, diagnostics *diag.Diagnostics) *OrganizationMember {
organizationRole := organizationRoleApiToModel(member)
deploymentRoles := deploymentRolesApiToModel(ctx, member, diagnostics)
if diagnostics.HasError() {
return nil
}
projectElasticsearchRoles := elasticsearchRolesApiToModel(ctx, member, diagnostics)
if diagnostics.HasError() {
return nil
}
projectObservabilityRoles := observabilityRolesApiToModel(ctx, member, diagnostics)
if diagnostics.HasError() {
return nil
}
projectSecurityRoles := securityRolesApiToModel(ctx, member, diagnostics)
if diagnostics.HasError() {
return nil
}
return &OrganizationMember{
Email: types.StringValue(member.Email),
InvitationPending: types.BoolValue(invitationPending),
UserID: types.StringValue(nilToEmpty(member.UserID)),
OrganizationRole: organizationRole,
DeploymentRoles: *deploymentRoles,
ProjectElasticsearchRoles: *projectElasticsearchRoles,
ProjectObservabilityRoles: *projectObservabilityRoles,
ProjectSecurityRoles: *projectSecurityRoles,
}
}
func nilToEmpty(id *string) string {
if id == nil {
return ""
}
return *id
}
func organizationRoleApiToModel(member models.OrganizationMembership) types.String {
if member.RoleAssignments != nil &&
len(member.RoleAssignments.Organization) > 0 &&
member.RoleAssignments.Organization[0] != nil &&
member.RoleAssignments.Organization[0].RoleID != nil {
id := member.RoleAssignments.Organization[0].RoleID
return types.StringValue(*id)
} else {
return types.StringNull()
}
}
func deploymentRolesApiToModel(ctx context.Context, member models.OrganizationMembership, diagnostics *diag.Diagnostics) *types.Set {
var result []DeploymentRoleAssignment
if member.RoleAssignments != nil {
for _, roleAssignment := range member.RoleAssignments.Deployment {
if roleAssignment.RoleID == nil {
diagnostics.Append(diag.NewErrorDiagnostic("API Error", "API returned role assignment without role"))
return nil
}
deploymentIds, diags := types.SetValueFrom(ctx, types.StringType, roleAssignment.DeploymentIds)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
applicationRoles, diags := types.SetValueFrom(ctx, types.StringType, roleAssignment.ApplicationRoles)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
result = append(result, DeploymentRoleAssignment{
Role: types.StringValue(roleApiToModel(*roleAssignment.RoleID, deployment)),
ForAllDeployments: forAllApiToModel(roleAssignment.All),
DeploymentIDs: deploymentIds,
ApplicationRoles: applicationRoles,
})
}
}
roleAssignments, diags := types.SetValueFrom(ctx, deploymentRoleAssignmentsSchema().NestedObject.GetAttributes().Type(), result)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
return &roleAssignments
}
func elasticsearchRolesApiToModel(ctx context.Context, member models.OrganizationMembership, diagnostics *diag.Diagnostics) *types.Set {
rolesSchema := projectElasticsearchRolesSchema()
if member.RoleAssignments != nil && member.RoleAssignments.Project != nil && member.RoleAssignments.Project.Elasticsearch != nil {
return rolesApiToModel(ctx, member.RoleAssignments.Project.Elasticsearch, rolesSchema, "elasticsearch", diagnostics)
} else {
return emptySet()
}
}
func observabilityRolesApiToModel(ctx context.Context, member models.OrganizationMembership, diagnostics *diag.Diagnostics) *types.Set {
rolesSchema := projectObservabilityRolesSchema()
if member.RoleAssignments != nil && member.RoleAssignments.Project != nil && member.RoleAssignments.Project.Observability != nil {
return rolesApiToModel(ctx, member.RoleAssignments.Project.Observability, rolesSchema, "observability", diagnostics)
} else {
return emptySet()
}
}
func securityRolesApiToModel(ctx context.Context, member models.OrganizationMembership, diagnostics *diag.Diagnostics) *types.Set {
rolesSchema := projectSecurityRolesSchema()
if member.RoleAssignments != nil && member.RoleAssignments.Project != nil && member.RoleAssignments.Project.Security != nil {
return rolesApiToModel(ctx, member.RoleAssignments.Project.Security, rolesSchema, "security", diagnostics)
} else {
return emptySet()
}
}
func emptySet() *types.Set {
value := types.SetValueMust(projectRoleAssignmentSchema([]string{}).Type(), []attr.Value{})
return &value
}
func rolesApiToModel(
ctx context.Context,
apiRoleAssignments []*models.ProjectRoleAssignment,
schema schema.SetNestedAttribute,
roleType RoleType,
diagnostics *diag.Diagnostics,
) *types.Set {
var result []ProjectRoleAssignment
for _, roleAssignment := range apiRoleAssignments {
if roleAssignment.RoleID == nil {
diagnostics.Append(diag.NewErrorDiagnostic("API Error", "API returned role assignment without role"))
return nil
}
projectIds, diags := types.SetValueFrom(ctx, types.StringType, roleAssignment.ProjectIds)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
applicationRoles, diags := types.SetValueFrom(ctx, types.StringType, roleAssignment.ApplicationRoles)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
result = append(result, ProjectRoleAssignment{
Role: types.StringValue(roleApiToModel(*roleAssignment.RoleID, roleType)),
ForAllProjects: forAllApiToModel(roleAssignment.All),
ProjectIDs: projectIds,
ApplicationRoles: applicationRoles,
})
}
roleAssignments, diags := types.SetValueFrom(ctx, schema.NestedObject.GetAttributes().Type(), result)
if diags.HasError() {
diagnostics.Append(diags...)
return nil
}
return &roleAssignments
}
func forAllApiToModel(apiAll *bool) types.Bool {
if apiAll == nil {
return types.BoolValue(false)
}
return types.BoolValue(*apiAll)
}