Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import {ClusterSpecService} from '@core/services/cluster-spec';
import {DatacenterService} from '@core/services/datacenter';
import {NodeDataService} from '@core/services/node-data/service';
import {FilteredComboboxComponent} from '@shared/components/combobox/component';
import {DatacenterOperatingSystemOptions} from '@shared/entity/datacenter';
import {Datacenter, DatacenterOperatingSystemOptions} from '@shared/entity/datacenter';
import {NodeCloudSpec, NodeSpec, OpenstackNodeSpec} from '@shared/entity/node';
import {OpenstackAvailabilityZone, OpenstackFlavor, OpenstackServerGroup} from '@shared/entity/provider/openstack';
import {OperatingSystem} from '@shared/model/NodeProviderConstants';
Expand All @@ -53,6 +53,7 @@ enum Controls {
InstanceReadyCheckPeriod = 'instanceReadyCheckPeriod',
InstanceReadyCheckTimeout = 'instanceReadyCheckTimeout',
ServerGroup = 'serverGroup',
EnableConfigDrive = 'enableConfigDrive',
}

enum FlavorState {
Expand Down Expand Up @@ -118,6 +119,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
selectedServerGroupID = '';
serverGroupLabel = ServerGroupState.Empty;
isEnterpriseEdition = DynamicModule.isEnterpriseEdition;
isInWizardMode: boolean;

private _quotaCalculationService: QuotaCalculationService;

Expand Down Expand Up @@ -169,8 +171,11 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
[Controls.InstanceReadyCheckPeriod]: this._builder.control(this._instanceReadyCheckPeriodDefault),
[Controls.InstanceReadyCheckTimeout]: this._builder.control(this._instanceReadyCheckTimeoutDefault),
[Controls.ServerGroup]: this._builder.control(''),
[Controls.EnableConfigDrive]: this._builder.control(false),
});

this.isInWizardMode = this._nodeDataService.isInWizardMode();

this._init();
this._nodeDataService.nodeData = this._getNodeData();

Expand All @@ -180,7 +185,8 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
this.form.get(Controls.Image).valueChanges,
this.form.get(Controls.UseFloatingIP).valueChanges,
this.form.get(Controls.InstanceReadyCheckPeriod).valueChanges,
this.form.get(Controls.InstanceReadyCheckTimeout).valueChanges
this.form.get(Controls.InstanceReadyCheckTimeout).valueChanges,
this.form.get(Controls.EnableConfigDrive).valueChanges
)
.pipe(takeUntil(this._unsubscribe))
.subscribe(_ => {
Expand All @@ -195,6 +201,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
.subscribe(dc => {
this._setDefaultImage(OperatingSystem.Ubuntu);
this._enforceFloatingIP(dc.spec.openstack.enforceFloatingIP);
this._enforceConfigDrive(dc);
});

this._nodeDataService.operatingSystemChanges
Expand Down Expand Up @@ -244,6 +251,10 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
return this.form.get(Controls.UseFloatingIP).disabled;
}

isConfigDriveEnforced(): boolean {
return this.form.get(Controls.EnableConfigDrive).disabled;
}

isDiskSizeRequired(): boolean {
return this.form.get(Controls.CustomDiskSize).hasValidator(Validators.required);
}
Expand Down Expand Up @@ -290,6 +301,9 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
this.form.get(Controls.UseCustomDisk).setValue(!!diskSize);
this.form.get(Controls.InstanceReadyCheckPeriod).setValue(instanceReadyCheckPeriod);
this.form.get(Controls.InstanceReadyCheckTimeout).setValue(instanceReadyCheckTimeout);
this.form
.get(Controls.EnableConfigDrive)
.setValue(this._nodeDataService.nodeData.spec.cloud.openstack?.configDrive ?? false);

this._defaultOS = this._nodeDataService.operatingSystem;
this._defaultImage = this._nodeDataService.nodeData.spec.cloud.openstack.image;
Expand Down Expand Up @@ -416,15 +430,19 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
return;
}

