Skip to content

Commit dbfc684

Browse files
committed
azure: add metadata info to resource group tags
When Hive runs the Installer destroy code, they don't always have all the cluster metadata information the destroyer needs. Adding new fields to the metadata is also a very painful process for them. This PR adds some cluster metadata information to the cluster resource group as tags, so that it can be discovered during destroy even if azure-specific information is missing from the `metadata.json` file. For now we are saving "region", "base domain resource group name", and "network resource group name" but the mechanism will be useful if we wish to add more data in the future without impacting Hive.
1 parent 0afc1b9 commit dbfc684

File tree

6 files changed

+79
-15
lines changed

6 files changed

+79
-15
lines changed

data/data/azure/variables-azure.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,9 @@ variable "azure_user_assigned_identity_key" {
302302
description = "Defines the user identity key used for the encryption of storage account."
303303
default = ""
304304
}
305+
306+
variable "azure_resource_group_metadata_tags" {
307+
type = map(string)
308+
description = "Metadata Azure tags to be applied to the cluster resource group."
309+
default = {}
310+
}

data/data/azure/vnet/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ resource "azurerm_resource_group" "main" {
2828

2929
name = "${var.cluster_id}-rg"
3030
location = var.azure_region
31-
tags = var.azure_extra_tags
31+
tags = merge(var.azure_extra_tags, var.azure_resource_group_metadata_tags)
3232
}
3333

