Skip to content

Commit

Permalink
Merge pull request #903 from asedge/resource_aws_organization
Browse files Browse the repository at this point in the history
New Resource: aws_organizations_organization
  • Loading branch information
bflad authored Feb 25, 2018
2 parents cc1b1d9 + 754238e commit 385a2a3
Show file tree
Hide file tree
Showing 8 changed files with 335 additions and 0 deletions.
3 changes: 3 additions & 0 deletions aws/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import (
"github.com/aws/aws-sdk-go/service/mediastore"
"github.com/aws/aws-sdk-go/service/mq"
"github.com/aws/aws-sdk-go/service/opsworks"
"github.com/aws/aws-sdk-go/service/organizations"
"github.com/aws/aws-sdk-go/service/rds"
"github.com/aws/aws-sdk-go/service/redshift"
"github.com/aws/aws-sdk-go/service/route53"
Expand Down Expand Up @@ -194,6 +195,7 @@ type AWSClient struct {
lightsailconn *lightsail.Lightsail
mqconn *mq.MQ
opsworksconn *opsworks.OpsWorks
organizationsconn *organizations.Organizations
glacierconn *glacier.Glacier
guarddutyconn *guardduty.GuardDuty
codebuildconn *codebuild.CodeBuild
Expand Down Expand Up @@ -444,6 +446,7 @@ func (c *Config) Client() (interface{}, error) {
client.lightsailconn = lightsail.New(sess)
client.mqconn = mq.New(sess)
client.opsworksconn = opsworks.New(sess)
client.organizationsconn = organizations.New(sess)
client.r53conn = route53.New(r53Sess)
client.rdsconn = rds.New(awsRdsSess)
client.redshiftconn = redshift.New(sess)
Expand Down
28 changes: 28 additions & 0 deletions aws/import_aws_organizations_organization_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package aws

import (
"testing"

"github.com/hashicorp/terraform/helper/resource"
)

func testAccAwsOrganizationsOrganization_importBasic(t *testing.T) {
resourceName := "aws_organizations_organization.test"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAwsOrganizationsOrganizationDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsOrganizationsOrganizationConfig,
},

{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
1 change: 1 addition & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ func Provider() terraform.ResourceProvider {
"aws_opsworks_user_profile": resourceAwsOpsworksUserProfile(),
"aws_opsworks_permission": resourceAwsOpsworksPermission(),
"aws_opsworks_rds_db_instance": resourceAwsOpsworksRdsDbInstance(),
"aws_organizations_organization": resourceAwsOrganizationsOrganization(),
"aws_placement_group": resourceAwsPlacementGroup(),
"aws_proxy_protocol_policy": resourceAwsProxyProtocolPolicy(),
"aws_rds_cluster": resourceAwsRDSCluster(),
Expand Down
102 changes: 102 additions & 0 deletions aws/resource_aws_organizations_organization.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package aws

import (
"fmt"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/organizations"
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"
)

func resourceAwsOrganizationsOrganization() *schema.Resource {
return &schema.Resource{
Create: resourceAwsOrganizationsOrganizationCreate,
Read: resourceAwsOrganizationsOrganizationRead,
Delete: resourceAwsOrganizationsOrganizationDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"arn": {
Type: schema.TypeString,
Computed: true,
},
"master_account_arn": {
Type: schema.TypeString,
Computed: true,
},
"master_account_email": {
Type: schema.TypeString,
Computed: true,
},
"master_account_id": {
Type: schema.TypeString,
Computed: true,
},
"feature_set": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Default: organizations.OrganizationFeatureSetAll,
ValidateFunc: validation.StringInSlice([]string{organizations.OrganizationFeatureSetAll, organizations.OrganizationFeatureSetConsolidatedBilling}, true),
},
},
}
}

func resourceAwsOrganizationsOrganizationCreate(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).organizationsconn

createOpts := &organizations.CreateOrganizationInput{
FeatureSet: aws.String(d.Get("feature_set").(string)),
}
log.Printf("[DEBUG] Creating Organization: %#v", createOpts)

resp, err := conn.CreateOrganization(createOpts)
if err != nil {
return fmt.Errorf("Error creating organization: %s", err)
}

org := resp.Organization
d.SetId(*org.Id)

return resourceAwsOrganizationsOrganizationRead(d, meta)
}

func resourceAwsOrganizationsOrganizationRead(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).organizationsconn

log.Printf("[INFO] Reading Organization: %s", d.Id())
org, err := conn.DescribeOrganization(&organizations.DescribeOrganizationInput{})
if err != nil {
if isAWSErr(err, organizations.ErrCodeAWSOrganizationsNotInUseException, "") {
log.Printf("[WARN] Organization does not exist, removing from state: %s", d.Id())
d.SetId("")
return nil
}
return err
}

d.Set("arn", org.Organization.Arn)
d.Set("feature_set", org.Organization.FeatureSet)
d.Set("master_account_arn", org.Organization.MasterAccountArn)
d.Set("master_account_email", org.Organization.MasterAccountEmail)
d.Set("master_account_id", org.Organization.MasterAccountId)
return nil
}

func resourceAwsOrganizationsOrganizationDelete(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).organizationsconn

log.Printf("[INFO] Deleting Organization: %s", d.Id())

_, err := conn.DeleteOrganization(&organizations.DeleteOrganizationInput{})
if err != nil {
return fmt.Errorf("Error deleting Organization: %s", err)
}

return nil
}
121 changes: 121 additions & 0 deletions aws/resource_aws_organizations_organization_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package aws