if (
!this._nodeDataService.isInWizardMode() &&
!this._clusterSpecService.cluster.spec.cloud.openstack.floatingIPPool
) {
if (!this.isInWizardMode && !this._clusterSpecService.cluster.spec.cloud.openstack.floatingIPPool) {
this.form.get(Controls.UseFloatingIP).setValue(false);
this.form.get(Controls.UseFloatingIP).disable();
}
}

private _enforceConfigDrive(dc: Datacenter): void {
if (dc.spec.openstack.enableConfigDrive) {
this.form.get(Controls.EnableConfigDrive).setValue(true);
this.form.get(Controls.EnableConfigDrive).disable();
}
}

private _getNodeData(): NodeData {
return {
spec: {
Expand All @@ -436,6 +454,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
instanceReadyCheckPeriod: `${this.form.get(Controls.InstanceReadyCheckPeriod).value}s`,
instanceReadyCheckTimeout: `${this.form.get(Controls.InstanceReadyCheckTimeout).value}s`,
serverGroup: this.selectedServerGroupID,
configDrive: this.form.get(Controls.EnableConfigDrive)?.value ?? false,
} as OpenstackNodeSpec,
} as NodeCloudSpec,
} as NodeSpec,
Expand All @@ -459,7 +478,7 @@ export class OpenstackBasicNodeDataComponent extends BaseFormValidator implement
};

if (
!this._nodeDataService.isInWizardMode() &&
!this.isInWizardMode &&
!this._initialQuotaCalculationPayload &&
!!this._nodeDataService.nodeData.creationTimestamp
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,3 @@
align-self: center;
margin-left: 5px;
}

