Skip to content

Commit

Permalink
OpenStack: Deleting servers using tag-based filtering
Browse files Browse the repository at this point in the history
Now to delete servers we first get a list of all available servers
from Nova, and then we iterate through them to find those with
required metadata. In the case of a large number of servers, this
can take a very long time.

Fortunately gophercloud introduced filtering by tags, so we can
start using this feature to get only servers with the required tag.
gophercloud/gophercloud#1759
  • Loading branch information
Fedosin committed Jun 29, 2020
1 parent dd27e4c commit d76cf96
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 26 deletions.
7 changes: 1 addition & 6 deletions data/data/openstack/masters/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,5 @@ resource "openstack_compute_instance_v2" "master_conf" {
}
}

metadata = {
# FIXME(mandre) shouldn't it be "${var.cluster_id}-master-${count.index}" ?
Name = "${var.cluster_id}-master"
# "kubernetes.io/cluster/${var.cluster_id}" = "owned"
openshiftClusterID = var.cluster_id
}
tags = ["openshiftClusterID=${var.cluster_id}"]
}
4 changes: 0 additions & 4 deletions pkg/asset/machines/openstack/machines.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,6 @@ func generateProvider(clusterID string, platform *openstack.Platform, mpool *ope
Tags: []string{
fmt.Sprintf("openshiftClusterID=%s", clusterID),
},
ServerMetadata: map[string]string{
"Name": fmt.Sprintf("%s-%s", clusterID, role),
"openshiftClusterID": clusterID,
},
}
if mpool.RootVolume != nil {
spec.RootVolume = &openstackprovider.RootVolume{
Expand Down
18 changes: 2 additions & 16 deletions pkg/destroy/openstack/openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,12 +200,7 @@ func deleteServers(opts *clientconfig.ClientOpts, filter Filter, logger logrus.F
}

listOpts := servers.ListOpts{
// FIXME(shardy) when gophercloud supports tags we should
// filter by tag here
// https://github.com/gophercloud/gophercloud/pull/1115
// and Nova doesn't seem to support filter by Metadata, so for
// now we do client side filtering below based on the
// Metadata key (which matches the server properties).
TagsAny: strings.Join(filterTags(filter), ","),
}

allPages, err := servers.List(conn, listOpts).AllPages()
Expand All @@ -220,16 +215,7 @@ func deleteServers(opts *clientconfig.ClientOpts, filter Filter, logger logrus.F
return false, nil
}

serverObjects := []ObjectWithTags{}
for _, server := range allServers {
serverObjects = append(
serverObjects, ObjectWithTags{
ID: server.ID,
Tags: server.Metadata})
}

filteredServers := filterObjects(serverObjects, filter)
for _, server := range filteredServers {
logger.Debugf("Deleting Server %q", server.ID)
err = servers.Delete(conn, server.ID).ExtractErr()
if err != nil {
Expand All @@ -241,7 +227,7 @@ func deleteServers(opts *clientconfig.ClientOpts, filter Filter, logger logrus.F
logger.Debugf("Cannot find server %q. It's probably already been deleted.", server.ID)
}
}
return len(filteredServers) == 0, nil
return len(allServers) == 0, nil
}

func deleteServerGroups(opts *clientconfig.ClientOpts, filter Filter, logger logrus.FieldLogger) (bool, error) {
Expand Down

0 comments on commit d76cf96

Please sign in to comment.