import (
"fmt"
"testing"

"github.com/aws/aws-sdk-go/service/organizations"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)

func testAccAwsOrganizationsOrganization_basic(t *testing.T) {
var organization organizations.Organization

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAwsOrganizationsOrganizationDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsOrganizationsOrganizationConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsOrganizationsOrganizationExists("aws_organizations_organization.test", &organization),
resource.TestCheckResourceAttr("aws_organizations_organization.test", "feature_set", organizations.OrganizationFeatureSetAll),
resource.TestCheckResourceAttrSet("aws_organizations_organization.test", "arn"),
resource.TestCheckResourceAttrSet("aws_organizations_organization.test", "master_account_arn"),
resource.TestCheckResourceAttrSet("aws_organizations_organization.test", "master_account_email"),
resource.TestCheckResourceAttrSet("aws_organizations_organization.test", "feature_set"),
),
},
},
})
}

func testAccAwsOrganizationsOrganization_consolidatedBilling(t *testing.T) {
var organization organizations.Organization

feature_set := organizations.OrganizationFeatureSetConsolidatedBilling

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAwsOrganizationsOrganizationDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsOrganizationsOrganizationConfigConsolidatedBilling(feature_set),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsOrganizationsOrganizationExists("aws_organizations_organization.test", &organization),
resource.TestCheckResourceAttr("aws_organizations_organization.test", "feature_set", feature_set),
),
},
},
})
}

func testAccCheckAwsOrganizationsOrganizationDestroy(s *terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).organizationsconn

for _, rs := range s.RootModule().Resources {
if rs.Type != "aws_organizations_organization" {
continue
}

params := &organizations.DescribeOrganizationInput{}

resp, err := conn.DescribeOrganization(params)

if err != nil {
if isAWSErr(err, organizations.ErrCodeAWSOrganizationsNotInUseException, "") {
return nil
}
return err
}

if resp != nil && resp.Organization != nil {
return fmt.Errorf("Bad: Organization still exists: %q", rs.Primary.ID)
}
}

return nil
}

func testAccCheckAwsOrganizationsOrganizationExists(n string, a *organizations.Organization) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("Organization ID not set")
}

conn := testAccProvider.Meta().(*AWSClient).organizationsconn
params := &organizations.DescribeOrganizationInput{}

resp, err := conn.DescribeOrganization(params)

if err != nil {
return err
}

if resp == nil || resp.Organization == nil {
return fmt.Errorf("Organization %q does not exist", rs.Primary.ID)
}

a = resp.Organization

return nil
}
}

const testAccAwsOrganizationsOrganizationConfig = "resource \"aws_organizations_organization\" \"test\" {}"

func testAccAwsOrganizationsOrganizationConfigConsolidatedBilling(feature_set string) string {
return fmt.Sprintf(`
resource "aws_organizations_organization" "test" {
feature_set = "%s"
}
`, feature_set)
}
27 changes: 27 additions & 0 deletions aws/resource_aws_organizations_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package aws

import (
"testing"
)

func TestAccAWSOrganizations(t *testing.T) {
testCases := map[string]map[string]func(t *testing.T){
"Organization": {
"basic": testAccAwsOrganizationsOrganization_basic,
"importBasic": testAccAwsOrganizationsOrganization_importBasic,
"consolidatedBilling": testAccAwsOrganizationsOrganization_consolidatedBilling,
},
}

for group, m := range testCases {
m := m
t.Run(group, func(t *testing.T) {
for name, tc := range m {
tc := tc
t.Run(name, func(t *testing.T) {
tc(t)
})
}
})
}
}
10 changes: 10 additions & 0 deletions website/aws.erb
Original file line number Diff line number Diff line change
Expand Up @@ -1370,6 +1370,16 @@
</ul>
</li>

<li<%= sidebar_current("docs-aws-resource-organizations") %>>
<a href="#">Organizations Resources</a>
<ul class="nav nav-visible">

<li<%= sidebar_current("docs-aws-resource-organizations-organization") %>>
<a href="/docs/providers/aws/r/organizations_organization.html">aws_organizations_organization</a>
</li>
</ul>
</li>

<li<%= sidebar_current("docs-aws-resource-(db|rds)") %>>
<a href="#">RDS Resources</a>
<ul class="nav nav-visible">
Expand Down
43 changes: 43 additions & 0 deletions website/docs/r/organizations_organization.html.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
layout: "aws"
page_title: "AWS: aws_organizations_organization
sidebar_current: "docs-aws-resource-organizations-organization|"
description: |-
Provides a resource to create an organization.
---

# aws_organizations_organization

Provides a resource to create an organization.

## Example Usage:

```hcl
resource "aws_organizations_organization" "org" {
feature_set = "ALL"
}
```

## Argument Reference

The following arguments are supported:

* `feature_set` - (Optional) Specify "ALL" (default) or "CONSOLIDATED_BILLING".

## Attributes Reference

The following additional attributes are exported:

* `arn` - ARN of the organization
* `id` - Identifier of the organization
* `master_account_arn` - ARN of the master account
* `master_account_email` - Email address of the master account
* `master_account_id` - Identifier of the master account

## Import

The AWS organization can be imported by using the `id`, e.g.

```
$ terraform import aws_organizations_organization.my_org o-1234567
```

0 comments on commit 385a2a3

Please sign in to comment.