]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: Allow create and edit of pools with "/" in the name
authorTiago Melo <tmelo@suse.com>
Wed, 13 Feb 2019 15:31:27 +0000 (15:31 +0000)
committerTiago Melo <tmelo@suse.com>
Tue, 19 Feb 2019 21:17:56 +0000 (21:17 +0000)
Fixes: http://tracker.ceph.com/issues/38302
Signed-off-by: Tiago Melo <tmelo@suse.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/pool.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/components/select-badges/select-badges.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/components/select-badges/select-badges.component.ts
src/pybind/mgr/dashboard/frontend/src/locale/messages.xlf

index 3493b3d9a29a16bf2fb7f25ad1d30598082dd5bd..ba85d2a000e15027e8468e89433814248142bd5d 100644 (file)
                                 [messages]="data.applications.messages"
                                 [data]="data.applications.selected"
                                 [options]="data.applications.available"
-                                [selectionLimit]="4">
+                                [selectionLimit]="4"
+                                (selection)="appSelection()">
               </cd-select-badges>
             </span>
           </div>
                                      (changes)="currentConfigurationValues = $event()">
           </cd-rbd-configuration-form>
         </div>
+
+        <div class="form-group has-error">
+          <div class="col-sm-offset-3 col-sm-9"
+               *ngIf="form.hasError('rbdPool')">
+            <br>
+            <span class="help-block"
+                  i18n>It's not possible to create an RBD pool with '/' in the name.</span>
+            <span class="help-block"
+                  i18n>Please change the name or remove 'rbd' from the applications list.</span>
+          </div>
+        </div>
       </div>
       <div class="panel-footer">
         <div class="button-group text-right">