3434
data "azurerm_resource_group" "main" {

pkg/asset/cluster/azure/azure.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,17 @@ func tagResourceGroup(ctx context.Context, clusterID string, installConfig *inst
124124
tagKey, tagValue := ownedTag(clusterID)
125125
group.Tags[tagKey] = tagValue
126126
logrus.Debugf("Tagging resource group %s with %s: %s", installConfig.Config.Azure.ResourceGroupName, tagKey, *tagValue)
127+
128+
// Save metadata needed to destroy cluster into tags
129+
config := installConfig.Config.Azure
130+
group.Tags[azure.TagMetadataRegion] = to.StringPtr(config.Region)
131+
if len(config.BaseDomainResourceGroupName) > 0 {
132+
group.Tags[azure.TagMetadataBaseDomainRG] = to.StringPtr(config.BaseDomainResourceGroupName)
133+
}
134+
if len(config.NetworkResourceGroupName) > 0 {
135+
group.Tags[azure.TagMetadataNetworkRG] = to.StringPtr(config.NetworkResourceGroupName)
136+
}
137+
127138
_, err = client.Update(ctx, installConfig.Config.Azure.ResourceGroupName, resources.GroupPatchable{
128139
Tags: group.Tags,
129140
})

pkg/destroy/azure/azure.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type ClusterUninstaller struct {
4646
InfraID string
4747
ResourceGroupName string
4848
BaseDomainResourceGroupName string
49+
NetworkResourceGroupName string
4950

5051
Logger logrus.FieldLogger
5152

@@ -126,15 +127,10 @@ func New(logger logrus.FieldLogger, metadata *types.ClusterMetadata) (providers.
126127
return nil, err
127128
}
128129

129-
group := metadata.Azure.ResourceGroupName
130-
if len(group) == 0 {
131-
group = metadata.InfraID + "-rg"
132-
}
133-
134130
return &ClusterUninstaller{
135131
Session: session,
136132
InfraID: metadata.InfraID,
137-
ResourceGroupName: group,
133+
ResourceGroupName: metadata.Azure.ResourceGroupName,
138134
Logger: logger,
139135
BaseDomainResourceGroupName: metadata.Azure.BaseDomainResourceGroupName,
140136
CloudName: cloudName,
@@ -156,6 +152,38 @@ func (o *ClusterUninstaller) Run() (*types.ClusterQuota, error) {
156152
waitCtx, cancel := context.WithTimeout(context.Background(), timeout)
157153
defer cancel()
158154

155+
// Retrieve metadata from resource group tags, if available
156+
filter := fmt.Sprintf("tagName eq 'kubernetes.io_cluster.%s' and tagValue eq 'owned'", o.InfraID)
157+
groupPager, err := o.resourceGroupsClient.ListComplete(waitCtx, filter, to.Int32Ptr(1))
158+
if err != nil {
159+
return nil, fmt.Errorf("could not list resource groups: %w", err)
160+
}
161+
162+
for ; groupPager.NotDone(); err = groupPager.NextWithContext(waitCtx) {
163+
if err != nil {
164+
o.Logger.Debugf("failed to advance to next resource group list page: %v", err)
165+
continue
166+
}
167+
group := groupPager.Value()
168+
if len(o.ResourceGroupName) == 0 {
169+
o.ResourceGroupName = to.String(group.Name)
170+
o.Logger.Debugf("found resource group name=%s from tags", o.ResourceGroupName)
171+
}
172+
if len(o.BaseDomainResourceGroupName) == 0 {
173+
o.BaseDomainResourceGroupName = to.String(group.Tags[azure.TagMetadataBaseDomainRG])
174+
o.Logger.Debugf("found base domain resource group name=%s from tags", o.BaseDomainResourceGroupName)
175+
}
176+
if len(o.NetworkResourceGroupName) == 0 {
177+
o.NetworkResourceGroupName = to.String(group.Tags[azure.TagMetadataNetworkRG])
178+
o.Logger.Debugf("found network resource group name=%s from tags", o.NetworkResourceGroupName)
179+
}
180+
}
181+
182+
if len(o.ResourceGroupName) == 0 {
183+
o.ResourceGroupName = o.InfraID + "-rg"
184+
o.Logger.Debugf("using default resource group name=%s", o.ResourceGroupName)
185+
}
186+
159187
err = wait.PollUntilContextCancel(
160188
waitCtx,
161189
1*time.Second,

pkg/tfvars/azure/azure.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,15 @@ type config struct {
6565
UseMarketplaceImage bool `json:"azure_use_marketplace_image"`
6666
MarketplaceImageHasPlan bool `json:"azure_marketplace_image_has_plan"`
6767
OSImage `json:",inline"`
68-
SecurityEncryptionType string `json:"azure_master_security_encryption_type,omitempty"`
69-
SecureVirtualMachineDiskEncryptionSetID string `json:"azure_master_secure_vm_disk_encryption_set_id,omitempty"`
70-
SecureBoot string `json:"azure_master_secure_boot,omitempty"`
71-
VirtualizedTrustedPlatformModule string `json:"azure_master_virtualized_trusted_platform_module,omitempty"`
72-
KeyVaultResourceGroup string `json:"azure_keyvault_resource_group,omitempty"`
73-
KeyVaultName string `json:"azure_keyvault_name,omitempty"`
74-
KeyVaultKeyName string `json:"azure_keyvault_key_name,omitempty"`
75-
UserAssignedIdentity string `json:"azure_user_assigned_identity_key,omitempty"`
68+
SecurityEncryptionType string `json:"azure_master_security_encryption_type,omitempty"`
69+
SecureVirtualMachineDiskEncryptionSetID string `json:"azure_master_secure_vm_disk_encryption_set_id,omitempty"`
70+
SecureBoot string `json:"azure_master_secure_boot,omitempty"`
71+
VirtualizedTrustedPlatformModule string `json:"azure_master_virtualized_trusted_platform_module,omitempty"`
72+
KeyVaultResourceGroup string `json:"azure_keyvault_resource_group,omitempty"`
73+
KeyVaultName string `json:"azure_keyvault_name,omitempty"`
74+
KeyVaultKeyName string `json:"azure_keyvault_key_name,omitempty"`
75+
UserAssignedIdentity string `json:"azure_user_assigned_identity_key,omitempty"`
76+
ResourceGroupMetadataTags map[string]string `json:"azure_resource_group_metadata_tags"`
7677
}
7778

7879
// TFVarsSources contains the parameters to be converted into Terraform variables
@@ -157,6 +158,16 @@ func TFVars(sources TFVarsSources) ([]byte, error) {
157158
Version: masterConfig.Image.Version,
158159
}
159160

161+
// Metadata tags to be added to the resource group for the cluster destroy
162+
metadataTags := map[string]string{}
163+
metadataTags[azure.TagMetadataRegion] = region
164+
if len(sources.BaseDomainResourceGroupName) > 0 {
165+
metadataTags[azure.TagMetadataBaseDomainRG] = sources.BaseDomainResourceGroupName
166+
}
167+
if len(masterConfig.NetworkResourceGroup) > 0 {
168+
metadataTags[azure.TagMetadataNetworkRG] = masterConfig.NetworkResourceGroup
169+
}
170+
160171
cfg := &config{
161172
Auth: sources.Auth,
162173
Environment: environment,
@@ -198,6 +209,7 @@ func TFVars(sources TFVarsSources) ([]byte, error) {
198209
KeyVaultName: sources.KeyVault.Name,
199210
KeyVaultKeyName: sources.KeyVault.KeyName,
200211
UserAssignedIdentity: sources.UserAssignedIdentityKey,
212+
ResourceGroupMetadataTags: metadataTags,
201213
}
202214

203215
return json.MarshalIndent(cfg, "", " ")

pkg/types/azure/metadata.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ type Metadata struct {
88
ResourceGroupName string `json:"resourceGroupName"`
99
BaseDomainResourceGroupName string `json:"baseDomainResourceGroupName"`
1010
}
11+
12+
// Keys used to save Metadata information as tags.
13+
const (
14+
TagMetadataRegion = "openshift_region"
15+
TagMetadataBaseDomainRG = "openshift_basedomainRG"
16+
TagMetadataNetworkRG = "openshift_networkRG"
17+
)

0 commit comments

Comments
 (0)