Require fi.Cloud to implement kops.StatusStore

This commit is contained in:
John Gardiner Myers 2021-05-15 13:15:08 -07:00
parent 4090c07e01
commit 1dab19f499
7 changed files with 48 additions and 123 deletions

View File

@ -21,14 +21,7 @@ go_library(
"//pkg/client/simple:go_default_library",
"//pkg/commands/helpers:go_default_library",
"//pkg/featureflag:go_default_library",
"//pkg/resources/digitalocean:go_default_library",
"//upup/pkg/fi/cloudup:go_default_library",
"//upup/pkg/fi/cloudup/aliup:go_default_library",
"//upup/pkg/fi/cloudup/awstasks:go_default_library",
"//upup/pkg/fi/cloudup/awsup:go_default_library",
"//upup/pkg/fi/cloudup/azure:go_default_library",
"//upup/pkg/fi/cloudup/gce:go_default_library",
"//upup/pkg/fi/cloudup/openstack:go_default_library",
"//util/pkg/reflectutils:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",

View File

@ -17,17 +17,8 @@ limitations under the License.
package commands
import (
"fmt"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/pkg/resources/digitalocean"
"k8s.io/kops/upup/pkg/fi/cloudup"
"k8s.io/kops/upup/pkg/fi/cloudup/aliup"
"k8s.io/kops/upup/pkg/fi/cloudup/awstasks"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
"k8s.io/kops/upup/pkg/fi/cloudup/azure"
"k8s.io/kops/upup/pkg/fi/cloudup/gce"
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
)
// CloudDiscoveryStatusStore implements status.Store by inspecting cloud objects.
@ -43,39 +34,7 @@ func (s *CloudDiscoveryStatusStore) GetApiIngressStatus(cluster *kops.Cluster) (
return nil, err
}
if aliCloud, ok := cloud.(aliup.ALICloud); ok {
return aliCloud.GetApiIngressStatus(cluster)
}
if gceCloud, ok := cloud.(gce.GCECloud); ok {
return gceCloud.GetApiIngressStatus(cluster)
}
if awsCloud, ok := cloud.(awsup.AWSCloud); ok {
var ingresses []kops.ApiIngressStatus
if lbDnsName, err := awstasks.FindDNSName(awsCloud, cluster); err != nil {
return nil, fmt.Errorf("error finding aws DNSName: %v", err)
} else if lbDnsName != "" {
ingresses = append(ingresses, kops.ApiIngressStatus{Hostname: lbDnsName})
}
return ingresses, nil
}
if azureCloud, ok := cloud.(azure.AzureCloud); ok {
return azureCloud.GetApiIngressStatus(cluster)
}
if osCloud, ok := cloud.(openstack.OpenstackCloud); ok {
return osCloud.GetApiIngressStatus(cluster)
}
if doCloud, ok := cloud.(*digitalocean.Cloud); ok {
return doCloud.GetApiIngressStatus(cluster)
}
return nil, fmt.Errorf("API Ingress Status not implemented for %T", cloud)
return cloud.GetApiIngressStatus(cluster)
}
// FindClusterStatus discovers the status of the cluster, by inspecting the cloud objects
@ -85,28 +44,5 @@ func (s *CloudDiscoveryStatusStore) FindClusterStatus(cluster *kops.Cluster) (*k
return nil, err
}
if gceCloud, ok := cloud.(gce.GCECloud); ok {
return gceCloud.FindClusterStatus(cluster)
}
if awsCloud, ok := cloud.(awsup.AWSCloud); ok {
return awsCloud.FindClusterStatus(cluster)
}
if aliCloud, ok := cloud.(aliup.ALICloud); ok {
return aliCloud.FindClusterStatus(cluster)
}
if azureCloud, ok := cloud.(azure.AzureCloud); ok {
return azureCloud.FindClusterStatus(cluster)
}
if osCloud, ok := cloud.(openstack.OpenstackCloud); ok {
return osCloud.FindClusterStatus(cluster)
}
if doCloud, ok := cloud.(*digitalocean.Cloud); ok {
return doCloud.FindClusterStatus(cluster)
}
return nil, fmt.Errorf("etcd Status not implemented for %T", cloud)
return cloud.FindClusterStatus(cluster)
}

View File

