mirror of https://github.com/kubernetes/kops.git
Refactor based on changes to cloud instances
This commit is contained in:
parent
c01455cf91
commit
a483945711
|
|
@ -82,8 +82,6 @@ go_library(
|
|||
"//pkg/pki:go_default_library",
|
||||
"//pkg/pretty:go_default_library",
|
||||
"//pkg/resources:go_default_library",
|
||||
"//pkg/resources/aws:go_default_library",
|
||||
"//pkg/resources/openstack:go_default_library",
|
||||
"//pkg/resources/ops:go_default_library",
|
||||
"//pkg/sshcredentials:go_default_library",
|
||||
"//pkg/try:go_default_library",
|
||||
|
|
@ -92,7 +90,6 @@ go_library(
|
|||
"//upup/pkg/fi:go_default_library",
|
||||
"//upup/pkg/fi/cloudup:go_default_library",
|
||||
"//upup/pkg/fi/cloudup/awsup:go_default_library",
|
||||
"//upup/pkg/fi/cloudup/openstack:go_default_library",
|
||||
"//upup/pkg/fi/utils:go_default_library",
|
||||
"//upup/pkg/kutil:go_default_library",
|
||||
"//util/pkg/tables:go_default_library",
|
||||
|
|
|
|||
|
|
@ -27,31 +27,20 @@ import (
|
|||
"k8s.io/kubectl/pkg/util/i18n"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
|
||||
"k8s.io/kops/pkg/client/simple"
|
||||
|
||||
"k8s.io/kops/pkg/resources/openstack"
|
||||
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
"k8s.io/client-go/kubernetes"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||
|
||||
"k8s.io/kops/pkg/resources"
|
||||
"k8s.io/kops/util/pkg/tables"
|
||||
|
||||
"k8s.io/kops/pkg/apis/kops"
|
||||
"k8s.io/kops/pkg/resources/aws"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/kops/cmd/kops/util"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup"
|
||||
|
||||
osCloudup "k8s.io/kops/upup/pkg/fi/cloudup/openstack"
|
||||
)
|
||||
|
||||
func NewCmdGetInstances(f *util.Factory, out io.Writer, options *GetOptions) *cobra.Command {
|
||||
|
|
@ -119,114 +108,70 @@ func RunGetInstances(ctx context.Context, f *util.Factory, out io.Writer, option
|
|||
return err
|
||||
}
|
||||
|
||||
var status map[string]string
|
||||
nodeList, err := k8sClient.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
klog.V(2).Infof("error listing nodes: %v", err)
|
||||
} else {
|
||||
status, _ = getNodeStatus(ctx, cloud, clientset, cluster, nodeList.Items)
|
||||
}
|
||||
|
||||
var instances []*resources.Instance
|
||||
|
||||
switch cloud.ProviderID() {
|
||||
case kops.CloudProviderAWS:
|
||||
rs, _ := aws.ListInstances(cloud, options.clusterName)
|
||||
for _, r := range rs {
|
||||
instances = append(instances, aws.GetInstanceFromResource(r))
|
||||
}
|
||||
case kops.CloudProviderOpenstack:
|
||||
rs, _ := openstack.ListResources(cloud.(osCloudup.OpenstackCloud), options.clusterName)
|
||||
for _, r := range rs {
|
||||
if r.Type == "Instance" {
|
||||
instances = append(instances, openstack.GetInstanceFromResource(r))
|
||||
}
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("cloud provider not supported")
|
||||
}
|
||||
|
||||
switch options.output {
|
||||
case OutputTable:
|
||||
return instanceOutputTable(instances, status, out)
|
||||
default:
|
||||
return fmt.Errorf("Unsupported output format: %q", options.output)
|
||||
}
|
||||
}
|
||||
|
||||
func instanceOutputTable(instances []*resources.Instance, status map[string]string, out io.Writer) error {
|
||||
t := &tables.Table{}
|
||||
t.AddColumn("ID", func(i *resources.Instance) string {
|
||||
return i.ID
|
||||
})
|
||||
t.AddColumn("NAME", func(i *resources.Instance) string {
|
||||
return i.Name
|
||||
})
|
||||
t.AddColumn("STATUS", func(i *resources.Instance) string {
|
||||
s := status[i.ID]
|
||||
if s == "" {
|
||||
return "NotJoined"
|
||||
} else {
|
||||
return s
|
||||
}
|
||||
})
|
||||
t.AddColumn("ROLES", func(i *resources.Instance) string {
|
||||
return strings.Join(i.Roles, ", ")
|
||||
})
|
||||
t.AddColumn("INTERNAL-IP", func(i *resources.Instance) string {
|
||||
return i.PrivateAddress
|
||||
})
|
||||
t.AddColumn("INSTANCE-GROUP", func(i *resources.Instance) string {
|
||||
return i.InstanceGroup
|
||||
})
|
||||
t.AddColumn("MACHINE-TYPE", func(i *resources.Instance) string {
|
||||
return i.MachineType
|
||||
})
|
||||
return t.Render(instances, os.Stdout, "ID", "NAME", "STATUS", "ROLES", "INTERNAL-IP", "INSTANCE-GROUP", "MACHINE-TYPE")
|
||||
}
|
||||
|
||||
func getNodeStatus(ctx context.Context, cloud fi.Cloud, clientset simple.Clientset, cluster *kops.Cluster, nodes []v1.Node) (map[string]string, error) {
|
||||
status := make(map[string]string)
|
||||
igList, err := clientset.InstanceGroupsFor(cluster).List(ctx, metav1.ListOptions{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
|
||||
var instanceGroups []*kops.InstanceGroup
|
||||
for i := range igList.Items {
|
||||
instanceGroups = append(instanceGroups, &igList.Items[i])
|
||||
}
|
||||
igs := cloudinstances.GetNodeMap(nodes, cluster)
|
||||
|
||||
cloudGroups, err := cloud.GetCloudGroups(cluster, instanceGroups, false, nodes)
|
||||
var cloudInstances []*cloudinstances.CloudInstance
|
||||
|
||||
cloudGroups, err := cloud.GetCloudGroups(cluster, instanceGroups, false, nodeList.Items)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
|
||||
for _, cg := range cloudGroups {
|
||||
for _, instance := range cg.Ready {
|
||||
if instance.Detached {
|
||||
status[instance.ID] = "Detached"
|
||||
} else {
|
||||
if igs[instance.ID] != nil {
|
||||
status[instance.ID] = "Ready"
|
||||
} else {
|
||||
status[instance.ID] = "NotJoined"
|
||||
}
|
||||
}
|
||||
}
|
||||
cloudInstances = append(cloudInstances, cg.Ready...)
|
||||
cloudInstances = append(cloudInstances, cg.NeedUpdate...)
|
||||
}
|
||||
|
||||
for _, cg := range cloudGroups {
|
||||
for _, node := range cg.NeedUpdate {
|
||||
if node.Detached {
|
||||
status[node.ID] = "Detached"
|
||||
} else {
|
||||
status[node.ID] = "NeedsUpdate"
|
||||
}
|
||||
}
|
||||
switch options.output {
|
||||
case OutputTable:
|
||||
return instanceOutputTable(cloudInstances, out)
|
||||
default:
|
||||
return fmt.Errorf("unsupported output format: %q", options.output)
|
||||
}
|
||||
return status, nil
|
||||
}
|
||||
|
||||
func instanceOutputTable(instances []*cloudinstances.CloudInstance, out io.Writer) error {
|
||||
t := &tables.Table{}
|
||||
t.AddColumn("ID", func(i *cloudinstances.CloudInstance) string {
|
||||
return i.ID
|
||||
})
|
||||
t.AddColumn("NODE-NAME", func(i *cloudinstances.CloudInstance) string {
|
||||
node := i.Node
|
||||
if node == nil {
|
||||
return "NotJoined"
|
||||
} else {
|
||||
return node.Name
|
||||
}
|
||||
})
|
||||
t.AddColumn("STATUS", func(i *cloudinstances.CloudInstance) string {
|
||||
return i.Status
|
||||
})
|
||||
t.AddColumn("ROLES", func(i *cloudinstances.CloudInstance) string {
|
||||
return strings.Join(i.Roles, ", ")
|
||||
})
|
||||
t.AddColumn("INTERNAL-IP", func(i *cloudinstances.CloudInstance) string {
|
||||
return i.PrivateIP
|
||||
})
|
||||
t.AddColumn("INSTANCE-GROUP", func(i *cloudinstances.CloudInstance) string {
|
||||
return i.CloudInstanceGroup.HumanName
|
||||
})
|
||||
t.AddColumn("MACHINE-TYPE", func(i *cloudinstances.CloudInstance) string {
|
||||
return i.MachineType
|
||||
})
|
||||
return t.Render(instances, os.Stdout, "ID", "NODE-NAME", "STATUS", "ROLES", "INTERNAL-IP", "INSTANCE-GROUP", "MACHINE-TYPE")
|
||||
}
|
||||
|
||||
func createK8sClient(cluster *kops.Cluster) (*kubernetes.Clientset, error) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue