Skip to content

Commit 9c3035d

Browse files
add config drive option to MDs on open stack provider (#7518)
Co-authored-by: ahmadhamzh <[email protected]>
1 parent cc98913 commit 9c3035d

File tree

8 files changed

+87
-20
lines changed

8 files changed

+87
-20
lines changed

modules/web/src/app/node-data/basic/provider/openstack/component.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {ClusterSpecService} from '@core/services/cluster-spec';
3333
import {DatacenterService} from '@core/services/datacenter';
3434
import {NodeDataService} from '@core/services/node-data/service';
3535
import {FilteredComboboxComponent} from '@shared/components/combobox/component';
36-
import {DatacenterOperatingSystemOptions} from '@shared/entity/datacenter';
36+
import {Datacenter, DatacenterOperatingSystemOptions} from '@shared/entity/datacenter';
3737
import {NodeCloudSpec, NodeSpec, OpenstackNodeSpec} from '@shared/entity/node';
3838
import {OpenstackAvailabilityZone, OpenstackFlavor, OpenstackServerGroup} from '@shared/entity/provider/openstack';
3939
import {OperatingSystem} from '@shared/model/NodeProviderConstants';
@@ -53,6 +53,7 @@ enum Controls {
5353
InstanceReadyCheckPeriod = 'instanceReadyCheckPeriod',
5454
InstanceReadyCheckTimeout = 'instanceReadyCheckTimeout',
5555
ServerGroup = 'serverGroup',
56+
EnableConfigDrive = 'enableConfigDrive',
5657
}
5758

5859
enum FlavorState {
@@ -117,6 +118,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
117118
selectedServerGroupID = '';
118119
serverGroupLabel = ServerGroupState.Empty;
119120
isEnterpriseEdition = DynamicModule.isEnterpriseEdition;
121+
isInWizardMode: boolean;
120122

121123
private _quotaCalculationService: QuotaCalculationService;
122124

@@ -168,8 +170,11 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
168170
[Controls.InstanceReadyCheckPeriod]: this._builder.control(this._instanceReadyCheckPeriodDefault),
169171
[Controls.InstanceReadyCheckTimeout]: this._builder.control(this._instanceReadyCheckTimeoutDefault),
170172
[Controls.ServerGroup]: this._builder.control(''),
173+
[Controls.EnableConfigDrive]: this._builder.control(false),
171174
});
172175

176+
this.isInWizardMode = this._nodeDataService.isInWizardMode();
177+
173178
this._init();
174179
this._nodeDataService.nodeData = this._getNodeData();
175180

@@ -179,7 +184,8 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
179184
this.form.get(Controls.Image).valueChanges,
180185
this.form.get(Controls.UseFloatingIP).valueChanges,
181186
this.form.get(Controls.InstanceReadyCheckPeriod).valueChanges,
182-
this.form.get(Controls.InstanceReadyCheckTimeout).valueChanges
187+
this.form.get(Controls.InstanceReadyCheckTimeout).valueChanges,
188+
this.form.get(Controls.EnableConfigDrive).valueChanges
183189
)
184190
.pipe(takeUntil(this._unsubscribe))
185191
.subscribe(_ => {
@@ -194,6 +200,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
194200
.subscribe(dc => {
195201
this._setDefaultImage(OperatingSystem.Ubuntu);
196202
this._enforceFloatingIP(dc.spec.openstack.enforceFloatingIP);
203+
this._enforceConfigDrive(dc);
197204
});
198205

199206
this._nodeDataService.operatingSystemChanges
@@ -243,6 +250,10 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
243250
return this.form.get(Controls.UseFloatingIP).disabled;
244251
}
245252

253+
isConfigDriveEnforced(): boolean {
254+
return this.form.get(Controls.EnableConfigDrive).disabled;
255+
}
256+
246257
isDiskSizeRequired(): boolean {
247258
return this.form.get(Controls.CustomDiskSize).hasValidator(Validators.required);
248259
}
@@ -289,6 +300,9 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
289300
this.form.get(Controls.UseCustomDisk).setValue(!!diskSize);
290301
this.form.get(Controls.InstanceReadyCheckPeriod).setValue(instanceReadyCheckPeriod);
291302
this.form.get(Controls.InstanceReadyCheckTimeout).setValue(instanceReadyCheckTimeout);
303+
this.form
304+
.get(Controls.EnableConfigDrive)
305+
.setValue(this._nodeDataService.nodeData.spec.cloud.openstack?.configDrive ?? false);
292306

293307
this._defaultOS = this._nodeDataService.operatingSystem;
294308
this._defaultImage = this._nodeDataService.nodeData.spec.cloud.openstack.image;
@@ -415,15 +429,19 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
415429
return;
416430
}
417431

418-
if (
419-
!this._nodeDataService.isInWizardMode() &&
420-
!this._clusterSpecService.cluster.spec.cloud.openstack.floatingIPPool
421-
) {
432+
if (!this.isInWizardMode && !this._clusterSpecService.cluster.spec.cloud.openstack.floatingIPPool) {
422433
this.form.get(Controls.UseFloatingIP).setValue(false);
423434
this.form.get(Controls.UseFloatingIP).disable();
424435
}
425436
}
426437

438+
private _enforceConfigDrive(dc: Datacenter): void {
439+
if (dc.spec.openstack.enableConfigDrive) {
440+
this.form.get(Controls.EnableConfigDrive).setValue(true);
441+
this.form.get(Controls.EnableConfigDrive).disable();
442+
}
443+
}
444+
427445
private _getNodeData(): NodeData {
428446
return {
429447
spec: {
@@ -435,6 +453,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
435453
instanceReadyCheckPeriod: `${this.form.get(Controls.InstanceReadyCheckPeriod).value}s`,
436454
instanceReadyCheckTimeout: `${this.form.get(Controls.InstanceReadyCheckTimeout).value}s`,
437455
serverGroup: this.selectedServerGroupID,
456+
configDrive: this.form.get(Controls.EnableConfigDrive)?.value ?? false,
438457
} as OpenstackNodeSpec,
439458
} as NodeCloudSpec,
440459
} as NodeSpec,
@@ -458,7 +477,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
458477
};
459478

460479
if (
461-
!this._nodeDataService.isInWizardMode() &&
480+
!this.isInWizardMode &&
462481
!this._initialQuotaCalculationPayload &&
463482
!!this._nodeDataService.nodeData.creationTimestamp
464483
) {

modules/web/src/app/node-data/basic/provider/openstack/style.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,3 @@
2222
align-self: center;
2323
margin-left: 5px;
2424
}
25-
26-
.use-floating-ip-checkbox {
27-
padding-bottom: 20px;
28-
}

modules/web/src/app/node-data/basic/provider/openstack/template.html

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,23 @@
9696
</div>
9797
</km-combobox>
9898

99-
<mat-checkbox class="use-floating-ip-checkbox"
100-
[formControlName]="Controls.UseFloatingIP"
101-
fxFlex
102-
kmValueChangedIndicator>
103-
Allocate Floating IP
99+
<div>
100+
<mat-checkbox [formControlName]="Controls.UseFloatingIP"
101+
kmValueChangedIndicator>
102+
Allocate Floating IP
103+
</mat-checkbox>
104104
<i *ngIf="isFloatingIPEnforced()"
105105
class="km-icon-info icon-info km-pointer"
106106
matTooltip="Floating IP usage is enforced by selected datacenter"></i>
107-
</mat-checkbox>
107+
</div>
108+
<div>
109+
<mat-checkbox [formControlName]="Controls.EnableConfigDrive">
110+
Enable Config Drive
111+
</mat-checkbox>
112+
<i *ngIf="isConfigDriveEnforced()"
113+
class="km-icon-info icon-info km-pointer"
114+
matTooltip="Config Drive usage is enforced by selected datacenter"></i>
115+
</div>
108116

109117
<km-number-stepper [formControlName]="Controls.InstanceReadyCheckPeriod"
110118
mode="errors"

modules/web/src/app/settings/admin/dynamic-datacenters/datacenter-data-dialog/component.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {FormControl, FormGroup, Validators} from '@angular/forms';
1717
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
1818
import {NotificationService} from '@core/services/notification';
1919
import {DatacenterService} from '@core/services/datacenter';
20-
import {AuditLoggingWebhookBackend} from '@shared/entity/cluster';
20+
import {AuditLoggingWebhookBackend, Provider} from '@shared/entity/cluster';
2121
import {CreateDatacenterModel, Datacenter, MachineFlavorFilter} from '@shared/entity/datacenter';
2222
import {DialogActionMode} from '@shared/types/common';
2323
import {INTERNAL_NODE_PROVIDERS} from '@shared/model/NodeProviderConstants';
@@ -52,6 +52,7 @@ export enum Controls {
5252
AuditWebhookBackendSecretName = 'auditWebhookBackendSecretName',
5353
AuditWebhookBackendSecretNamespace = 'auditWebhookBackendSecretNamespace',
5454
MachineFlavorFilter = 'machineFlavorFilter',
55+
EnableConfigDrive = 'enableConfigDrive',
5556
}
5657

