mirror of https://github.com/kubernetes/kops.git
scaleway: list and delete resources
This commit is contained in:
parent
d6810e1683
commit
ef8648e12c
|
@ -27,6 +27,7 @@ import (
|
|||
"k8s.io/kops/pkg/resources/gce"
|
||||
"k8s.io/kops/pkg/resources/hetzner"
|
||||
"k8s.io/kops/pkg/resources/openstack"
|
||||
"k8s.io/kops/pkg/resources/scaleway"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
||||
cloudazure "k8s.io/kops/upup/pkg/fi/cloudup/azure"
|
||||
|
@ -34,6 +35,7 @@ import (
|
|||
cloudgce "k8s.io/kops/upup/pkg/fi/cloudup/gce"
|
||||
cloudhetzner "k8s.io/kops/upup/pkg/fi/cloudup/hetzner"
|
||||
cloudopenstack "k8s.io/kops/upup/pkg/fi/cloudup/openstack"
|
||||
cloudscaleway "k8s.io/kops/upup/pkg/fi/cloudup/scaleway"
|
||||
)
|
||||
|
||||
// ListResources collects the resources from the specified cloud
|
||||
|
@ -60,6 +62,8 @@ func ListResources(cloud fi.Cloud, cluster *kops.Cluster) (map[string]*resources
|
|||
clusterInfo.AzureNetworkShared = cluster.SharedVPC()
|
||||
clusterInfo.AzureRouteTableShared = cluster.IsSharedAzureRouteTable()
|
||||
return azure.ListResourcesAzure(cloud.(cloudazure.AzureCloud), clusterInfo)
|
||||
case kops.CloudProviderScaleway:
|
||||
return scaleway.ListResources(cloud.(cloudscaleway.ScwCloud), clusterInfo)
|
||||
default:
|
||||
return nil, fmt.Errorf("delete on clusters on %q not (yet) supported", cloud.ProviderID())
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
# See the OWNERS docs at https://go.k8s.io/owners
|
||||
labels:
|
||||
- area/provider/scaleway
|
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
Copyright 2022 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package scaleway
|
||||
|
||||
import (
|
||||
"k8s.io/kops/pkg/resources"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/scaleway"
|
||||
|
||||
iam "github.com/scaleway/scaleway-sdk-go/api/iam/v1alpha1"
|
||||
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
|
||||
)
|
||||
|
||||
const (
|
||||
resourceTypeServer = "server"
|
||||
resourceTypeSSHKey = "ssh-key"
|
||||
resourceTypeVolume = "volume"
|
||||
)
|
||||
|
||||
type listFn func(fi.Cloud, string) ([]*resources.Resource, error)
|
||||
|
||||
func ListResources(cloud scaleway.ScwCloud, clusterInfo resources.ClusterInfo) (map[string]*resources.Resource, error) {
|
||||
resourceTrackers := make(map[string]*resources.Resource)
|
||||
clusterName := clusterInfo.Name
|
||||
|
||||
listFunctions := []listFn{
|
||||
listServers,
|
||||
listSSHKeys,
|
||||
listVolumes,
|
||||
}
|
||||
|
||||
for _, fn := range listFunctions {
|
||||
rt, err := fn(cloud, clusterName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, t := range rt {
|
||||
resourceTrackers[t.Type+":"+t.ID] = t
|
||||
}
|
||||
}
|
||||
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func listServers(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
servers, err := c.GetClusterServers(clusterName, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resourceTrackers := []*resources.Resource(nil)
|
||||
for _, server := range servers {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: server.Name,
|
||||
ID: server.ID,
|
||||
Type: resourceTypeServer,
|
||||
Deleter: func(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
return deleteServer(cloud, tracker)
|
||||
},
|
||||
Obj: server,
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func listSSHKeys(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
sshkeys, err := c.GetClusterSSHKeys(clusterName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resourceTrackers := []*resources.Resource(nil)
|
||||
for _, sshkey := range sshkeys {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: sshkey.Name,
|
||||
ID: sshkey.ID,
|
||||
Type: resourceTypeSSHKey,
|
||||
Deleter: func(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
return deleteSSHKey(cloud, tracker)
|
||||
},
|
||||
Obj: sshkey,
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func listVolumes(cloud fi.Cloud, clusterName string) ([]*resources.Resource, error) {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
volumes, err := c.GetClusterVolumes(clusterName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resourceTrackers := []*resources.Resource(nil)
|
||||
for _, volume := range volumes {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: volume.Name,
|
||||
ID: volume.ID,
|
||||
Type: resourceTypeVolume,
|
||||
Deleter: func(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
return deleteVolume(cloud, tracker)
|
||||
},
|
||||
Obj: volume,
|
||||
}
|
||||
if volume.Server != nil {
|
||||
resourceTracker.Blocked = []string{resourceTypeServer + ":" + volume.Server.ID}
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func deleteServer(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
server := tracker.Obj.(*instance.Server)
|
||||
|
||||
return c.DeleteServer(server)
|
||||
}
|
||||
|
||||
func deleteSSHKey(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
sshkey := tracker.Obj.(*iam.SSHKey)
|
||||
|
||||
return c.DeleteSSHKey(sshkey)
|
||||
}
|
||||
|
||||
func deleteVolume(cloud fi.Cloud, tracker *resources.Resource) error {
|
||||
c := cloud.(scaleway.ScwCloud)
|
||||
volume := tracker.Obj.(*instance.Volume)
|
||||
|
||||
return c.DeleteVolume(volume)
|
||||
}
|
|
@ -67,9 +67,11 @@ type ScwCloud interface {
|
|||
GetCloudGroups(cluster *kops.Cluster, instancegroups []*kops.InstanceGroup, warnUnmatched bool, nodes []v1.Node) (map[string]*cloudinstances.CloudInstanceGroup, error)
|
||||
|
||||
GetClusterServers(clusterName string, serverName *string) ([]*instance.Server, error)
|
||||
GetClusterSSHKeys(clusterName string) ([]*iam.SSHKey, error)
|
||||
GetClusterVolumes(clusterName string) ([]*instance.Volume, error)
|
||||
|
||||
DeleteServer(server *instance.Server) error
|
||||
DeleteSSHKey(sshkey *iam.SSHKey) error
|
||||
DeleteVolume(volume *instance.Volume) error
|
||||
}
|
||||
|
||||
|
@ -326,6 +328,20 @@ func (s *scwCloudImplementation) GetClusterServers(clusterName string, serverNam
|
|||
return servers.Servers, nil
|
||||
}
|
||||
|
||||
func (s *scwCloudImplementation) GetClusterSSHKeys(clusterName string) ([]*iam.SSHKey, error) {
|
||||
clusterSSHKeys := []*iam.SSHKey(nil)
|
||||
allSSHKeys, err := s.iamAPI.ListSSHKeys(&iam.ListSSHKeysRequest{}, scw.WithAllPages())
|
||||
for _, sshkey := range allSSHKeys.SSHKeys {
|
||||
if strings.HasPrefix(sshkey.Name, fmt.Sprintf("kubernetes.%s-", clusterName)) {
|
||||
clusterSSHKeys = append(clusterSSHKeys, sshkey)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list cluster ssh keys: %w", err)
|
||||
}
|
||||
return clusterSSHKeys, nil
|
||||
}
|
||||
|
||||
func (s *scwCloudImplementation) GetClusterVolumes(clusterName string) ([]*instance.Volume, error) {
|
||||
volumes, err := s.instanceAPI.ListVolumes(&instance.ListVolumesRequest{
|
||||
Zone: s.zone,
|
||||
|
@ -399,6 +415,16 @@ func (s *scwCloudImplementation) DeleteServer(server *instance.Server) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *scwCloudImplementation) DeleteSSHKey(sshkey *iam.SSHKey) error {
|
||||
err := s.iamAPI.DeleteSSHKey(&iam.DeleteSSHKeyRequest{
|
||||
SSHKeyID: sshkey.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete ssh key %s: %w", sshkey.ID, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *scwCloudImplementation) DeleteVolume(volume *instance.Volume) error {
|
||||
err := s.instanceAPI.DeleteVolume(&instance.DeleteVolumeRequest{
|
||||
VolumeID: volume.ID,
|
||||
|
|
|
@ -122,7 +122,8 @@ func (*SSHKey) RenderScw(c *fi.Context, actual, expected, changes *SSHKey) error
|
|||
klog.V(2).Infof("Creating keypair with name: %q", name)
|
||||
|
||||
keyArgs := &iam.CreateSSHKeyRequest{
|
||||
Name: name}
|
||||
Name: name,
|
||||
}
|
||||
if expected.PublicKey != nil {
|
||||
d, err := fi.ResourceAsString(*expected.PublicKey)
|
||||
if err != nil {
|
||||
|
|
Loading…
Reference in New Issue