.use-floating-ip-checkbox {
padding-bottom: 20px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,15 +96,23 @@
</div>
</km-combobox>

<mat-checkbox class="use-floating-ip-checkbox"
[formControlName]="Controls.UseFloatingIP"
fxFlex
kmValueChangedIndicator>
Allocate Floating IP
<div>
<mat-checkbox [formControlName]="Controls.UseFloatingIP"
kmValueChangedIndicator>
Allocate Floating IP
</mat-checkbox>
<i *ngIf="isFloatingIPEnforced()"
class="km-icon-info icon-info km-pointer"
matTooltip="Floating IP usage is enforced by selected datacenter"></i>
</mat-checkbox>
</div>
<div>
<mat-checkbox [formControlName]="Controls.EnableConfigDrive">
Enable Config Drive
</mat-checkbox>
<i *ngIf="isConfigDriveEnforced()"
class="km-icon-info icon-info km-pointer"
matTooltip="Config Drive usage is enforced by selected datacenter"></i>
</div>

<km-number-stepper [formControlName]="Controls.InstanceReadyCheckPeriod"
mode="errors"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {FormControl, FormGroup, Validators} from '@angular/forms';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {NotificationService} from '@core/services/notification';
import {DatacenterService} from '@core/services/datacenter';
import {AuditLoggingWebhookBackend} from '@shared/entity/cluster';
import {AuditLoggingWebhookBackend, Provider} from '@shared/entity/cluster';
import {CreateDatacenterModel, Datacenter, MachineFlavorFilter} from '@shared/entity/datacenter';
import {DialogActionMode} from '@shared/types/common';
import {INTERNAL_NODE_PROVIDERS} from '@shared/model/NodeProviderConstants';
Expand Down Expand Up @@ -52,6 +52,7 @@ export enum Controls {
AuditWebhookBackendSecretName = 'auditWebhookBackendSecretName',
AuditWebhookBackendSecretNamespace = 'auditWebhookBackendSecretNamespace',
MachineFlavorFilter = 'machineFlavorFilter',
EnableConfigDrive = 'enableConfigDrive',
}

enum Title {
Expand All @@ -68,6 +69,7 @@ enum Title {
export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
private _unsubscribe = new Subject<void>();
readonly controls = Controls;
readonly Provider = Provider;
readonly domainRegex = '^(?!-)[A-Za-z0-9-]+([\\-.][a-z0-9]+)*\\.[A-Za-z]{2,6}$';
readonly countryCodes: string[] = countryCodeLookup.countries.map(country => country.iso2);
readonly providers = INTERNAL_NODE_PROVIDERS;
Expand Down Expand Up @@ -131,10 +133,32 @@ export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
this._initRequiredEmailsInput();
this._initProviderConfigEditor();

if (this.form.get(Controls.Provider).value === Provider.OpenStack) {
this.form.addControl(
Controls.EnableConfigDrive,
new FormControl(this.data.isEditing ? this.data.datacenter.spec.openstack.enableConfigDrive : false)
);
}

if (this.form.get(Controls.EnforceAuditWebhookBackend).value) {
this._initAuditWebhookBackendControls(this.data.datacenter.spec.enforcedAuditWebhookSettings);
}

this.form
.get(Controls.Provider)
.valueChanges.pipe(takeUntil(this._unsubscribe))
.subscribe((provider: Provider) => {
if (provider === Provider.OpenStack) {
this.form.addControl(
Controls.EnableConfigDrive,
new FormControl(this.data.isEditing ? this.data.datacenter.spec.openstack.enableConfigDrive : false)
);
} else {
this.form.removeControl(Controls.EnableConfigDrive);
}
this.form.updateValueAndValidity();
});

this.form
.get(Controls.EnforceAuditLogging)
.valueChanges.pipe(takeUntil(this._unsubscribe))
Expand Down Expand Up @@ -209,6 +233,9 @@ export class DatacenterDataDialogComponent implements OnInit, OnDestroy {
};

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

// Nullify old provider value (it is needed to make edit work as it uses JSON Merge Patch).
if (this.data.isEditing && datacenter.spec.provider !== this.data.datacenter.spec.provider) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,21 @@
<km-machine-flavor-filter class="km-machine-flavor-filter"
[formControl]="form.get(controls.MachineFlavorFilter)"
[machineFlavorFilter]="machineFlavorFilter"></km-machine-flavor-filter>
<mat-card-title class="property-name">Provider Configuration</mat-card-title>
<ng-container *ngIf="form.get(controls.Provider).value === Provider.OpenStack">
<mat-checkbox [formControlName]="controls.EnableConfigDrive">

<div fxLayout="row"
fxLayoutAlign=" center"
fxLayoutGap="4px">
<span>Enable Config Drive</span>
<i class="km-icon-info km-pointer"
matTooltip="Enabling Config Drive will enforce it for all newly created machine deployments using this datacenter.">
</i>
</div>
</mat-checkbox>
</ng-container>
</form>

<div class="property-name">Provider Configuration</div>
<km-editor [(model)]="providerConfig"
header="YAML"></km-editor>
<mat-hint>If not specified default configuration will be used.</mat-hint>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,9 @@ <h4>IPv6</h4>
<km-property-boolean label="Allocate Floating IP"
[value]="machineDeployment.spec.template.cloud?.openstack?.useFloatingIP">
</km-property-boolean>
<km-property-boolean label="Enable Config Drive"
[value]="machineDeployment.spec.template.cloud?.openstack?.configDrive">
</km-property-boolean>
</ng-container>

<!-- AWS Tags -->
Expand Down
1 change: 1 addition & 0 deletions modules/web/src/app/shared/entity/datacenter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ export class OpenStackDatacenterSpec {
region: string;
images: DatacenterOperatingSystemOptions;
enforceFloatingIP: boolean;
enableConfigDrive?: boolean;
}

export class EquinixDatacenterSpec {
Expand Down
1 change: 1 addition & 0 deletions modules/web/src/app/shared/entity/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ export class OpenstackNodeSpec {
availabilityZone?: string;
instanceReadyCheckPeriod: string;
instanceReadyCheckTimeout: string;
configDrive?: boolean;
}

export class EquinixNodeSpec {
Expand Down