5758
enum Title {
@@ -67,6 +68,7 @@ enum Title {
6768
export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
6869
private _unsubscribe = new Subject<void>();
6970
readonly controls = Controls;
71+
readonly Provider = Provider;
7072
readonly domainRegex = '^(?!-)[A-Za-z0-9-]+([\\-.][a-z0-9]+)*\\.[A-Za-z]{2,6}$';
7173
readonly countryCodes: string[] = countryCodeLookup.countries.map(country => country.iso2);
7274
readonly providers = INTERNAL_NODE_PROVIDERS;
@@ -130,10 +132,32 @@ export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
130132
this._initRequiredEmailsInput();
131133
this._initProviderConfigEditor();
132134

135+
if (this.form.get(Controls.Provider).value === Provider.OpenStack) {
136+
this.form.addControl(
137+
Controls.EnableConfigDrive,
138+
new FormControl(this.data.isEditing ? this.data.datacenter.spec.openstack.enableConfigDrive : false)
139+
);
140+
}
141+
133142
if (this.form.get(Controls.EnforceAuditWebhookBackend).value) {
134143
this._initAuditWebhookBackendControls(this.data.datacenter.spec.enforcedAuditWebhookSettings);
135144
}
136145

146+
this.form
147+
.get(Controls.Provider)
148+
.valueChanges.pipe(takeUntil(this._unsubscribe))
149+
.subscribe((provider: Provider) => {
150+
if (provider === Provider.OpenStack) {
151+
this.form.addControl(
152+
Controls.EnableConfigDrive,
153+
new FormControl(this.data.isEditing ? this.data.datacenter.spec.openstack.enableConfigDrive : false)
154+
);
155+
} else {
156+
this.form.removeControl(Controls.EnableConfigDrive);
157+
}
158+
this.form.updateValueAndValidity();
159+
});
160+
137161
this.form
138162
.get(Controls.EnforceAuditLogging)
139163
.valueChanges.pipe(takeUntil(this._unsubscribe))
@@ -208,6 +232,9 @@ export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
208232
};
209233

210234
datacenter.spec[datacenter.spec.provider] = this._getProviderConfig();
235+
if (datacenter.spec.provider === Provider.OpenStack) {
236+
datacenter.spec[datacenter.spec.provider].enableConfigDrive = this.form.get(Controls.EnableConfigDrive)?.value;
237+
}
211238

212239
// Nullify old provider value (it is needed to make edit work as it uses JSON Merge Patch).
213240
if (this.data.isEditing && datacenter.spec.provider !== this.data.datacenter.spec.provider) {

modules/web/src/app/settings/admin/dynamic-datacenters/datacenter-data-dialog/template.html

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,21 @@
187187
<km-machine-flavor-filter class="km-machine-flavor-filter"
188188
[formControl]="form.get(controls.MachineFlavorFilter)"
189189
[machineFlavorFilter]="machineFlavorFilter"></km-machine-flavor-filter>
190+
<mat-card-title class="property-name">Provider Configuration</mat-card-title>
191+
<ng-container *ngIf="form.get(controls.Provider).value === Provider.OpenStack">
192+
<mat-checkbox [formControlName]="controls.EnableConfigDrive">
193+
194+
<div fxLayout="row"
195+
fxLayoutAlign=" center"
196+
fxLayoutGap="4px">
197+
<span>Enable Config Drive</span>
198+
<i class="km-icon-info km-pointer"
199+
matTooltip="Enabling Config Drive will enforce it for all newly created machine deployments using this datacenter.">
200+
</i>
201+
</div>
202+
</mat-checkbox>
203+
</ng-container>
190204
</form>
191-
192-
<div class="property-name">Provider Configuration</div>
193205
<km-editor [(model)]="providerConfig"
194206
header="YAML"></km-editor>
195207
<mat-hint>If not specified default configuration will be used.</mat-hint>

modules/web/src/app/shared/components/cluster-summary/template.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,9 @@ <h4>IPv6</h4>
11811181
<km-property-boolean label="Allocate Floating IP"
11821182
[value]="machineDeployment.spec.template.cloud?.openstack?.useFloatingIP">
11831183
</km-property-boolean>
1184+
<km-property-boolean label="Enable Config Drive"
1185+
[value]="machineDeployment.spec.template.cloud?.openstack?.configDrive">
1186+
</km-property-boolean>
11841187
</ng-container>
11851188

11861189
<!-- AWS Tags -->

modules/web/src/app/shared/entity/datacenter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export class OpenStackDatacenterSpec {
134134
region: string;
135135
images: DatacenterOperatingSystemOptions;
136136
enforceFloatingIP: boolean;
137+
enableConfigDrive?: boolean;
137138
}
138139

139140
export class EquinixDatacenterSpec {

modules/web/src/app/shared/entity/node.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ export class OpenstackNodeSpec {
263263
availabilityZone?: string;
264264
instanceReadyCheckPeriod: string;
265265
instanceReadyCheckTimeout: string;
266+
configDrive?: boolean;
266267
}
267268

268269
export class EquinixNodeSpec {

0 commit comments

Comments
 (0)