@allow_empty_body
# pylint: disable=W0102,W0613
def migrate(self, daemon_name=None, realm_name=None, zonegroup_name=None, zone_name=None,
- zonegroup_endpoints=None, zone_endpoints=None, username=None):
+ zonegroup_endpoints=None, zone_endpoints=None, username=None, tier_type=None):
multisite_instance = RgwMultisite()
result = multisite_instance.migrate_to_multisite(realm_name, zonegroup_name,
zone_name, zonegroup_endpoints,
- zone_endpoints, username)
+ zone_endpoints, username, tier_type)
return result
@RESTController.Collection(method='POST', path='/multisite-replications')
@allow_empty_body
# pylint: disable=W0102,W0613
def setup_multisite_replication(self, daemon_name=None, realm_name=None, zonegroup_name=None,
- zonegroup_endpoints=None, zone_name=None, zone_endpoints=None,
- username=None, cluster_fsid=None, replication_zone_name=None,
- cluster_details=None, selectedRealmName=None):
+ zonegroup_endpoints=None, zone_name=None, tier_type=None,
+ zone_endpoints=None, username=None, cluster_fsid=None,
+ replication_zone_name=None, cluster_details=None,
+ selectedRealmName=None):
multisite_instance = RgwMultisiteAutomation()
result = multisite_instance.setup_multisite_replication(realm_name, zonegroup_name,
zonegroup_endpoints, zone_name,
- zone_endpoints, username,
- cluster_fsid,
+ tier_type, zone_endpoints,
+ username, cluster_fsid,
replication_zone_name,
cluster_details,
selectedRealmName)
@allow_empty_body
# pylint: disable=W0613
def create(self, zone_name, zonegroup_name=None, default=False, master=False,
- zone_endpoints=None, access_key=None, secret_key=None):
+ zone_endpoints=None, access_key=None, secret_key=None, tier_type=''):
multisite_instance = RgwMultisite()
result = multisite_instance.create_zone(zone_name, zonegroup_name, default,
master, zone_endpoints, access_key,
- secret_key)
+ secret_key, tier_type)
return result
@allow_empty_body
master: str = '', zone_endpoints: str = '', access_key: str = '', secret_key: str = '',
placement_target: str = '', data_pool: str = '', index_pool: str = '',
data_extra_pool: str = '', storage_class: str = '', data_pool_class: str = '',
- compression: str = ''):
+ compression: str = '', tier_type: str = ''):
multisite_instance = RgwMultisite()
result = multisite_instance.edit_zone(zone_name, new_zone_name, zonegroup_name, default,
master, zone_endpoints, access_key, secret_key,
placement_target, data_pool, index_pool,
data_extra_pool, storage_class, data_pool_class,
- compression)
+ compression, tier_type)
return result
@Endpoint()
realm_id: string;
notif_pool: string;
endpoints: string;
+ tier_type: string;
}
export class SystemKey {
</span>
<cds-tag class="tag-success me-2"
*ngIf="node?.data?.is_default">
- default
- </cds-tag>
+ default
+ </cds-tag>
<cds-tag class="tag-warning me-2"
*ngIf="node?.data?.is_master"> master </cds-tag>
<cds-tag class="tag-warning me-2"
*ngIf="node?.data?.secondary_zone">
- secondary-zone
- </cds-tag>
+ secondary-zone
+ </cds-tag>
+ <cds-tag class="tag-info me-2"
+ *ngIf="node?.data?.tier_type === 'archive'">
+ archive
+ </cds-tag>
</div>
<div class="btn-group align-inline-btns"
[ngStyle]="{'visibility': activeNodeId === node?.data?.id ? 'visible' : 'hidden'}"
i18n>The chosen zone name is already in use.</span>
</div>
</div>
+ <div class="form-group row">
+ <div class="cd-col-form-offset">
+ <input type="checkbox"
+ formControlName="archive_zone"
+ id="archive_zone">
+ <label for="archive_zone"
+ class="custom-control-label cds-ml-3"
+ i18n>Archive</label>
+ <cd-help-text>
+ <span i18n>Enable archival storage to keep all object versions and protect data from deletion or corruption.</span>
+ </cd-help-text>
+ </div>
+ </div>
<div class="form-group row">
<label class="cd-col-form-label required"
for="zone_endpoints"
})
]
}),
+ archive_zone: new UntypedFormControl(false),
zone_endpoints: new UntypedFormControl(null, {
validators: [CdValidators.url, Validators.required]
}),
this.zone = new RgwZone();
this.zone.name = values['zoneName'];
this.zone.endpoints = values['zone_endpoints'];
+ this.zone.tier_type = values['archive_zone'] ? 'archive' : '';
this.rgwMultisiteService
.migrate(this.realm, this.zonegroup, this.zone, values['username'])
.subscribe(
i18n>This zone name is already in use. Choose a unique name.</span>
</div>
</div>
+ <div class="form-group row">
+ <div class="cd-col-form-offset">
+ <input type="checkbox"
+ formControlName="archive_zone"
+ id="archive_zone">
+ <label for="archive_zone"
+ class="custom-control-label cds-ml-3"
+ i18n>Archive</label>
+ <cd-help-text>
+ <span i18n>Enable archival storage to keep all object versions and protect data from deletion or corruption.</span>
+ </cd-help-text>
+ </div>
+ </div>
<div class="form-group row">
<label class="cd-col-form-label required"
for="zone_endpoints"
</div>
</ng-container>
<ng-container *ngSwitchCase="2">
- <div *ngIf="multisiteSetupForm.get('configType').value === 'newRealm'"
+ <div *ngIf="multisiteSetupForm.get('configType').value === 'newRealm' && !isMultiClusterConfigured"
class="ms-5">
- <ng-container *ngIf="isMultiClusterConfigured; else newRealmReviewTemplate">
- <ng-container *ngTemplateOutlet="replicationTemplate"></ng-container>
+ <ng-container *ngIf="loading; else nonMultiClusterFinal">
+ <ng-container *ngTemplateOutlet="progressTemplate"></ng-container>
</ng-container>
</div>
+ <ng-template #nonMultiClusterFinal>
+ <ng-container *ngIf="!setupCompleted; else exportTokenTemplate">
+ <ng-container *ngTemplateOutlet="reviewTemplate"></ng-container>
+ </ng-container>
+ </ng-template>
+ <div *ngIf="multisiteSetupForm.get('configType').value === 'newRealm' && isMultiClusterConfigured"
+ class="ms-5">
+ <ng-container *ngTemplateOutlet="replicationTemplate"></ng-container>
+ </div>
<div *ngIf="multisiteSetupForm.get('configType').value === 'existingRealm' && isMultiClusterConfigured"
class="ms-5">
<ng-container *ngIf="!loading; else loadingTemplate">
</ng-container>
</div>
</ng-container>
- <ng-template #newRealmReviewTemplate>
- <ng-container *ngTemplateOutlet="reviewTemplate"></ng-container>
- </ng-template>
<ng-template #replicationTemplate>
<div class="form-group row">
<label class="cd-col-form-label required"
zoneName: new UntypedFormControl('default_zone', {
validators: [Validators.required]
}),
+ archive_zone: new UntypedFormControl(false, {}),
zone_endpoints: new UntypedFormControl(null, {
validators: [Validators.required]
}),
const zoneName = values['zoneName'];
const zoneEndpoints = this.rgwEndpoints.value.join(',');
const username = values['username'];
-
+ const tierType = values['archive_zone'] ? 'archive' : '';
if (!this.isMultiClusterConfigured || this.stepsToSkip['Select Cluster']) {
this.rgwMultisiteService
.setUpMultisiteReplication(
zonegroupName,
zonegroupEndpoints,
zoneName,
+ tierType,
zoneEndpoints,
username
)
zonegroupName,
zonegroupEndpoints,
zoneName,
+ tierType,
zoneEndpoints,
username,
cluster,
</cd-help-text>
</cds-checkbox>
</div>
+ <div class="form-item">
+ <cds-checkbox
+ id="archive_zone"
+ formControlName="archive_zone"
+ cdOptionalField="Archive"
+ i18n
+ >Archive
+ <cd-help-text>
+ <span
+ >Enable archival storage to keep all object versions and protect data from deletion or corruption.</span
+ >
+ </cd-help-text>
+ </cds-checkbox>
+ </div>
<div class="form-item">
<cds-text-label
i18n
is_master: true,
endpoints: ['http://192.168.100.100:80'],
access_key: 'zxcftyuuhgg',
- secret_key: 'Qwsdcfgghuiioklpoozsd'
+ secret_key: 'Qwsdcfgghuiioklpoozsd',
+ info: {
+ tier_type: 'archive'
+ }
}
};
}),
default_zone: new UntypedFormControl(false),
master_zone: new UntypedFormControl(false),
+ archive_zone: new UntypedFormControl(false),
selectedZonegroup: new UntypedFormControl(null),
zone_endpoints: new UntypedFormControl(null, {
validators: [CdValidators.url, Validators.required]
this.multisiteZoneForm.get('zone_endpoints').setValue(this.info.data.endpoints.toString());
this.multisiteZoneForm.get('access_key').setValue(this.info.data.access_key);
this.multisiteZoneForm.get('secret_key').setValue(this.info.data.secret_key);
+ this.multisiteZoneForm
+ .get('archive_zone')
+ .setValue(this.info.data.info.tier_type === 'archive');
this.multisiteZoneForm
.get('placementTarget')
.setValue((this.info.data?.parentNode || this.info.parent.data)?.default_placement);
this.zone.system_key = new SystemKey();
this.zone.system_key.access_key = values['access_key'];
this.zone.system_key.secret_key = values['secret_key'];
+ this.zone.tier_type = values['archive_zone'] ? 'archive' : '';
this.rgwZoneService
.create(
this.zone,
this.zone.system_key = new SystemKey();
this.zone.system_key.access_key = values['access_key'];
this.zone.system_key.secret_key = values['secret_key'];
+ this.zone.tier_type = values['archive_zone'] ? 'archive' : '';
this.rgwZoneService
.update(
this.zone,
zone_name: zone.name,
zonegroup_endpoints: zonegroup.endpoints,
zone_endpoints: zone.endpoints,
- username: username
+ username: username,
+ tier_type: zone.tier_type
});
return this.http.put(`${this.uiUrl}/migrate`, null, { params: params });
});
zonegroupName: string,
zonegroupEndpoints: string,
zoneName: string,
+ tierType: string,
zoneEndpoints: string,
username: string,
cluster?: string,
.set('zonegroup_name', zonegroupName)
.set('zonegroup_endpoints', zonegroupEndpoints)
.set('zone_name', zoneName)
+ .set('tier_type', tierType)
.set('zone_endpoints', zoneEndpoints)
.set('username', username);
master: master,
zone_endpoints: endpoints,
access_key: zone.system_key.access_key,
- secret_key: zone.system_key.secret_key
+ secret_key: zone.system_key.secret_key,
+ tier_type: zone.tier_type
});
return this.http.post(`${this.url}`, null, { params: params });
}
data_extra_pool: dataExtraPool,
storage_class: storageClass,
data_pool_class: dataPoolClass,
- compression: compression
+ compression: compression,
+ tier_type: zone.tier_type
};
return this.http.put(`${this.url}/${zone.name}`, requestBody);
}
nodes['is_default'] = zone.id === defaultZoneId ? true : false;
nodes['endpoints'] = zone.endpoints;
nodes['is_master'] = zonegroup && zonegroup.master_zone === zone.id ? true : false;
+ nodes['tier_type'] = zonegroup?.zones?.find((z) => z.name === zone.name)?.tier_type || '';
nodes['type'] = 'zone';
const zoneNames = zones.map((zone: RgwZone) => {
return zone['name'];
type: boolean
secret_key:
type: string
+ tier_type:
+ default: ''
+ type: string
zone_endpoints:
type: string
zone_name:
storage_class:
default: ''
type: string
+ tier_type:
+ default: ''
+ type: string
zone_endpoints:
default: ''
type: string
def setup_multisite_replication(self, realm_name: str, zonegroup_name: str,
zonegroup_endpoints: str, zone_name: str,
- zone_endpoints: str, username: str,
- cluster_fsid: Optional[str] = None,
+ tier_type: str, zone_endpoints: str,
+ username: str, cluster_fsid: Optional[str] = None,
replication_zone_name: Optional[str] = None,
cluster_details: Optional[str] = None,
selectedRealmName: Optional[str] = None):
if not selectedRealmName:
self.create_realm_and_zonegroup(
realm_name, zonegroup_name, zone_name, zonegroup_ip_url, username)
- self.create_zone_and_user(zone_name, zonegroup_name, username, zone_ip_url)
+ self.create_zone_and_user(zone_name, tier_type, zonegroup_name, username,
+ zone_ip_url)
self.restart_daemons()
return self.export_and_import_realm(
self.update_progress("Failed to create realm or zonegroup", 'fail', str(e))
raise
- def create_zone_and_user(self, zone: str, zg: str, username: str, zone_url: str):
+ def create_zone_and_user(self, zone: str, tier_type: str, zg: str, username: str,
+ zone_url: str):
try:
rgw_multisite_instance = RgwMultisite()
if rgw_multisite_instance.create_zone(zone_name=zone, zonegroup_name=zg, default=True,
master=True, endpoints=zone_url,
- access_key=None, secret_key=None):
+ access_key=None, secret_key=None,
+ tier_type=tier_type):
self.progress_done += 1
user_details = rgw_multisite_instance.create_system_user(username, zone)
keys = user_details.get('keys', [{}])[0]
rgw_multisite_instance.modify_zone(
zone_name=zone, zonegroup_name=zg, default='true',
master='true', endpoints=zone_url, access_key=access_key,
- secret_key=secret_key)
+ secret_key=secret_key, tier_type=tier_type)
else:
raise DashboardException("Access key or secret key is missing",
component='rgw', http_status_code=500)
class RgwMultisite:
def migrate_to_multisite(self, realm_name: str, zonegroup_name: str, zone_name: str,
- zonegroup_endpoints: str, zone_endpoints: str, username: str):
+ zonegroup_endpoints: str, zone_endpoints: str, username: str,
+ tier_type: str):
rgw_realm_create_cmd = ['realm', 'create', '--rgw-realm', realm_name, '--default']
try:
exit_code, _, err = mgr.send_rgwadmin_command(rgw_realm_create_cmd, False)
default='true', master='true',
endpoints=zone_endpoints,
access_key=keys['access_key'],
- secret_key=keys['secret_key'])
+ secret_key=keys['secret_key'],
+ tier_type=tier_type)
else:
raise DashboardException(msg='Access key or secret key is missing',
http_status_code=500, component='rgw')
raise DashboardException(error, http_status_code=500, component='rgw')
def create_zone(self, zone_name, zonegroup_name, default, master, endpoints, access_key,
- secret_key):
+ secret_key, tier_type):
rgw_zone_create_cmd = ['zone', 'create']
cmd_create_zone_options = ['--rgw-zone', zone_name]
if zonegroup_name != 'null':
if secret_key is not None:
cmd_create_zone_options.append('--secret')
cmd_create_zone_options.append(secret_key)
+ if tier_type:
+ cmd_create_zone_options.append('--tier-type')
+ cmd_create_zone_options.append(tier_type)
rgw_zone_create_cmd += cmd_create_zone_options
try:
exit_code, out, err = mgr.send_rgwadmin_command(rgw_zone_create_cmd)
return '', ''
def modify_zone(self, zone_name: str, zonegroup_name: str, default: str, master: str,
- endpoints: str, access_key: str, secret_key: str):
+ endpoints: str, access_key: str, secret_key: str, tier_type: str):
rgw_zone_modify_cmd = ['zone', 'modify', '--rgw-zonegroup',
zonegroup_name, '--rgw-zone', zone_name]
if endpoints:
if secret_key is not None:
rgw_zone_modify_cmd.append('--secret')
rgw_zone_modify_cmd.append(secret_key)
+ if tier_type is not None:
+ rgw_zone_modify_cmd.append('--tier-type')
+ rgw_zone_modify_cmd.append(tier_type)
try:
exit_code, _, err = mgr.send_rgwadmin_command(rgw_zone_modify_cmd)
if exit_code > 0:
master: str = '', endpoints: str = '', access_key: str = '', secret_key: str = '',
placement_target: str = '', data_pool: str = '', index_pool: str = '',
data_extra_pool: str = '', storage_class: str = '', data_pool_class: str = '',
- compression: str = ''):
+ compression: str = '', tier_type: str = ''):
if new_zone_name != zone_name:
rgw_zone_rename_cmd = ['zone', 'rename', '--rgw-zone',
zone_name, '--zone-new-name', new_zone_name]
raise DashboardException(error, http_status_code=500, component='rgw')
self.update_period()
self.modify_zone(new_zone_name, zonegroup_name, default, master, endpoints, access_key,
- secret_key)
+ secret_key, tier_type)
if placement_target:
self.add_placement_targets_storage_class_zone(