@@ -17,6 +17,8 @@ limitations under the License.
17
17
package cloud
18
18
19
19
import (
20
+ "strings"
21
+
20
22
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3"
21
23
22
24
"github.com/apache/cloudstack-go/v2/cloudstack"
@@ -25,14 +27,15 @@ import (
25
27
26
28
// ResourceTypeVPC is the type identifier for VPC resources.
27
29
const (
28
- ResourceTypeVPC = "VPC "
30
+ ResourceTypeVPC = "Vpc "
29
31
VPCOffering = "Default VPC offering"
30
32
)
31
33
32
34
// VPCIface defines the interface for VPC operations.
33
35
type VPCIface interface {
34
36
ResolveVPC (* infrav1.VPC ) error
35
37
CreateVPC (* infrav1.CloudStackFailureDomain , * infrav1.VPC ) error
38
+ RemoveClusterTagFromVPC (* infrav1.CloudStackCluster , * infrav1.VPC ) error
36
39
}
37
40
38
41
// getVPCOfferingID fetches a vpc offering id.
@@ -93,12 +96,67 @@ func (c *client) CreateVPC(fd *infrav1.CloudStackFailureDomain, vpc *infrav1.VPC
93
96
}
94
97
95
98
p := c .cs .VPC .NewCreateVPCParams (vpc .CIDR , vpc .Name , vpc .Name , offeringID , fd .Spec .Zone .ID )
96
-
99
+ setIfNotEmpty ( c . user . Project . ID , p . SetProjectid )
97
100
resp , err := c .cs .VPC .CreateVPC (p )
98
101
if err != nil {
99
102
c .customMetrics .EvaluateErrorAndIncrementAcsReconciliationErrorCounter (err )
100
103
return errors .Wrapf (err , "creating VPC with name %s" , vpc .Name )
101
104
}
102
105
vpc .ID = resp .Id
106
+ return c .AddCreatedByCAPCTag (ResourceTypeVPC , vpc .ID )
107
+ }
108
+
109
+ // DeleteVPC deletes a VPC.
110
+ func (c * client ) DeleteVPC (vpc * infrav1.VPC ) error {
111
+ _ , err := c .cs .VPC .DeleteVPC (c .cs .VPC .NewDeleteVPCParams (vpc .ID ))
112
+ c .customMetrics .EvaluateErrorAndIncrementAcsReconciliationErrorCounter (err )
113
+ return errors .Wrapf (err , "deleting vpc with id %s" , vpc .ID )
114
+ }
115
+
116
+ // DeleteVPCIfNotInUse deletes a VPC if the VPC is no longer in use (indicated by in use tags).
117
+ func (c * client ) DeleteVPCIfNotInUse (vpc * infrav1.VPC ) (retError error ) {
118
+ if vpc == nil || vpc .ID == "" {
119
+ return nil
120
+ }
121
+ tags , err := c .GetTags (ResourceTypeVPC , vpc .ID )
122
+ if err != nil {
123
+ return err
124
+ }
125
+
126
+ var clusterTagCount int
127
+ for tagName := range tags {
128
+ if strings .HasPrefix (tagName , ClusterTagNamePrefix ) {
129
+ clusterTagCount ++
130
+ }
131
+ }
132
+
133
+ if clusterTagCount == 0 && tags [CreatedByCAPCTagName ] != "" {
134
+ return c .DeleteVPC (vpc )
135
+ }
136
+
137
+ return nil
138
+ }
139
+
140
+ func generateVPCTagName (csCluster * infrav1.CloudStackCluster ) string {
141
+ return ClusterTagNamePrefix + string (csCluster .UID )
142
+ }
143
+
144
+ // RemoveClusterTagFromVPC removes the cluster in use tag from a VPC.
145
+ func (c * client ) RemoveClusterTagFromVPC (csCluster * infrav1.CloudStackCluster , vpc * infrav1.VPC ) (retError error ) {
146
+ if vpc == nil || vpc .ID == "" {
147
+ return nil
148
+ }
149
+ tags , err := c .GetTags (ResourceTypeVPC , vpc .ID )
150
+ if err != nil {
151
+ return err
152
+ }
153
+
154
+ ClusterTagName := generateVPCTagName (csCluster )
155
+ if tagValue := tags [ClusterTagName ]; tagValue != "" {
156
+ if err = c .DeleteTags (ResourceTypeVPC , vpc .ID , map [string ]string {ClusterTagName : tagValue }); err != nil {
157
+ return err
158
+ }
159
+ }
160
+
103
161
return nil
104
162
}
0 commit comments