Skip to content

Commit

Permalink
Add support for resource pipeline_group
Browse files Browse the repository at this point in the history
  • Loading branch information
nikhilsbhat committed Sep 22, 2023
1 parent ac1b5d8 commit 9a3c62d
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 14 deletions.
4 changes: 2 additions & 2 deletions examples/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,5 @@ output "sample_ldap_role" {
}

output "pipeline_group_movies" {
value = data.gocd_pipeline_group.movies.authorization
}
value = data.gocd_pipeline_group.sample_group.authorization
}
3 changes: 0 additions & 3 deletions examples/pipeline_config.tf

This file was deleted.

22 changes: 22 additions & 0 deletions examples/pipeline_group.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
resource "gocd_pipeline_group" "sample_group_2" {
name = "sample-group-2"
pipelines = ["helm-images", "helm-drift"]
authorization {
view {
users = ["nikhil"]
roles = ["sample"]
}
operate {
users = ["nikhil"]
roles = ["sample"]
}
admins {
users = ["nikhil"]
roles = ["sample"]
}
}
}

data "gocd_pipeline_group" "sample_group" {
group_id = "sample-group"
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.26.1
github.com/mitchellh/mapstructure v1.5.0
github.com/nikhilsbhat/gocd-cli v0.1.0
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230921144150-684a876cba84
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230922033426-b10dfcdb3dbd
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cast v1.5.0
gopkg.in/yaml.v3 v3.0.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nikhilsbhat/gocd-cli v0.1.0 h1:k7myHhSy6tuPZm0dO3RBVjAqBZFQh4XalQZvxpd2VfM=
github.com/nikhilsbhat/gocd-cli v0.1.0/go.mod h1:gfczP6M7WOOXIEc9QdAJ7R846+3CfQsdSEXC44fg3Ng=
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230921144150-684a876cba84 h1:kfm8XmQEUugc2rFZ4/TCKxLXHYE240L9dRqD7Vxb+1c=
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230921144150-684a876cba84/go.mod h1:ubwvA7YgcWDUXiCghrJGRKTdeVuXpDmNzIp6ZvVzdfk=
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230922033426-b10dfcdb3dbd h1:7GTqH/4aJkJ3HfbsrgsyXf95WUoFNCb3HR6N/6e1Qb8=
github.com/nikhilsbhat/gocd-sdk-go v0.1.9-0.20230922033426-b10dfcdb3dbd/go.mod h1:ubwvA7YgcWDUXiCghrJGRKTdeVuXpDmNzIp6ZvVzdfk=
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand Down
1 change: 1 addition & 0 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func Provider() *schema.Provider {
"gocd_pipeline": resourcePipeline(),
"gocd_artifact_store": resourceArtifactStore(),
"gocd_role": resourceRole(),
"gocd_pipeline_group": resourcePipelineGroup(),
},

DataSourcesMap: map[string]*schema.Resource{
Expand Down
7 changes: 1 addition & 6 deletions internal/provider/resource_config_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,8 @@ func resourceConfigRepoCreate(ctx context.Context, d *schema.ResourceData, meta
if err != nil {
return diag.Errorf("reading rules errored with %v", err)
}

material := getMaterials(d.Get(utils.TerraformResourceMaterial))
if err != nil {
return diag.Errorf("reading material errored with %v", err)
}

cfg := gocd.ConfigRepo{
ID: utils.String(d.Get(utils.TerraformResourceProfileID)),
Expand Down Expand Up @@ -134,9 +132,6 @@ func resourceConfigRepoUpdate(ctx context.Context, d *schema.ResourceData, meta
}

material := getMaterials(d.Get(utils.TerraformResourceMaterial))
if err != nil {
return diag.Errorf("reading material errored with %v", err)
}

cfg := gocd.ConfigRepo{
ID: utils.String(d.Get(utils.TerraformResourceProfileID)),
Expand Down
166 changes: 166 additions & 0 deletions internal/provider/resource_pipeline_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
package provider

import (
"context"
"encoding/json"
"log"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/nikhilsbhat/gocd-sdk-go"
"github.com/nikhilsbhat/terraform-provider-gocd/pkg/utils"
)

func resourcePipelineGroup() *schema.Resource {
return &schema.Resource{
CreateContext: resourcePipelineGroupCreate,
ReadContext: resourcePipelineGroupRead,
UpdateContext: resourcePipelineGroupUpdate,
DeleteContext: resourcePipelineGroupDelete,
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
Computed: false,
ForceNew: true,
Description: "Name of the pipeline group to be created or updated.",
},
"pipelines": {
Type: schema.TypeList,
Optional: true,
ForceNew: false,
Description: "List of pipelines to be associated with pipeline group.",
Elem: &schema.Schema{Type: schema.TypeString},
},
"authorization": {
Type: schema.TypeSet,
Optional: true,
ForceNew: false,
Description: "The authorization configuration for the pipeline group.",
Elem: authConfigSchema(),
},
"etag": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: "Etag used to track the pipeline group.",
},
},
}
}

func resourcePipelineGroupCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
defaultConfig := meta.(gocd.GoCd)

if !d.IsNewResource() {
return nil
}

id := d.Id()

if len(id) == 0 {
resourceID := utils.String(d.Get(utils.TerraformResourceName))
id = resourceID
}

cfg := gocd.PipelineGroup{
Name: id,
Authorization: getPipelineGroupAuthorizationConfig(d.Get(utils.TerraformResourceAuthorization)),
}

out, err := json.MarshalIndent(cfg, " ", " ")
if err != nil {
log.Fatal(err)
}

log.Printf("PipelineGroup: %s", string(out))

if err := defaultConfig.CreatePipelineGroup(cfg); err != nil {
return diag.Errorf("creating pipeline group '%s' errored with %v", cfg.Name, err)
}

d.SetId(id)

return resourcePipelineGroupRead(ctx, d, meta)
}

func resourcePipelineGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
defaultConfig := meta.(gocd.GoCd)

name := utils.String(d.Get(utils.TerraformResourceName))
response, err := defaultConfig.GetPipelineGroup(name)
if err != nil {
return diag.Errorf("getting pipeline group '%s' errored with: %v", name, err)
}

if err = d.Set(utils.TerraformResourceEtag, response.ETAG); err != nil {
return diag.Errorf(settingAttrErrorTmp, utils.TerraformResourceEtag, err)
}

return nil
}

func resourcePipelineGroupUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
defaultConfig := meta.(gocd.GoCd)

if !d.HasChange(utils.TerraformResourceAuthorization) && !d.HasChange(utils.TerraformResourcePipelines) {
log.Printf("nothing to update so skipping")

return nil
}

cfg := gocd.PipelineGroup{
Name: utils.String(d.Get(utils.TerraformResourceName)),
Pipelines: getPipelines(d.Get(utils.TerraformResourcePipelines)),
Authorization: getPipelineGroupAuthorizationConfig(d.Get(utils.TerraformResourceAuthorization)),
ETAG: utils.String(d.Get(utils.TerraformResourceEtag)),
}

if _, err := defaultConfig.UpdatePipelineGroup(cfg); err != nil {
return diag.Errorf("updating pipeline group '%s' errored with: %v", cfg.Name, err)
}

return resourcePipelineGroupRead(ctx, d, meta)
}

func resourcePipelineGroupDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
defaultConfig := meta.(gocd.GoCd)

if id := d.Id(); len(id) == 0 {
return diag.Errorf("resource with the ID '%s' not found", id)
}

profileID := utils.String(d.Get(utils.TerraformResourceName))

err := defaultConfig.DeletePipelineGroup(profileID)
if err != nil {
return diag.Errorf("deleting pipeline group errored with: %v", err)
}

d.SetId("")

return nil
}

func getPipelineGroupAuthorizationConfig(authConfig interface{}) gocd.PipelineGroupAuthorizationConfig {
var authoRisationConfig gocd.PipelineGroupAuthorizationConfig
flattenedAuthConfig := authConfig.(*schema.Set).List()[0].(map[string]interface{})
flattenedView := flattenedAuthConfig[utils.TerraformResourceView].(*schema.Set).List()[0].(map[string]interface{})
flattenedOperate := flattenedAuthConfig[utils.TerraformResourceOperate].(*schema.Set).List()[0].(map[string]interface{})
flattenedAdmins := flattenedAuthConfig[utils.TerraformResourceAdmins].(*schema.Set).List()[0].(map[string]interface{})

authoRisationConfig.Admins = gocd.AuthorizationConfig{
Roles: utils.GetSlice(flattenedAdmins[utils.TerraformResourceRoles].([]interface{})),
Users: utils.GetSlice(flattenedAdmins[utils.TerraformResourceUsers].([]interface{})),
}
authoRisationConfig.View = gocd.AuthorizationConfig{
Roles: utils.GetSlice(flattenedView[utils.TerraformResourceRoles].([]interface{})),
Users: utils.GetSlice(flattenedView[utils.TerraformResourceUsers].([]interface{})),
}
authoRisationConfig.Operate = gocd.AuthorizationConfig{
Roles: utils.GetSlice(flattenedOperate[utils.TerraformResourceRoles].([]interface{})),
Users: utils.GetSlice(flattenedOperate[utils.TerraformResourceUsers].([]interface{})),
}

return authoRisationConfig
}
3 changes: 3 additions & 0 deletions pkg/utils/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,5 +79,8 @@ const (
TerraformResourceAuthorization = "authorization"
TerraformResourcePolicy = "policy"
TerraformResourceUsers = "users"
TerraformResourceRoles = "roles"
TerraformResourceAuthConfigID = "auth_config_id"
TerraformResourceOperate = "operate"
TerraformResourceAdmins = "admins"
)

0 comments on commit 9a3c62d

Please sign in to comment.