index eab7387b9963e8c69a84ba755d7f098f043663de..2c861cb26062adcbaf46cea13843738e0e4cd1c5 100644 (file)
@@ -228,6 +228,7 @@ describe('PoolFormComponent', () => {
       expect(component.editing).toBeFalsy();
       formHelper.expectError('name', 'required');
       formHelper.expectValidChange('name', 'some-name');
+      formHelper.expectValidChange('name', 'name/with/slash');
       component.info.pool_names.push('someExistingPoolName');
       formHelper.expectErrorChange('name', 'someExistingPoolName', 'uniqueName');
       formHelper.expectErrorChange('name', 'wrong format with spaces', 'pattern');
index 7e2bf84106bd0cb9d85dd6dc2a0078ff94341690..0353855cab62b74d5773a0eb9da6e4a39119cd0a 100644 (file)
@@ -109,7 +109,7 @@ export class PoolFormComponent implements OnInit {
     this.form = new CdFormGroup(
       {
         name: new FormControl('', {
-          validators: [Validators.pattern('[\\.A-Za-z0-9_-]+'), Validators.required]
+          validators: [Validators.pattern(/^[\.A-Za-z0-9_/-]+$/), Validators.required]
         }),
         poolType: new FormControl('', {
           validators: [Validators.required]
@@ -132,7 +132,17 @@ export class PoolFormComponent implements OnInit {
         ecOverwrites: new FormControl(false),
         compression: compressionForm
       },
-      CdValidators.custom('form', () => null)
+      [
+        CdValidators.custom('form', () => null),
+        CdValidators.custom('rbdPool', () => {
+          return (
+            this.form &&
+            this.form.getValue('name').includes('/') &&
+            this.data &&
+            this.data.applications.selected.indexOf('rbd') !== -1
+          );
+        })
+      ]
     );
   }
 
@@ -660,4 +670,8 @@ export class PoolFormComponent implements OnInit {
         () => this.router.navigate(['/pool'])
       );
   }
+
+  appSelection() {
+    this.form.updateValueAndValidity({ emitEvent: false, onlySelf: true });
+  }
 }
index fc1bbb0e5f89c345c37a46bd0644b7d9d5cb910d..9ddc9a8391aa7c0c02c951e749a317569432e765 100644 (file)
@@ -68,7 +68,7 @@ export class PoolListComponent implements OnInit {
       {
         permission: 'update',
         icon: 'fa-pencil',
-        routerLink: () => '/pool/edit/' + this.selection.first().pool_name,
+        routerLink: () => '/pool/edit/' + encodeURIComponent(this.selection.first().pool_name),
         name: this.i18n('Edit')
       },
       {
index 0b70dbda73a997bf99eb665186803de9bbc3aed5..8d81b3167afbc3c3bac1a6f47d60e01ee2b0eeb1 100644 (file)
@@ -31,7 +31,9 @@ export class PoolService {
       name = pool.pool;
       delete pool.pool;
     }
-    return this.http.put(`${this.apiPath}/${name}`, pool, { observe: 'response' });
+    return this.http.put(`${this.apiPath}/${encodeURIComponent(name)}`, pool, {
+      observe: 'response'
+    });
   }
 
   delete(name) {
index 8d65bda260e03f2752c6d93a1a3ea952657194c7..d7f5517955de3e3e052a6deb51fad870234c40c0 100644 (file)
@@ -5,7 +5,8 @@
            [selectionLimit]="selectionLimit"
            [customBadges]="customBadges"
            [customBadgeValidators]="customBadgeValidators"
-           elemClass="margin-right-sm select-menu-edit">
+           elemClass="margin-right-sm select-menu-edit"
+           (selection)="selection.emit($event)">
   <i class="fa fa-fw fa-pencil"></i>
 </cd-select>
 
index ee364092a203ce336f4ac8ca4b96d82e1cc5cbb8..c275095eaec315133e4fa0aa1b6f7a1bc01ebdfb 100644 (file)
@@ -1,4 +1,4 @@
-import { Component, Input, ViewChild } from '@angular/core';
+import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
 import { ValidatorFn } from '@angular/forms';
 
 import { I18n } from '@ngx-translate/i18n-polyfill';
@@ -26,6 +26,9 @@ export class SelectBadgesComponent {
   @Input()
   customBadgeValidators: ValidatorFn[] = [];
 
+  @Output()
+  selection = new EventEmitter();
+
   @ViewChild('cdSelect')
   cdSelect;
 
index ac024409677d1cf8fa649daab728e9ec95e19969..d4e6329740ced9a56bca3a54692aa9851d470ab0 100644 (file)
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">449</context>
+          <context context-type="linenumber">461</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">342</context>
+          <context context-type="linenumber">343</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html</context>
         <source>Compression</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">309</context>
+          <context context-type="linenumber">310</context>
         </context-group>
       </trans-unit><trans-unit id="37e10df2d9c0c25ef04ac112c9c9a7723e8efae0" datatype="html">
         <source>Mode</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">315</context>
+          <context context-type="linenumber">316</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/block/mirroring/pool-edit-mode-modal/pool-edit-mode-modal.component.html</context>
         <source>Algorithm</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">334</context>
+          <context context-type="linenumber">335</context>
         </context-group>
       </trans-unit><trans-unit id="4903231d42089325a28892c0fde1aed46b733ae6" datatype="html">
         <source>-- No erasure compression algorithm available --</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">345</context>
+          <context context-type="linenumber">346</context>
         </context-group>
       </trans-unit><trans-unit id="5d68ddb254275f8f44221e9ad6d8ceeb59ca46a6" datatype="html">
         <source>Minimum blob size</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">359</context>
+          <context context-type="linenumber">360</context>
         </context-group>
       </trans-unit><trans-unit id="fb2f176df80647137cbb02bbeb29e5dec707a400" datatype="html">
         <source>e.g., 128KiB</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">368</context>
+          <context context-type="linenumber">369</context>
         </context-group>
       </trans-unit><trans-unit id="1b7f6e53a4521c6eb3ced4c007fdd4cf80bb7707" datatype="html">
         <source>Value should be greater than 0</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">373</context>
+          <context context-type="linenumber">374</context>
         </context-group>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">398</context>
+          <context context-type="linenumber">399</context>
         </context-group>
       </trans-unit><trans-unit id="54be22af9625a595ee5d70917ee1fb116be7c4be" datatype="html">
         <source>Value should be greater than the maximum blob size</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">376</context>
+          <context context-type="linenumber">377</context>
         </context-group>
       </trans-unit><trans-unit id="151efb127a9a4dd25259a0b2055442318a141f5b" datatype="html">
         <source>Maximum blob size</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">385</context>
+          <context context-type="linenumber">386</context>
         </context-group>
       </trans-unit><trans-unit id="0c656f0e346bbadf46eb1a5d20d0307a3bd20ba8" datatype="html">
         <source>e.g., 512KiB</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">393</context>
+          <context context-type="linenumber">394</context>
         </context-group>
       </trans-unit><trans-unit id="0a65a24eee8a026f3b1113fe9e157e9a0dd69486" datatype="html">
         <source>Value should be greater than the minimum blob size</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">401</context>
+          <context context-type="linenumber">402</context>
         </context-group>
       </trans-unit><trans-unit id="261ba09c4a59de83f48f52a23fd328da37e61ff4" datatype="html">
         <source>Ratio</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">410</context>
+          <context context-type="linenumber">411</context>
         </context-group>
       </trans-unit><trans-unit id="c1430457a9c3c66366e51d76bf10396014c576be" datatype="html">
         <source>Compression ratio</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">421</context>
+          <context context-type="linenumber">422</context>
         </context-group>
       </trans-unit><trans-unit id="ae5ce6de352cde949998fb10754459c3a4eb183b" datatype="html">
         <source>Value should be between 0.0 and 1.0</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">424</context>
+          <context context-type="linenumber">425</context>
+        </context-group>
+      </trans-unit><trans-unit id="4b673e771a3f6b056837b22ef19a825386046095" datatype="html">
+        <source>It&apos;s not possible to create an RBD pool with &apos;/&apos; in the name.</source>
+        <context-group purpose="location">
+          <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
+          <context context-type="linenumber">445</context>
+        </context-group>
+      </trans-unit><trans-unit id="a9c02674c6e4936562d1146e1ecf0c4240dfcf96" datatype="html">
+        <source>Please change the name or remove &apos;rbd&apos; from the applications list.</source>
+        <context-group purpose="location">
+          <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
+          <context context-type="linenumber">447</context>
         </context-group>
       </trans-unit><trans-unit id="c6d3131ce5386154504dc91b5ad08855d85881d3" datatype="html">
         <source><x id="ICU" equiv-text="{editing, select, 1 {...} other {...}}"/> pool</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">444</context>
+          <context context-type="linenumber">456</context>
         </context-group>
       </trans-unit><trans-unit id="e2b15aacc2f17a9c3276895eeeaadd342ab26555" datatype="html">
         <source>{VAR_SELECT, select, 1 {Edit} other {Create} }</source>
         <context-group purpose="location">
           <context context-type="sourcefile">app/ceph/pool/pool-form/pool-form.component.html</context>
-          <context context-type="linenumber">444</context>
+          <context context-type="linenumber">456</context>
         </context-group>
       </trans-unit><trans-unit id="1d8a7c8aea58294a3c57c23af0468ddf0ba0c9c7" datatype="html">
         <source>Pools List</source>