Skip to content

Commit

Permalink
Add updated_at computed property
Browse files Browse the repository at this point in the history
  • Loading branch information
nywilken committed Jan 26, 2023
1 parent e8c68a8 commit 6e2120e
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 16 deletions.
1 change: 1 addition & 0 deletions docs/resources/packer_channel.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ resource "hcp_packer_channel" "staging" {
- `iteration` (List of Object) The iteration assigned to the channel. (see [below for nested schema](#nestedatt--iteration))
- `organization_id` (String) The ID of the organization this HCP Packer registry is located in.
- `project_id` (String) The ID of the project this HCP Packer registry is located in.
- `updated_at` (String) The author of the channel.

<a id="nestedblock--iteration_assignment"></a>
### Nested Schema for `iteration_assignment`
Expand Down
14 changes: 13 additions & 1 deletion internal/clients/packer.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,25 @@ type ChannelIterationAssignment struct {
}

// CreateBucketChannel creates a channel on the named bucket.
func CreateBucketChannel(ctx context.Context, client *Client, loc *sharedmodels.HashicorpCloudLocationLocation, bucketSlug, channelSlug string) (*packermodels.HashicorpCloudPackerChannel, error) {
func CreateBucketChannel(ctx context.Context, client *Client, loc *sharedmodels.HashicorpCloudLocationLocation, bucketSlug string, channelSlug string,
assignment *ChannelIterationAssignment) (*packermodels.HashicorpCloudPackerChannel, error) {
params := packer_service.NewPackerServiceCreateChannelParamsWithContext(ctx)
params.LocationOrganizationID = loc.OrganizationID
params.LocationProjectID = loc.ProjectID
params.BucketSlug = bucketSlug
params.Body.Slug = channelSlug

if assignment != nil {
switch {
case assignment.IterationID != "":
params.Body.IterationID = assignment.IterationID
case assignment.IterationFingerprint != "":
params.Body.Fingerprint = assignment.IterationFingerprint
case assignment.IterationIncrementalVersion > 0:
params.Body.IncrementalVersion = int32(assignment.IterationIncrementalVersion)
}
}

channel, err := client.Packer.PackerServiceCreateChannel(params, nil)
if err != nil {
err := err.(*packer_service.PackerServiceCreateChannelDefault)
Expand Down
Binary file removed internal/clients/terraform-provider-hcp_v0.51.0
Binary file not shown.
32 changes: 21 additions & 11 deletions internal/provider/resource_packer_channel.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ func resourcePackerChannel() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Description: "Creation time of this build.",
Type: schema.TypeString,
Computed: true,
},
"iteration": {
Description: "The iteration assigned to the channel.",
Type: schema.TypeList,
Expand Down Expand Up @@ -118,8 +123,8 @@ func resourcePackerChannel() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Description: "Creation time of this build.",
"updated_at": {
Description: "The author of the channel.",
Type: schema.TypeString,
Computed: true,
},
Expand All @@ -137,7 +142,6 @@ func resourcePackerChannelRead(ctx context.Context, d *schema.ResourceData, meta
}
if err := setLocationData(d, loc); err != nil {
return diag.FromErr(err)

}
// TODO (nywilken) may need to look into pagination depending on channel list sizes
resp, err := clients.ListBucketChannels(ctx, client, loc, bucketName)
Expand Down Expand Up @@ -172,7 +176,14 @@ func resourcePackerChannelCreate(ctx context.Context, d *schema.ResourceData, me
return diag.FromErr(err)
}

channel, err := clients.CreateBucketChannel(ctx, client, loc, bucketName, channelName)
var assignment *clients.ChannelIterationAssignment
assignmentConfig, ok := d.GetOk("iteration_assignment")
if ok {
if config, ok := assignmentConfig.([]interface{})[0].(map[string]interface{}); ok {
assignment = expandIterationAssignmentConfig(config)
}
}
channel, err := clients.CreateBucketChannel(ctx, client, loc, bucketName, channelName, assignment)
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -181,11 +192,6 @@ func resourcePackerChannelCreate(ctx context.Context, d *schema.ResourceData, me
return diag.Errorf("Unable to create channel in bucket %s named %s.", bucketName, channelName)
}

_, ok := d.GetOk("iteration_assignment")
if !ok {
return setPackerChannelResourceData(d, channel)
}

return resourcePackerChannelUpdate(ctx, d, meta)
}

Expand Down Expand Up @@ -315,18 +321,22 @@ func setPackerChannelResourceData(d *schema.ResourceData, channel *packermodels.
}

d.SetId(channel.ID)
if err := d.Set("created_at", channel.CreatedAt.String()); err != nil {
if err := d.Set("author_id", channel.AuthorID); err != nil {
return diag.FromErr(err)
}

if err := d.Set("author_id", channel.AuthorID); err != nil {
if err := d.Set("created_at", channel.CreatedAt.String()); err != nil {
return diag.FromErr(err)
}

if err := d.Set("iteration", flattenIterationConfig(channel.Iteration)); err != nil {
return diag.FromErr(err)
}

if err := d.Set("updated_at", channel.UpdatedAt.String()); err != nil {
return diag.FromErr(err)
}

return nil
}

Expand Down
92 changes: 88 additions & 4 deletions internal/provider/resource_packer_channel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestAccPackerChannel(t *testing.T) {
Steps: []resource.TestStep{
{
PreConfig: func() { upsertBucket(t, acctestAlpineBucket) },
Config: testConfig(TestAccPackerChannelBasic(acctestAlpineBucket, acctestProductionChannel)),
Config: testConfig(testAccPackerChannelBasic(acctestAlpineBucket, acctestProductionChannel)),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "author_id"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
Expand All @@ -31,6 +31,7 @@ func TestAccPackerChannel(t *testing.T) {
resource.TestCheckResourceAttr(resourceName, "name", acctestProductionChannel),
resource.TestCheckResourceAttrSet(resourceName, "organization_id"),
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
resource.TestCheckResourceAttrSet(resourceName, "updated_at"),
),
},
// Testing that we can import bucket channel created in the previous step and that the
Expand Down Expand Up @@ -79,12 +80,15 @@ func TestAccPackerChannel_AssignedIteration(t *testing.T) {
},
Config: testConfig(testAccPackerChannelAssignedLatestIteration(acctestAlpineBucket, acctestChannelName)),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "author_id"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
resource.TestCheckResourceAttrSet(resourceName, "created_at"),
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration_assignment.0.id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration.0.id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration.0.incremental_version"),
resource.TestCheckResourceAttr(resourceName, "iteration.0.fingerprint", "channel-assigned-iteration"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
resource.TestCheckResourceAttr(resourceName, "name", acctestChannelName),
resource.TestCheckResourceAttrSet(resourceName, "updated_at"),
),
},
// Testing that we can import bucket channel created in the previous step and that the
Expand Down Expand Up @@ -153,16 +157,85 @@ func TestAccPackerChannel_UpdateAssignedIteration(t *testing.T) {
},
Config: testConfig(testAccPackerChannelAssignedLatestIteration(acctestAlpineBucket, acctestChannelName)),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "author_id"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
resource.TestCheckResourceAttrSet(resourceName, "created_at"),
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration_assignment.0.id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration.0.id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration.0.incremental_version"),
resource.TestCheckResourceAttr(resourceName, "iteration.0.fingerprint", "channel-update-it2"),
resource.TestCheckResourceAttr(resourceName, "name", acctestChannelName),
resource.TestCheckResourceAttrSet(resourceName, "updated_at"),
),
},
},
})
}

func TestAccPackerChannel_UpdateAssignedIterationWithFingerprint(t *testing.T) {
resourceName := "hcp_packer_channel.production"
acctestChannelName := "update-test"

fingerprint := "channel-update-it1"
upsertBucket(t, acctestAlpineBucket)
upsertIteration(t, acctestAlpineBucket, fingerprint)
itID, err := getIterationIDFromFingerPrint(t, acctestAlpineBucket, fingerprint)
if err != nil {
t.Fatal(err.Error())
}

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t, map[string]bool{"aws": false, "azure": false}) },
ProviderFactories: providerFactories,
CheckDestroy: func(*terraform.State) error {
deleteBucket(t, acctestAlpineBucket, false)
return nil
},
Steps: []resource.TestStep{
{
PreConfig: func() {
upsertBuild(t, acctestAlpineBucket, fingerprint, itID)
},
Config: testConfig(testAccPackerChannelAssignedLatestIteration(acctestAlpineBucket, acctestChannelName)),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "author_id"),
resource.TestCheckResourceAttrSet(resourceName, "created_at"),
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
resource.TestCheckResourceAttr(resourceName, "name", acctestChannelName),
resource.TestCheckResourceAttrSet(resourceName, "iteration_assignment.0.id"),
),
},
{
PreConfig: func() {
fingerprint := "channel-update-it2"
upsertIteration(t, acctestAlpineBucket, fingerprint)
itID, err := getIterationIDFromFingerPrint(t, acctestAlpineBucket, fingerprint)
if err != nil {
t.Fatal(err.Error())
}
upsertBuild(t, acctestAlpineBucket, fingerprint, itID)
},
Config: testConfig(testAccPackerChannelIterationFingerprint(acctestAlpineBucket, acctestChannelName, fingerprint)),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(resourceName, "author_id"),
resource.TestCheckResourceAttr(resourceName, "bucket_name", acctestAlpineBucket),
resource.TestCheckResourceAttrSet(resourceName, "created_at"),
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttrSet(resourceName, "iteration_assignment.0.fingerprint"),
resource.TestCheckResourceAttr(resourceName, "iteration.0.id", itID),
resource.TestCheckResourceAttrSet(resourceName, "iteration.0.incremental_version"),
resource.TestCheckResourceAttr(resourceName, "iteration.0.fingerprint", fingerprint),
resource.TestCheckResourceAttr(resourceName, "name", acctestChannelName),
resource.TestCheckResourceAttrSet(resourceName, "updated_at"),
),
},
},
})
}

var TestAccPackerChannelBasic = func(bucketName, channelName string) string {
var testAccPackerChannelBasic = func(bucketName, channelName string) string {
return fmt.Sprintf(`
resource "hcp_packer_channel" "production" {
bucket_name = %q
Expand All @@ -184,3 +257,14 @@ var testAccPackerChannelAssignedLatestIteration = func(bucketName, channelName s
}
}`, channelName, bucketName)
}

var testAccPackerChannelIterationFingerprint = func(bucketName, channelName, fingerprint string) string {
return fmt.Sprintf(`
resource "hcp_packer_channel" "production" {
bucket_name = %q
name = %q
iteration_assignment {
fingerprint = %q
}
}`, bucketName, channelName, fingerprint)
}

0 comments on commit 6e2120e

Please sign in to comment.