@ -24,6 +24,8 @@ import (
)
type Cloud interface {
kops.StatusStore
ProviderID() kops.CloudProviderID
DNS() (dnsprovider.Interface, error)

View File

@ -87,7 +87,6 @@ go_library(
importpath = "k8s.io/kops/upup/pkg/fi/cloudup/awstasks",
visibility = ["//visibility:public"],
deps = [
"//pkg/apis/kops:go_default_library",
"//pkg/diff:go_default_library",
"//pkg/featureflag:go_default_library",
"//pkg/pki:go_default_library",

View File

@ -24,7 +24,6 @@ import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/route53"
"k8s.io/klog/v2"
"k8s.io/kops/pkg/apis/kops"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
"k8s.io/kops/upup/pkg/fi/cloudup/cloudformation"
@ -130,49 +129,6 @@ func (e *DNSName) Find(c *fi.Context) (*DNSName, error) {
return actual, nil
}
func FindDNSName(awsCloud awsup.AWSCloud, cluster *kops.Cluster) (string, error) {
name := "api." + cluster.Name
lb, err := FindElasticLoadBalancerByNameTag(awsCloud, cluster)
if err != nil {
return "", fmt.Errorf("error looking for AWS ELB: %v", err)
}
if lb == nil {
return "", nil
}
lbDnsName := aws.StringValue(lb.getDNSName())
if lbDnsName == "" {
return "", fmt.Errorf("found ELB %q, but it did not have a DNSName", name)
}
return lbDnsName, nil
}
func FindElasticLoadBalancerByNameTag(awsCloud awsup.AWSCloud, cluster *kops.Cluster) (DNSTarget, error) {
name := "api." + cluster.Name
if cluster.Spec.API == nil || cluster.Spec.API.LoadBalancer == nil {
return nil, nil
}
if cluster.Spec.API.LoadBalancer.Class == kops.LoadBalancerClassClassic {
if lb, err := awsCloud.FindELBByNameTag(name); err != nil {
return nil, fmt.Errorf("error looking for AWS ELB: %v", err)
} else if lb != nil {
return &ClassicLoadBalancer{Name: fi.String(name), DNSName: lb.DNSName}, nil
}
} else if cluster.Spec.API.LoadBalancer.Class == kops.LoadBalancerClassNetwork {
if lb, err := awsCloud.FindELBV2ByNameTag(name); err != nil {
return nil, fmt.Errorf("error looking for AWS NLB: %v", err)
} else if lb != nil {
return &NetworkLoadBalancer{Name: fi.String(name), DNSName: lb.DNSName}, nil
}
}
return nil, nil
}
func findDNSTarget(cloud awsup.AWSCloud, aliasTarget *route53.AliasTarget, dnsName string, targetDNSName *string) (DNSTarget, error) {
//TODO: I would like to search dnsName for presence of ".elb" or ".nlb" to simply searching, however both nlb and elb have .elb. in the name at present
if ELB, err := findDNSTargetELB(cloud, aliasTarget, dnsName, targetDNSName); err != nil {

View File

@ -1868,6 +1868,42 @@ func findVPCInfo(c AWSCloud, vpcID string) (*fi.VPCInfo, error) {
return vpcInfo, nil
}
func (c *awsCloudImplementation) GetApiIngressStatus(cluster *kops.Cluster) ([]kops.ApiIngressStatus, error) {
return getApiIngressStatus(c, cluster)
}
func getApiIngressStatus(c AWSCloud, cluster *kops.Cluster) ([]kops.ApiIngressStatus, error) {
var ingresses []kops.ApiIngressStatus
if lbDnsName, err := findDNSName(c, cluster); err != nil {
return nil, fmt.Errorf("error finding aws DNSName: %v", err)
} else if lbDnsName != "" {
ingresses = append(ingresses, kops.ApiIngressStatus{Hostname: lbDnsName})
}
return ingresses, nil
}
func findDNSName(c AWSCloud, cluster *kops.Cluster) (string, error) {
name := "api." + cluster.Name
if cluster.Spec.API == nil || cluster.Spec.API.LoadBalancer == nil {
return "", nil
}
if cluster.Spec.API.LoadBalancer.Class == kops.LoadBalancerClassClassic {
if lb, err := c.FindELBByNameTag(name); err != nil {
return "", fmt.Errorf("error looking for AWS ELB: %v", err)
} else if lb != nil {
return aws.StringValue(lb.DNSName), nil
}
} else if cluster.Spec.API.LoadBalancer.Class == kops.LoadBalancerClassNetwork {
if lb, err := c.FindELBV2ByNameTag(name); err != nil {
return "", fmt.Errorf("error looking for AWS NLB: %v", err)
} else if lb != nil {
return aws.StringValue(lb.DNSName), nil
}
}
return "", nil
}
// DefaultInstanceType determines an instance type for the specified cluster & instance group
func (c *awsCloudImplementation) DefaultInstanceType(cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error) {
var candidates []string

View File

@ -19,20 +19,19 @@ package awsup
import (
"fmt"
"github.com/aws/aws-sdk-go/service/elb"
"github.com/aws/aws-sdk-go/service/elbv2"
"github.com/aws/aws-sdk-go/service/eventbridge/eventbridgeiface"
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface"
"github.com/aws/aws-sdk-go/service/cloudformation"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
"github.com/aws/aws-sdk-go/service/elb"
"github.com/aws/aws-sdk-go/service/elb/elbiface"
"github.com/aws/aws-sdk-go/service/elbv2"
"github.com/aws/aws-sdk-go/service/elbv2/elbv2iface"
"github.com/aws/aws-sdk-go/service/eventbridge/eventbridgeiface"
"github.com/aws/aws-sdk-go/service/iam/iamiface"
"github.com/aws/aws-sdk-go/service/route53/route53iface"
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
v1 "k8s.io/api/core/v1"
"k8s.io/klog/v2"
"k8s.io/kops/dnsprovider/pkg/dnsprovider"
@ -302,6 +301,10 @@ func (c *MockAWSCloud) FindVPCInfo(id string) (*fi.VPCInfo, error) {
return findVPCInfo(c, id)
}
func (c *MockAWSCloud) GetApiIngressStatus(cluster *kops.Cluster) ([]kops.ApiIngressStatus, error) {
return getApiIngressStatus(c, cluster)
}
// DefaultInstanceType determines an instance type for the specified cluster & instance group
func (c *MockAWSCloud) DefaultInstanceType(cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error) {
switch ig.Spec.Role {