Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cluster & namespace resources feat and fix #8

Merged
merged 6 commits into from
May 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
## 1.0.1 (Unreleased)

FEATURES:

ENHANCEMENTS:

* Added `default_project_id` & `system_project_id` attributes to `rancher2_cluster` resource
* Added support to move `rancher2_namespace` resource to a rancher project when import
* Added support to terraform 0.12

BUG FIXES:

* Fix: Updated `flattenNamespace` function on `rancher2_namespace` resource to avoid no empty plan if `resource_quota` is not specified
* Fix: Updated `rke_config` argument for openstack cloud_provider on `rancher2_cluster` resource:
* Removed `used_id` field on global argument in favour of `username` following [k8s openstack cloud provider docs](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/provider-configuration.md#global-required-parameters)
* Set computed=true on optional field to avoid no empty plan if not specified

## 1.0.0 (May 14, 2019)

* Initial Terraform Ecosystem Release
Expand Down
79 changes: 79 additions & 0 deletions rancher2/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,34 @@ func (c *Config) GetProjectRoleTemplateBindingsByProjectID(projectID string) ([]
return data, err
}

func (c *Config) IsProjectDefault(project *managementClient.Project) bool {
if project == nil {
return false
}

for k, v := range project.Labels {
if k == projectDefaultLabel && v == "true" {
return true
}
}

return false
}

func (c *Config) IsProjectSystem(project *managementClient.Project) bool {
if project == nil {
return false
}

for k, v := range project.Labels {
if k == projectSystemLabel && v == "true" {
return true
}
}

return false
}

func (c *Config) GetProjectByName(name, clusterID string) (*managementClient.Project, error) {
if name == "" {
return nil, fmt.Errorf("[ERROR] Project name is nil")
Expand Down Expand Up @@ -277,6 +305,57 @@ func (c *Config) RoleTemplateExist(id string) error {
return nil
}

func (c *Config) GetClusterProjects(id string) ([]managementClient.Project, error) {
if id == "" {
return nil, fmt.Errorf("[ERROR] Cluster id is nil")
}

client, err := c.ManagementClient()
if err != nil {
return nil, err
}

filters := map[string]interface{}{"clusterId": id}
listOpts := NewListOpts(filters)

collection, err := client.Project.List(listOpts)
if err != nil {
return nil, err
}

return collection.Data, nil
}

func (c *Config) GetClusterSpecialProjectsID(id string) (string, string, error) {
if id == "" {
return "", "", fmt.Errorf("[ERROR] Cluster id is nil")
}

projects, err := c.GetClusterProjects(id)
if err != nil {
return "", "", err
}

found := 0
defaultProjectID := ""
systemProjectID := ""
for _, project := range projects {
if c.IsProjectDefault(&project) {
found += 1
defaultProjectID = project.ID
}
if c.IsProjectSystem(&project) {
found += 1
systemProjectID = project.ID
}
if found == 2 {
return defaultProjectID, systemProjectID, nil
}
}

return defaultProjectID, systemProjectID, nil
}

func (c *Config) GetClusterByName(name string) (*managementClient.Cluster, error) {
if name == "" {
return nil, fmt.Errorf("[ERROR] Cluster name is nil")
Expand Down
26 changes: 21 additions & 5 deletions rancher2/import_rancher2_namespace.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,41 @@
package rancher2

import (
"log"

"github.com/hashicorp/terraform/helper/schema"
clusterClient "github.com/rancher/types/client/cluster/v3"
)

func resourceRancher2NamespaceImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
clusterID, resourceID := splitID(d.Id())
projectID, resourceID := splitID(d.Id())

clusterID, projectID := splitProjectID(projectID)

client, err := meta.(*Config).ClusterClient(clusterID)
if err != nil {
return []*schema.ResourceData{}, err
}
err = d.Set("project_id", clusterID)
if err != nil {
return []*schema.ResourceData{}, err
}

ns, err := client.Namespace.ByID(resourceID)
if err != nil {
return []*schema.ResourceData{}, err
}

d.Set("project_id", clusterID)
if projectID != "" {
log.Printf("[INFO] Moving Namespace ID %s to project %s", d.Id(), projectID)
nsMove := &clusterClient.NamespaceMove{
ProjectID: projectID,
}

err = client.Namespace.ActionMove(ns, nsMove)
if err != nil {
return []*schema.ResourceData{}, err
}
d.Set("project_id", projectID)
}

err = flattenNamespace(d, ns)
if err != nil {
return []*schema.ResourceData{}, err
Expand Down
7 changes: 6 additions & 1 deletion rancher2/resource_rancher2_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,12 @@ func resourceRancher2ClusterRead(d *schema.ResourceData, meta interface{}) error
return err
}

err = flattenCluster(d, cluster, clusterRegistrationToken, kubeConfig)
defaultProjectID, systemProjectID, err := meta.(*Config).GetClusterSpecialProjectsID(cluster.ID)
if err != nil {
return err
}

err = flattenCluster(d, cluster, clusterRegistrationToken, kubeConfig, defaultProjectID, systemProjectID)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion rancher2/resource_rancher2_node_driver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ resource "rancher2_node_driver" "foo" {
`
testAccRancher2NodeDriverUpdateConfig = `
resource "rancher2_node_driver" "foo" {
active = false,
active = false
builtin = false
checksum = "0x1"
description= "Foo description - updated"
Expand Down
8 changes: 8 additions & 0 deletions rancher2/schema_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,14 @@ func clusterFields() map[string]*schema.Schema {
Schema: clusterGKEConfigFields(),
},
},
"default_project_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"system_project_id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"description": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand Down
20 changes: 10 additions & 10 deletions rancher2/schema_cluster_rke_config_cloud_provider_openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,6 @@ func clusterRKEConfigCloudProviderOpenstackGlobalFields() map[string]*schema.Sch
Required: true,
Sensitive: true,
},
"tenant_id": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
},
"user_id": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
},
"username": {
Type: schema.TypeString,
Required: true,
Expand All @@ -82,6 +72,12 @@ func clusterRKEConfigCloudProviderOpenstackGlobalFields() map[string]*schema.Sch
Optional: true,
Computed: true,
},
"tenant_id": {
Type: schema.TypeString,
Optional: true,
Sensitive: true,
Computed: true,
},
"tenant_name": {
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -199,6 +195,7 @@ func clusterRKEConfigCloudProviderOpenstackFields() map[string]*schema.Schema {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: clusterRKEConfigCloudProviderOpenstackBlockStorageFields(),
},
Expand All @@ -207,6 +204,7 @@ func clusterRKEConfigCloudProviderOpenstackFields() map[string]*schema.Schema {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: clusterRKEConfigCloudProviderOpenstackLoadBalancerFields(),
},
Expand All @@ -215,6 +213,7 @@ func clusterRKEConfigCloudProviderOpenstackFields() map[string]*schema.Schema {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: clusterRKEConfigCloudProviderOpenstackMetadataFields(),
},
Expand All @@ -223,6 +222,7 @@ func clusterRKEConfigCloudProviderOpenstackFields() map[string]*schema.Schema {
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: clusterRKEConfigCloudProviderOpenstackRouteFields(),
},
Expand Down
5 changes: 5 additions & 0 deletions rancher2/schema_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import (
"github.com/hashicorp/terraform/helper/schema"
)

const (
projectDefaultLabel = "authz.management.cattle.io/default-project"
projectSystemLabel = "authz.management.cattle.io/system-project"
)

//Schemas

func projectResourceQuotaLimitFields() map[string]*schema.Schema {
Expand Down
4 changes: 3 additions & 1 deletion rancher2/structure_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func flattenClusterRegistationToken(in *managementClient.ClusterRegistrationToke
return []interface{}{obj}, nil
}

func flattenCluster(d *schema.ResourceData, in *Cluster, clusterRegToken *managementClient.ClusterRegistrationToken, kubeConfig *managementClient.GenerateKubeConfigOutput) error {
func flattenCluster(d *schema.ResourceData, in *Cluster, clusterRegToken *managementClient.ClusterRegistrationToken, kubeConfig *managementClient.GenerateKubeConfigOutput, defaultProjectID, systemProjectID string) error {
if in == nil {
return fmt.Errorf("[ERROR] flattening cluster: Input cluster is nil")
}
Expand Down Expand Up @@ -67,6 +67,8 @@ func flattenCluster(d *schema.ResourceData, in *Cluster, clusterRegToken *manage
}

d.Set("kube_config", kubeConfig.Config)
d.Set("default_project_id", defaultProjectID)
d.Set("system_project_id", systemProjectID)
d.Set("driver", in.Driver)

switch in.Driver {
Expand Down
24 changes: 8 additions & 16 deletions rancher2/structure_cluster_rke_config_cloud_provider_openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,6 @@ func flattenClusterRKEConfigCloudProviderOpenstackGlobal(in *managementClient.Gl
obj["password"] = in.Password
}

if len(in.TenantID) > 0 {
obj["tenant_id"] = in.TenantID
}

if len(in.UserID) > 0 {
obj["user_id"] = in.UserID
}

if len(in.Username) > 0 {
obj["username"] = in.Username
}
Expand All @@ -70,6 +62,10 @@ func flattenClusterRKEConfigCloudProviderOpenstackGlobal(in *managementClient.Gl
obj["region"] = in.Region
}

if len(in.TenantID) > 0 {
obj["tenant_id"] = in.TenantID
}

if len(in.TenantName) > 0 {
obj["tenant_name"] = in.TenantName
}
Expand Down Expand Up @@ -256,14 +252,6 @@ func expandClusterRKEConfigCloudProviderOpenstackGlobal(p []interface{}) (*manag
obj.Password = v
}

if v, ok := in["tenant_id"].(string); ok && len(v) > 0 {
obj.TenantID = v
}

if v, ok := in["user_id"].(string); ok && len(v) > 0 {
obj.UserID = v
}

if v, ok := in["username"].(string); ok && len(v) > 0 {
obj.Username = v
}
Expand All @@ -284,6 +272,10 @@ func expandClusterRKEConfigCloudProviderOpenstackGlobal(p []interface{}) (*manag
obj.Region = v
}

if v, ok := in["tenant_id"].(string); ok && len(v) > 0 {
obj.TenantID = v
}

if v, ok := in["tenant_name"].(string); ok && len(v) > 0 {
obj.TenantName = v
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ func init() {
AuthURL: "auth.terraform.test",
Password: "XXXXXXXX",
TenantID: "YYYYYYYY",
UserID: "ZZZZZZZZ",
Username: "user",
CAFile: "ca_file",
DomainID: "domain_id",
Expand All @@ -53,7 +52,6 @@ func init() {
"auth_url": "auth.terraform.test",
"password": "XXXXXXXX",
"tenant_id": "YYYYYYYY",
"user_id": "ZZZZZZZZ",
"username": "user",
"ca_file": "ca_file",
"domain_id": "domain_id",
Expand Down
Loading