From eb256593bc07c46a19c5441e144098c430c70750 Mon Sep 17 00:00:00 2001 From: "Derek Lemon -T (delemon - AEROTEK INC at Cisco)" Date: Fri, 18 Jan 2019 10:17:14 -0700 Subject: [PATCH] Setting project ID as well in cloudconfig. Using loadbalancerID in cloudconfig. Retrieving instance IP from openstack in protokube. --- nodeup/pkg/model/cloudconfig.go | 23 +++++++++++++++---- pkg/apis/kops/componentconfig.go | 11 +++++---- pkg/apis/kops/v1alpha1/componentconfig.go | 11 +++++---- .../kops/v1alpha1/zz_generated.conversion.go | 2 ++ .../kops/v1alpha1/zz_generated.deepcopy.go | 5 ++++ pkg/apis/kops/v1alpha2/componentconfig.go | 11 +++++---- .../kops/v1alpha2/zz_generated.conversion.go | 2 ++ .../kops/v1alpha2/zz_generated.deepcopy.go | 5 ++++ pkg/apis/kops/zz_generated.deepcopy.go | 5 ++++ protokube/pkg/protokube/openstack_volume.go | 18 +++++++++++---- upup/pkg/fi/cloudup/openstack/cloud.go | 11 +++++++++ 11 files changed, 80 insertions(+), 24 deletions(-) diff --git a/nodeup/pkg/model/cloudconfig.go b/nodeup/pkg/model/cloudconfig.go index b7e177493f..5336c52bf5 100644 --- a/nodeup/pkg/model/cloudconfig.go +++ b/nodeup/pkg/model/cloudconfig.go @@ -109,14 +109,22 @@ func (b *CloudConfigBuilder) Build(c *fi.ModelBuilderContext) error { if osc == nil { break } - + //Support mapping of older keystone API + tenantName := os.Getenv("OS_TENANT_NAME") + if tenantName == "" { + tenantName = os.Getenv("OS_PROJECT_NAME") + } + tenantID := os.Getenv("OS_TENANT_ID") + if tenantID == "" { + tenantID = os.Getenv("OS_PROJECT_ID") + } lines = append(lines, fmt.Sprintf("auth-url=\"%s\"", os.Getenv("OS_AUTH_URL")), fmt.Sprintf("username=\"%s\"", os.Getenv("OS_USERNAME")), fmt.Sprintf("password=\"%s\"", os.Getenv("OS_PASSWORD")), fmt.Sprintf("region=\"%s\"", os.Getenv("OS_REGION_NAME")), - fmt.Sprintf("tenant-id=\"%s\"", os.Getenv("OS_TENANT_ID")), - fmt.Sprintf("tenant-name=\"%s\"", os.Getenv("OS_TENANT_NAME")), + fmt.Sprintf("tenant-id=\"%s\"", tenantID), + fmt.Sprintf("tenant-name=\"%s\"", tenantName), fmt.Sprintf("domain-name=\"%s\"", os.Getenv("OS_DOMAIN_NAME")), fmt.Sprintf("domain-id=\"%s\"", os.Getenv("OS_DOMAIN_ID")), "", @@ -125,13 +133,20 @@ func (b *CloudConfigBuilder) Build(c *fi.ModelBuilderContext) error { if lb := osc.Loadbalancer; lb != nil { lines = append(lines, "[LoadBalancer]", - fmt.Sprintf("floating-network-id=%s", fi.StringValue(lb.FloatingNetwork)), + fmt.Sprintf("floating-network-id=%s", fi.StringValue(lb.FloatingNetworkID)), fmt.Sprintf("lb-method=%s", fi.StringValue(lb.Method)), fmt.Sprintf("lb-provider=%s", fi.StringValue(lb.Provider)), fmt.Sprintf("use-octavia=%t", fi.BoolValue(lb.UseOctavia)), "", ) } + //Block Storage Config + lines = append(lines, + "[BlockStorage]", + "bs-version=v2", //v2 assumed in OpenstackCloud + "ignore-volume-az=true", + "") + if monitor := osc.Monitor; monitor != nil { lines = append(lines, "create-monitor=yes", diff --git a/pkg/apis/kops/componentconfig.go b/pkg/apis/kops/componentconfig.go index 5b9f173139..43a5cacbd9 100644 --- a/pkg/apis/kops/componentconfig.go +++ b/pkg/apis/kops/componentconfig.go @@ -495,11 +495,12 @@ type LeaderElectionConfiguration struct { // OpenstackLoadbalancerConfig defines the config for a neutron loadbalancer type OpenstackLoadbalancerConfig struct { - Method *string `json:"method,omitempty"` - Provider *string `json:"provider,omitempty"` - UseOctavia *bool `json:"useOctavia,omitempty"` - FloatingNetwork *string `json:"floatingNetwork,omitempty"` - SubnetID *string `json:"subnetID,omitempty"` + Method *string `json:"method,omitempty"` + Provider *string `json:"provider,omitempty"` + UseOctavia *bool `json:"useOctavia,omitempty"` + FloatingNetwork *string `json:"floatingNetwork,omitempty"` + FloatingNetworkID *string `json:"floatingNetworkID,omitempty"` + SubnetID *string `json:"subnetID,omitempty"` } // OpenstackMonitor defines the config for a health monitor diff --git a/pkg/apis/kops/v1alpha1/componentconfig.go b/pkg/apis/kops/v1alpha1/componentconfig.go index 8c94ab9b4b..bbcaf4199b 100644 --- a/pkg/apis/kops/v1alpha1/componentconfig.go +++ b/pkg/apis/kops/v1alpha1/componentconfig.go @@ -495,11 +495,12 @@ type LeaderElectionConfiguration struct { // OpenstackLoadbalancerConfig defines the config for a neutron loadbalancer type OpenstackLoadbalancerConfig struct { - Method *string `json:"method,omitempty"` - Provider *string `json:"provider,omitempty"` - UseOctavia *bool `json:"useOctavia,omitempty"` - FloatingNetwork *string `json:"floatingNetwork,omitempty"` - SubnetID *string `json:"subnetID,omitempty"` + Method *string `json:"method,omitempty"` + Provider *string `json:"provider,omitempty"` + UseOctavia *bool `json:"useOctavia,omitempty"` + FloatingNetwork *string `json:"floatingNetwork,omitempty"` + FloatingNetworkID *string `json:"floatingNetworkID,omitempty"` + SubnetID *string `json:"subnetID,omitempty"` } // OpenstackMonitor defines the config for a health monitor diff --git a/pkg/apis/kops/v1alpha1/zz_generated.conversion.go b/pkg/apis/kops/v1alpha1/zz_generated.conversion.go index f44961bac6..c368c78ea3 100644 --- a/pkg/apis/kops/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha1/zz_generated.conversion.go @@ -3859,6 +3859,7 @@ func autoConvert_v1alpha1_OpenstackLoadbalancerConfig_To_kops_OpenstackLoadbalan out.Provider = in.Provider out.UseOctavia = in.UseOctavia out.FloatingNetwork = in.FloatingNetwork + out.FloatingNetworkID = in.FloatingNetworkID out.SubnetID = in.SubnetID return nil } @@ -3873,6 +3874,7 @@ func autoConvert_kops_OpenstackLoadbalancerConfig_To_v1alpha1_OpenstackLoadbalan out.Provider = in.Provider out.UseOctavia = in.UseOctavia out.FloatingNetwork = in.FloatingNetwork + out.FloatingNetworkID = in.FloatingNetworkID out.SubnetID = in.SubnetID return nil } diff --git a/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go index 41cadc189b..a444905da8 100644 --- a/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go @@ -2494,6 +2494,11 @@ func (in *OpenstackLoadbalancerConfig) DeepCopyInto(out *OpenstackLoadbalancerCo *out = new(string) **out = **in } + if in.FloatingNetworkID != nil { + in, out := &in.FloatingNetworkID, &out.FloatingNetworkID + *out = new(string) + **out = **in + } if in.SubnetID != nil { in, out := &in.SubnetID, &out.SubnetID *out = new(string) diff --git a/pkg/apis/kops/v1alpha2/componentconfig.go b/pkg/apis/kops/v1alpha2/componentconfig.go index 254c25cf04..900d50bf01 100644 --- a/pkg/apis/kops/v1alpha2/componentconfig.go +++ b/pkg/apis/kops/v1alpha2/componentconfig.go @@ -495,11 +495,12 @@ type LeaderElectionConfiguration struct { // OpenstackLoadbalancerConfig defines the config for a neutron loadbalancer type OpenstackLoadbalancerConfig struct { - Method *string `json:"method,omitempty"` - Provider *string `json:"provider,omitempty"` - UseOctavia *bool `json:"useOctavia,omitempty"` - FloatingNetwork *string `json:"floatingNetwork,omitempty"` - SubnetID *string `json:"subnetID,omitempty"` + Method *string `json:"method,omitempty"` + Provider *string `json:"provider,omitempty"` + UseOctavia *bool `json:"useOctavia,omitempty"` + FloatingNetwork *string `json:"floatingNetwork,omitempty"` + FloatingNetworkID *string `json:"floatingNetworkID,omitempty"` + SubnetID *string `json:"subnetID,omitempty"` } // OpenstackMonitor defines the config for a health monitor diff --git a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go index c1ea3115bd..162c6cff0e 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go @@ -4129,6 +4129,7 @@ func autoConvert_v1alpha2_OpenstackLoadbalancerConfig_To_kops_OpenstackLoadbalan out.Provider = in.Provider out.UseOctavia = in.UseOctavia out.FloatingNetwork = in.FloatingNetwork + out.FloatingNetworkID = in.FloatingNetworkID out.SubnetID = in.SubnetID return nil } @@ -4143,6 +4144,7 @@ func autoConvert_kops_OpenstackLoadbalancerConfig_To_v1alpha2_OpenstackLoadbalan out.Provider = in.Provider out.UseOctavia = in.UseOctavia out.FloatingNetwork = in.FloatingNetwork + out.FloatingNetworkID = in.FloatingNetworkID out.SubnetID = in.SubnetID return nil } diff --git a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go index bbf9704862..5d83652ab6 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go @@ -2581,6 +2581,11 @@ func (in *OpenstackLoadbalancerConfig) DeepCopyInto(out *OpenstackLoadbalancerCo *out = new(string) **out = **in } + if in.FloatingNetworkID != nil { + in, out := &in.FloatingNetworkID, &out.FloatingNetworkID + *out = new(string) + **out = **in + } if in.SubnetID != nil { in, out := &in.SubnetID, &out.SubnetID *out = new(string) diff --git a/pkg/apis/kops/zz_generated.deepcopy.go b/pkg/apis/kops/zz_generated.deepcopy.go index 454a597486..66f66db7b4 100644 --- a/pkg/apis/kops/zz_generated.deepcopy.go +++ b/pkg/apis/kops/zz_generated.deepcopy.go @@ -2795,6 +2795,11 @@ func (in *OpenstackLoadbalancerConfig) DeepCopyInto(out *OpenstackLoadbalancerCo *out = new(string) **out = **in } + if in.FloatingNetworkID != nil { + in, out := &in.FloatingNetworkID, &out.FloatingNetworkID + *out = new(string) + **out = **in + } if in.SubnetID != nil { in, out := &in.SubnetID, &out.SubnetID *out = new(string) diff --git a/protokube/pkg/protokube/openstack_volume.go b/protokube/pkg/protokube/openstack_volume.go index c2f0f67e2a..a0432b2f7d 100644 --- a/protokube/pkg/protokube/openstack_volume.go +++ b/protokube/pkg/protokube/openstack_volume.go @@ -28,6 +28,7 @@ import ( "github.com/golang/glog" cinderv2 "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach" + "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "k8s.io/kops/protokube/pkg/etcd" "k8s.io/kops/protokube/pkg/gossip" gossipos "k8s.io/kops/protokube/pkg/gossip/openstack" @@ -172,14 +173,21 @@ func (a *OpenstackVolumes) discoverTags() error { // Internal IP { - ips, err := net.LookupIP(a.meta.Hostname) + servers, err := a.cloud.ListInstances(servers.ListOpts{ + Host: a.instanceName, + TenantID: a.meta.ProjectID, + }) + if err != nil || len(servers) < 1 { + return fmt.Errorf("error listing servers for hostname %s: %v", a.meta.Hostname, err) + } + if len(servers) > 1 { + return fmt.Errorf("recieved more than one server for hostname %s", a.meta.Hostname) + } + ip, err := openstack.GetServerFixedIP(&servers[0], a.clusterName) if err != nil { return fmt.Errorf("error querying InternalIP from hostname: %v", err) } - if len(ips) == 0 { - return fmt.Errorf("ip lookups from metadata hostname was empty") - } - a.internalIP = ips[0] + a.internalIP = net.ParseIP(ip) glog.Infof("Found internalIP=%q", a.internalIP) } diff --git a/upup/pkg/fi/cloudup/openstack/cloud.go b/upup/pkg/fi/cloudup/openstack/cloud.go index 24199b350a..64effa0a50 100644 --- a/upup/pkg/fi/cloudup/openstack/cloud.go +++ b/upup/pkg/fi/cloudup/openstack/cloud.go @@ -321,6 +321,17 @@ func NewOpenstackCloud(tags map[string]string, spec *kops.ClusterSpec) (Openstac c.extNetworkName = spec.CloudConfig.Openstack.Router.ExternalNetwork } + if spec.CloudConfig.Openstack.Loadbalancer.FloatingNetworkID == nil && + spec.CloudConfig.Openstack.Loadbalancer.FloatingNetwork != nil { + // This field is derived + lbNet, err := c.ListNetworks(networks.ListOpts{ + Name: fi.StringValue(spec.CloudConfig.Openstack.Loadbalancer.FloatingNetwork), + }) + if err != nil || len(lbNet) != 1 { + return c, fmt.Errorf("could not establish floating network id.") + } + spec.CloudConfig.Openstack.Loadbalancer.FloatingNetworkID = fi.String(lbNet[0].ID) + } return c, nil }