diff -Nru ceph-15.2.8/admin/build-doc ceph-15.2.11/admin/build-doc --- ceph-15.2.8/admin/build-doc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/admin/build-doc 2021-04-19 13:47:30.000000000 +0000 @@ -59,7 +59,7 @@ if [ ! -e $vdir ]; then virtualenv --python=python3 $vdir fi -$vdir/bin/pip install --quiet -r $TOPDIR/admin/doc-requirements.txt +$vdir/bin/pip install --use-feature=2020-resolver --quiet -r $TOPDIR/admin/doc-requirements.txt -r $TOPDIR/admin/doc-python-common-requirements.txt install -d -m0755 \ $TOPDIR/build-doc/output/html \ diff -Nru ceph-15.2.8/admin/doc-python-common-requirements.txt ceph-15.2.11/admin/doc-python-common-requirements.txt --- ceph-15.2.8/admin/doc-python-common-requirements.txt 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/admin/doc-python-common-requirements.txt 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,3 @@ +pcpp +Jinja2 +-e../src/python-common diff -Nru ceph-15.2.8/alpine/APKBUILD ceph-15.2.11/alpine/APKBUILD --- ceph-15.2.8/alpine/APKBUILD 2020-12-16 17:34:16.000000000 +0000 +++ ceph-15.2.11/alpine/APKBUILD 2021-04-19 13:50:12.000000000 +0000 @@ -1,7 +1,7 @@ # Contributor: John Coyle # Maintainer: John Coyle pkgname=ceph -pkgver=15.2.8 +pkgver=15.2.11 pkgrel=0 pkgdesc="Ceph is a distributed object store and file system" pkgusers="ceph" @@ -63,7 +63,7 @@ xmlstarlet yasm " -source="ceph-15.2.8.tar.bz2" +source="ceph-15.2.11.tar.bz2" subpackages=" $pkgname-base $pkgname-common @@ -116,7 +116,7 @@ _udevrulesdir=/etc/udev/rules.d _python_sitelib=/usr/lib/python2.7/site-packages -builddir=$srcdir/ceph-15.2.8 +builddir=$srcdir/ceph-15.2.11 build() { export CEPH_BUILD_VIRTUALENV=$builddir diff -Nru ceph-15.2.8/ceph.spec ceph-15.2.11/ceph.spec --- ceph-15.2.8/ceph.spec 2020-12-16 17:34:16.000000000 +0000 +++ ceph-15.2.11/ceph.spec 2021-04-19 13:50:12.000000000 +0000 @@ -98,7 +98,7 @@ # main package definition ################################################################################# Name: ceph -Version: 15.2.8 +Version: 15.2.11 Release: 0%{?dist} %if 0%{?fedora} || 0%{?rhel} Epoch: 2 @@ -114,7 +114,7 @@ Group: System/Filesystems %endif URL: http://ceph.com/ -Source0: %{?_remote_tarball_prefix}ceph-15.2.8.tar.bz2 +Source0: %{?_remote_tarball_prefix}ceph-15.2.11.tar.bz2 %if 0%{?suse_version} # _insert_obs_source_lines_here ExclusiveArch: x86_64 aarch64 ppc64le s390x @@ -414,10 +414,8 @@ %package -n cephadm Summary: Utility to bootstrap Ceph clusters +BuildArch: noarch Requires: lvm2 -%if 0%{?suse_version} -Requires: apparmor-abstractions -%endif Requires: python%{python3_pkgversion} %if 0%{?weak_deps} Recommends: podman @@ -477,8 +475,12 @@ Requires: ceph-base = %{_epoch_prefix}%{version}-%{release} %if 0%{?weak_deps} Recommends: nvme-cli +%if 0%{?suse_version} +Requires: smartmontools +%else Recommends: smartmontools %endif +%endif %description mon ceph-mon is the cluster monitor daemon for the Ceph distributed file system. One or more instances of ceph-mon form a Paxos part-time @@ -757,8 +759,12 @@ Requires: python%{python3_pkgversion}-ceph-common = %{_epoch_prefix}%{version}-%{release} %if 0%{?weak_deps} Recommends: nvme-cli +%if 0%{?suse_version} +Requires: smartmontools +%else Recommends: smartmontools %endif +%endif %description osd ceph-osd is the object storage daemon for the Ceph distributed file system. It is responsible for storing objects on a local file system @@ -1134,7 +1140,7 @@ # common ################################################################################# %prep -%autosetup -p1 -n ceph-15.2.8 +%autosetup -p1 -n ceph-15.2.11 %build # LTO can be enabled as soon as the following GCC bug is fixed: @@ -1309,7 +1315,7 @@ install -m 0644 -D udev/50-rbd.rules %{buildroot}%{_udevrulesdir}/50-rbd.rules # sudoers.d -install -m 0600 -D sudoers.d/ceph-osd-smartctl %{buildroot}%{_sysconfdir}/sudoers.d/ceph-osd-smartctl +install -m 0440 -D sudoers.d/ceph-osd-smartctl %{buildroot}%{_sysconfdir}/sudoers.d/ceph-osd-smartctl %if 0%{?rhel} >= 8 pathfix.py -pni "%{__python3} %{py3_shbang_opts}" %{buildroot}%{_bindir}/* diff -Nru ceph-15.2.8/ceph.spec.in ceph-15.2.11/ceph.spec.in --- ceph-15.2.8/ceph.spec.in 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/ceph.spec.in 2021-04-19 13:47:30.000000000 +0000 @@ -414,10 +414,8 @@ %package -n cephadm Summary: Utility to bootstrap Ceph clusters +BuildArch: noarch Requires: lvm2 -%if 0%{?suse_version} -Requires: apparmor-abstractions -%endif Requires: python%{python3_pkgversion} %if 0%{?weak_deps} Recommends: podman @@ -477,8 +475,12 @@ Requires: ceph-base = %{_epoch_prefix}%{version}-%{release} %if 0%{?weak_deps} Recommends: nvme-cli +%if 0%{?suse_version} +Requires: smartmontools +%else Recommends: smartmontools %endif +%endif %description mon ceph-mon is the cluster monitor daemon for the Ceph distributed file system. One or more instances of ceph-mon form a Paxos part-time @@ -757,8 +759,12 @@ Requires: python%{python3_pkgversion}-ceph-common = %{_epoch_prefix}%{version}-%{release} %if 0%{?weak_deps} Recommends: nvme-cli +%if 0%{?suse_version} +Requires: smartmontools +%else Recommends: smartmontools %endif +%endif %description osd ceph-osd is the object storage daemon for the Ceph distributed file system. It is responsible for storing objects on a local file system @@ -1309,7 +1315,7 @@ install -m 0644 -D udev/50-rbd.rules %{buildroot}%{_udevrulesdir}/50-rbd.rules # sudoers.d -install -m 0600 -D sudoers.d/ceph-osd-smartctl %{buildroot}%{_sysconfdir}/sudoers.d/ceph-osd-smartctl +install -m 0440 -D sudoers.d/ceph-osd-smartctl %{buildroot}%{_sysconfdir}/sudoers.d/ceph-osd-smartctl %if 0%{?rhel} >= 8 pathfix.py -pni "%{__python3} %{py3_shbang_opts}" %{buildroot}%{_bindir}/* diff -Nru ceph-15.2.8/cmake/modules/CephChecks.cmake ceph-15.2.11/cmake/modules/CephChecks.cmake --- ceph-15.2.8/cmake/modules/CephChecks.cmake 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/cmake/modules/CephChecks.cmake 2021-04-19 13:47:30.000000000 +0000 @@ -24,6 +24,7 @@ check_function_exists(name_to_handle_at HAVE_NAME_TO_HANDLE_AT) check_function_exists(pipe2 HAVE_PIPE2) check_function_exists(accept4 HAVE_ACCEPT4) +check_function_exists(sigdescr_np HAVE_SIGDESCR_NP) include(CMakePushCheckState) cmake_push_check_state(RESET) diff -Nru ceph-15.2.8/CMakeLists.txt ceph-15.2.11/CMakeLists.txt --- ceph-15.2.8/CMakeLists.txt 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/CMakeLists.txt 2021-04-19 13:47:30.000000000 +0000 @@ -13,7 +13,8 @@ CMP0054 CMP0056 CMP0065 - CMP0075) + CMP0075 + CMP0093) if(POLICY ${policy}) cmake_policy(SET ${policy} NEW) endif() @@ -667,4 +668,4 @@ find_package(CppCheck) find_package(IWYU) -set(VERSION 15.2.8) +set(VERSION 15.2.11) diff -Nru ceph-15.2.8/debian/changelog ceph-15.2.11/debian/changelog --- ceph-15.2.8/debian/changelog 2021-02-04 11:28:51.000000000 +0000 +++ ceph-15.2.11/debian/changelog 2021-04-30 11:13:27.000000000 +0000 @@ -1,3 +1,31 @@ +ceph (15.2.11-0ubuntu0.20.04.2) focal; urgency=medium + + * d/p/bug1914584.patch: Drop as this patch does not fix the actual + issue. + + -- James Page Fri, 30 Apr 2021 12:13:27 +0100 + +ceph (15.2.11-0ubuntu0.20.04.1) focal; urgency=medium + + [ James Page ] + * d/p/bug1917414.patch: Cherry pick fix to isa-l to remove use of + text relocation calls which cause ceph-osd and ceph-mon daemons to + fail to start on aarch64 (LP: #1917414). + + [ Chris MacNaughton ] + * d/p/bug1914584.patch: Improve rgw diagnostic when reusing email + (LP: #1914584). + + [ James Page ] + * SECURITY UPDATE: New upstream stable point release (LP: #1921349): + - CVE-2021-20288 + - d/p/bug1911900-fix-scrub-blocking-balancer.patch: + Drop, included in release. + - d/p/32bit-fixes.patch: Resolve compilation failure on armhf due to + mismatched size_t/uint64_t types. + + -- James Page Fri, 26 Mar 2021 09:42:57 +0000 + ceph (15.2.8-0ubuntu0.20.04.1) focal; urgency=medium [ Chris MacNaughton ] diff -Nru ceph-15.2.8/debian/patches/32bit-fixes.patch ceph-15.2.11/debian/patches/32bit-fixes.patch --- ceph-15.2.8/debian/patches/32bit-fixes.patch 2021-02-04 11:28:40.000000000 +0000 +++ ceph-15.2.11/debian/patches/32bit-fixes.patch 2021-04-30 11:13:27.000000000 +0000 @@ -4,7 +4,7 @@ --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc -@@ -501,7 +501,8 @@ void PurgeQueue::_execute_item( +@@ -503,7 +503,8 @@ void PurgeQueue::_execute_item( in_flight[expire_to] = item; logger->set(l_pq_executing, in_flight.size()); @@ -14,7 +14,7 @@ logger->set(l_pq_executing_high_water, files_high_water); auto ops = _calculate_ops(item); ops_in_flight += ops; -@@ -579,7 +580,8 @@ void PurgeQueue::_execute_item( +@@ -581,7 +582,8 @@ void PurgeQueue::_execute_item( logger->set(l_pq_executing_ops_high_water, ops_high_water); in_flight.erase(expire_to); logger->set(l_pq_executing, in_flight.size()); @@ -24,7 +24,7 @@ logger->set(l_pq_executing_high_water, files_high_water); return; } -@@ -651,7 +653,8 @@ void PurgeQueue::_execute_item_complete( +@@ -659,7 +661,8 @@ void PurgeQueue::_execute_item_complete( in_flight.erase(iter); logger->set(l_pq_executing, in_flight.size()); @@ -67,3 +67,14 @@ root_obj["syncing_percent"] = static_cast( 100 * m_local_mirror_snap_ns.last_copied_object_number / static_cast(std::max(1U, m_local_object_count))); +--- a/src/librbd/object_map/DiffRequest.cc ++++ b/src/librbd/object_map/DiffRequest.cc +@@ -175,7 +175,7 @@ void DiffRequest::handle_load_object_ + m_object_map.resize(num_objs); + } + +- size_t prev_object_diff_state_size = m_object_diff_state->size(); ++ uint64_t prev_object_diff_state_size = m_object_diff_state->size(); + if (prev_object_diff_state_size < num_objs) { + // the diff state should be the largest of all snapshots in the set + m_object_diff_state->resize(num_objs); diff -Nru ceph-15.2.8/debian/patches/bug1911900-fix-scrub-blocking-balancer.patch ceph-15.2.11/debian/patches/bug1911900-fix-scrub-blocking-balancer.patch --- ceph-15.2.8/debian/patches/bug1911900-fix-scrub-blocking-balancer.patch 2021-02-04 11:16:19.000000000 +0000 +++ ceph-15.2.11/debian/patches/bug1911900-fix-scrub-blocking-balancer.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -Description: prevent scrub from stopping balancer - When an active scrub is in progress, it stops/pauses any - balancing activity done via balancer module. This was a - bug introduced balancer module in Octopus, fixed upstream. -Author: Ponnuvel Palaniyappan -Origin: upstream, https://github.com/ceph/ceph/pull/38337 -Bug: https://tracker.ceph.com/issues/48309 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/ceph/+bug/1911900 ---- -This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ - -Index: ceph-15.2.7/src/pybind/mgr/balancer/module.py -=================================================================== ---- ceph-15.2.7.orig/src/pybind/mgr/balancer/module.py -+++ ceph-15.2.7/src/pybind/mgr/balancer/module.py -@@ -1006,10 +1006,8 @@ class Module(MgrModule): - random.shuffle(adjusted_pools) - pool_dump = osdmap_dump.get('pools', []) - for pool in adjusted_pools: -- num_pg = 0 - for p in pool_dump: - if p['pool_name'] == pool: -- num_pg = p['pg_num'] - pool_id = p['pool'] - break - -@@ -1024,7 +1022,7 @@ class Module(MgrModule): - if s['state_name'] == 'active+clean': - num_pg_active_clean += s['count'] - break -- available = left - (num_pg - num_pg_active_clean) -+ available = min(left, num_pg_active_clean) - did = plan.osdmap.calc_pg_upmaps(inc, max_deviation, available, [pool]) - total_did += did - left -= did diff -Nru ceph-15.2.8/debian/patches/bug1917414.patch ceph-15.2.11/debian/patches/bug1917414.patch --- ceph-15.2.8/debian/patches/bug1917414.patch 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/debian/patches/bug1917414.patch 2021-04-30 11:13:27.000000000 +0000 @@ -0,0 +1,155 @@ +From db463aa139aa0f3eb996062bd7c65f0d10a7932b Mon Sep 17 00:00:00 2001 +From: luo rixin +Date: Fri, 8 Jan 2021 16:16:02 +0800 +Subject: [PATCH] src/isa-l/erasure_code: Fix text relocation on aarch64 + +Here is the bug report on ceph. https://tracker.ceph.com/issues/48681 + +Signed-off-by: luo rixin +--- + src/isa-l/erasure_code/aarch64/gf_2vect_mad_neon.S | 5 +++-- + src/isa-l/erasure_code/aarch64/gf_3vect_mad_neon.S | 5 +++-- + src/isa-l/erasure_code/aarch64/gf_4vect_mad_neon.S | 5 +++-- + src/isa-l/erasure_code/aarch64/gf_5vect_mad_neon.S | 5 +++-- + src/isa-l/erasure_code/aarch64/gf_6vect_mad_neon.S | 5 +++-- + src/isa-l/erasure_code/aarch64/gf_vect_mad_neon.S | 5 +++-- + 6 files changed, 18 insertions(+), 12 deletions(-) + +diff --git a/src/isa-l/erasure_code/aarch64/gf_2vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_2vect_mad_neon.S +index 92c19f5..b8a8cad 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_2vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_2vect_mad_neon.S +@@ -360,7 +360,8 @@ gf_2vect_mad_neon: + sub x_dest1, x_dest1, x_tmp + sub x_dest2, x_dest2, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -394,7 +395,7 @@ gf_2vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 +diff --git a/src/isa-l/erasure_code/aarch64/gf_3vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_3vect_mad_neon.S +index 4a041e0..d9a3ccc 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_3vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_3vect_mad_neon.S +@@ -332,7 +332,8 @@ gf_3vect_mad_neon: + sub x_dest2, x_dest2, x_tmp + sub x_dest3, x_dest3, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -374,7 +375,7 @@ gf_3vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 +diff --git a/src/isa-l/erasure_code/aarch64/gf_4vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_4vect_mad_neon.S +index d56cece..8692437 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_4vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_4vect_mad_neon.S +@@ -397,7 +397,8 @@ gf_4vect_mad_neon: + sub x_dest3, x_dest3, x_tmp + sub x_dest4, x_dest4, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -448,7 +449,7 @@ gf_4vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 +diff --git a/src/isa-l/erasure_code/aarch64/gf_5vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_5vect_mad_neon.S +index 5cbc6bf..f0ff163 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_5vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_5vect_mad_neon.S +@@ -463,7 +463,8 @@ gf_5vect_mad_neon: + sub x_dest4, x_dest4, x_tmp + sub x_dest5, x_dest5, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -527,7 +528,7 @@ gf_5vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 +diff --git a/src/isa-l/erasure_code/aarch64/gf_6vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_6vect_mad_neon.S +index 4886440..7ec2d80 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_6vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_6vect_mad_neon.S +@@ -526,7 +526,8 @@ gf_6vect_mad_neon: + sub x_dest5, x_dest5, x_tmp + sub x_dest6, x_dest6, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -602,7 +603,7 @@ gf_6vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 +diff --git a/src/isa-l/erasure_code/aarch64/gf_vect_mad_neon.S b/src/isa-l/erasure_code/aarch64/gf_vect_mad_neon.S +index 0e25a51..9ebd86b 100644 +--- a/src/isa-l/erasure_code/aarch64/gf_vect_mad_neon.S ++++ b/src/isa-l/erasure_code/aarch64/gf_vect_mad_neon.S +@@ -281,7 +281,8 @@ gf_vect_mad_neon: + mov x_src, x_src_end + sub x_dest1, x_dest1, x_tmp + +- ldr x_const, =const_tbl ++ adrp x_const, const_tbl ++ add x_const, x_const, :lo12:const_tbl + sub x_const, x_const, x_tmp + ldr q_tmp, [x_const, #16] + +@@ -307,7 +308,7 @@ gf_vect_mad_neon: + mov w_ret, #1 + ret + +-.section .data ++.section .rodata + .balign 8 + const_tbl: + .dword 0x0000000000000000, 0x0000000000000000 diff -Nru ceph-15.2.8/debian/patches/series ceph-15.2.11/debian/patches/series --- ceph-15.2.8/debian/patches/series 2021-02-04 11:28:40.000000000 +0000 +++ ceph-15.2.11/debian/patches/series 2021-04-30 11:13:27.000000000 +0000 @@ -9,5 +9,6 @@ fix-bash-completion-location 32bit-fixes.patch riscv64-link-pthread.patch -bug1911900-fix-scrub-blocking-balancer.patch disable-log-slow-requests.patch +# AARCH64 EC regression +bug1917414.patch diff -Nru ceph-15.2.8/doc/cephadm/drivegroups.rst ceph-15.2.11/doc/cephadm/drivegroups.rst --- ceph-15.2.8/doc/cephadm/drivegroups.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephadm/drivegroups.rst 2021-04-19 13:47:30.000000000 +0000 @@ -319,7 +319,7 @@ db_devices: model: MC-55-44-XZ limit: 2 (db_slots is actually to be favoured here, but it's not implemented yet) - + --- service_type: osd service_id: osd_spec_ssd placement: @@ -376,8 +376,7 @@ rotational: 1 db_devices: rotational: 0 - - + --- service_type: osd service_id: osd_spec_six_to_ten placement: diff -Nru ceph-15.2.8/doc/cephadm/index.rst ceph-15.2.11/doc/cephadm/index.rst --- ceph-15.2.8/doc/cephadm/index.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephadm/index.rst 2021-04-19 13:47:30.000000000 +0000 @@ -37,4 +37,5 @@ Client Setup DriveGroups troubleshooting - concepts \ No newline at end of file + concepts + Cephadm Feature Planning <../dev/cephadm/index> \ No newline at end of file diff -Nru ceph-15.2.8/doc/cephadm/monitoring.rst ceph-15.2.11/doc/cephadm/monitoring.rst --- ceph-15.2.8/doc/cephadm/monitoring.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephadm/monitoring.rst 2021-04-19 13:47:30.000000000 +0000 @@ -72,8 +72,20 @@ ceph orch apply grafana 1 -Cephadm handles the prometheus, grafana, and alertmanager -configurations automatically. +Cephadm takes care of the configuration of Prometheus, Grafana, and Alertmanager +automatically. + +However, there is one exception to this rule. In a some setups, the Dashboard +user's browser might not be able to access the Grafana URL configured in Ceph +Dashboard. One such scenario is when the cluster and the accessing user are each +in a different DNS zone. + +For this case, there is an extra configuration option for Ceph Dashboard, which +can be used to configure the URL for accessing Grafana by the user's browser. +This value will never be altered by cephadm. To set this configuration option, +issue the following command:: + + $ ceph dashboard set-grafana-frontend-api-url It may take a minute or two for services to be deployed. Once completed, you should see something like this from ``ceph orch ls`` @@ -88,6 +100,37 @@ node-exporter 2/2 6s ago docker.io/prom/node-exporter:latest e5a616e4b9cf present prometheus 1/1 6s ago docker.io/prom/prometheus:latest e935122ab143 present +Configuring SSL/TLS for Grafana +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``cephadm`` will deploy Grafana using the certificate defined in the ceph +key/value store. If a certificate is not specified, ``cephadm`` will generate a +self-signed certificate during deployment of the Grafana service. + +A custom certificate can be configured using the following commands. + +.. code-block:: bash + + ceph config-key set mgr/cephadm/grafana_key -i $PWD/key.pem + ceph config-key set mgr/cephadm/grafana_crt -i $PWD/certificate.pem + +The ``cephadm`` manager module needs to be restarted to be able to read updates +to these keys. + +.. code-block:: bash + + ceph orch restart mgr + +If you already deployed Grafana, you need to redeploy the service for the +configuration to be updated. + +.. code-block:: bash + + ceph orch redeploy grafana + +The ``redeploy`` command also takes care of setting the right URL for Ceph +Dashboard. + Using custom images ~~~~~~~~~~~~~~~~~~~ @@ -120,7 +163,7 @@ you have set the custom image for automatically. You will need to manually update the configuration (image name and tag) to be able to install updates. - + If you choose to go with the recommendations instead, you can reset the custom image you have set before. After that, the default value will be used again. Use ``ceph config rm`` to reset the configuration option @@ -135,6 +178,86 @@ ceph config rm mgr mgr/cephadm/container_image_prometheus +Using custom configuration files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By overriding cephadm templates, it is possible to completely customize the +configuration files for monitoring services. + +Internally, cephadm already uses `Jinja2 +`_ templates to generate the +configuration files for all monitoring components. To be able to customize the +configuration of Prometheus, Grafana or the Alertmanager it is possible to store +a Jinja2 template for each service that will be used for configuration +generation instead. This template will be evaluated every time a service of that +kind is deployed or reconfigured. That way, the custom configuration is +preserved and automatically applied on future deployments of these services. + +.. note:: + + The configuration of the custom template is also preserved when the default + configuration of cephadm changes. If the updated configuration is to be used, + the custom template needs to be migrated *manually*. + +Option names +"""""""""""" + +The following templates for files that will be generated by cephadm can be +overridden. These are the names to be used when storing with ``ceph config-key +set``: + +- ``alertmanager_alertmanager.yml`` +- ``grafana_ceph-dashboard.yml`` +- ``grafana_grafana.ini`` +- ``prometheus_prometheus.yml`` + +You can look up the file templates that are currently used by cephadm in +``src/pybind/mgr/cephadm/templates``: + +- ``services/alertmanager/alertmanager.yml.j2`` +- ``services/grafana/ceph-dashboard.yml.j2`` +- ``services/grafana/grafana.ini.j2`` +- ``services/prometheus/prometheus.yml.j2`` + +Usage +""""" + +The following command applies a single line value: + +.. code-block:: bash + + ceph config-key set mgr/cephadm/ + +To set contents of files as template use the ``-i`` argument: + +.. code-block:: bash + + ceph config-key set mgr/cephadm/ -i $PWD/ + +.. note:: + + When using files as input to ``config-key`` an absolute path to the file must + be used. + +It is required to restart the cephadm mgr module after a configuration option +has been set. Then the configuration file for the service needs to be recreated. +This is done using `redeploy`. For more details see the following example. + +Example +""""""" + +.. code-block:: bash + + # set the contents of ./prometheus.yml.j2 as template + ceph config-key set mgr/cephadm/services_prometheus_prometheus.yml \ + -i $PWD/prometheus.yml.j2 + + # restart cephadm mgr module + ceph orch restart mgr + + # redeploy the prometheus service + ceph orch redeploy prometheus + Disabling monitoring -------------------- diff -Nru ceph-15.2.8/doc/cephadm/operations.rst ceph-15.2.11/doc/cephadm/operations.rst --- ceph-15.2.8/doc/cephadm/operations.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephadm/operations.rst 2021-04-19 13:47:30.000000000 +0000 @@ -305,3 +305,53 @@ Then, run bootstrap referencing this file:: cephadm bootstrap -c /root/ceph.conf ... + + +.. _cephadm-removing-hosts: + +Removing Hosts +============== + +If the node that want you to remove is running OSDs, make sure you remove the OSDs from the node. + +To remove a host from a cluster, do the following: + +For all Ceph service types, except for ``node-exporter`` and ``crash``, remove +the host from the placement specification file (for example, cluster.yml). +For example, if you are removing the host named host2, remove all occurrences of +``- host2`` from all ``placement:`` sections. + +Update: + +.. code-block:: yaml + + service_type: rgw + placement: + hosts: + - host1 + - host2 + +To: + +.. code-block:: yaml + + + service_type: rgw + placement: + hosts: + - host1 + +Remove the host from cephadm's environment: + +.. code-block:: bash + + ceph orch host rm host2 + +See also :ref:`orchestrator-cli-host-management`. + +If the host is running ``node-exporter`` and crash services, remove them by running +the following command on the host: + +.. code-block:: bash + + cephadm rm-daemon --fsid CLUSTER_ID --name SERVICE_NAME diff -Nru ceph-15.2.8/doc/cephfs/add-remove-mds.rst ceph-15.2.11/doc/cephfs/add-remove-mds.rst --- ceph-15.2.8/doc/cephfs/add-remove-mds.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephfs/add-remove-mds.rst 2021-04-19 13:47:30.000000000 +0000 @@ -28,7 +28,7 @@ MDS necessarily manages a distributed and cooperative metadata cache among all clients and other active MDSs. Therefore it is essential to provide the MDS with sufficient RAM to enable faster metadata access and mutation. The default -MDS cache size (see also :doc:`/cephfs/cache-size-limits`) is 4GB. It is +MDS cache size (see also :doc:`/cephfs/cache-configuration`) is 4GB. It is recommended to provision at least 8GB of RAM for the MDS to support this cache size. diff -Nru ceph-15.2.8/doc/cephfs/cache-configuration.rst ceph-15.2.11/doc/cephfs/cache-configuration.rst --- ceph-15.2.8/doc/cephfs/cache-configuration.rst 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/doc/cephfs/cache-configuration.rst 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,181 @@ +======================= +MDS Cache Configuration +======================= + +The Metadata Server coordinates a distributed cache among all MDS and CephFS +clients. The cache serves to improve metadata access latency and allow clients +to safely (coherently) mutate metadata state (e.g. via `chmod`). The MDS issues +**capabilities** and **directory entry leases** to indicate what state clients +may cache and what manipulations clients may perform (e.g. writing to a file). + +The MDS and clients both try to enforce a cache size. The mechanism for +specifying the MDS cache size is described below. Note that the MDS cache size +is a not a hard limit. The MDS always allows clients to lookup new metadata +which is loaded into the cache. This is an essential policy as its avoids +deadlock in client requests (some requests may rely on held capabilities before +capabilities are released). + +When the MDS cache is too large, the MDS will **recall** client state so cache +items become unpinned and eligble to be dropped. The MDS can only drop cache +state when no clients refer to the metadata to be dropped. Also described below +is how to configure the MDS recall settings for your workload's needs. This is +necessary if the internal throttles on the MDS recall can not keep up with the +client workload. + + +MDS Cache Size +-------------- + +You can limit the size of the Metadata Server (MDS) cache by a byte count. This +is done through the `mds_cache_memory_limit` configuration. For example:: + + ceph config set mds mds_cache_memory_limit 8GB + +In addition, you can specify a cache reservation by using the +`mds_cache_reservation` parameter for MDS operations. The cache reservation is +limited as a percentage of the memory and is set to 5% by default. The intent +of this parameter is to have the MDS maintain an extra reserve of memory for +its cache for new metadata operations to use. As a consequence, the MDS should +in general operate below its memory limit because it will recall old state from +clients in order to drop unused metadata in its cache. + +If the MDS cannot keep its cache under the target size, the MDS will send a +health alert to the Monitors indicating the cache is too large. This is +controlled by the `mds_health_cache_threshold` configuration which is by +default 150% of the maximum cache size. + +Because the cache limit is not a hard limit, potential bugs in the CephFS +client, MDS, or misbehaving applications might cause the MDS to exceed its +cache size. The health warnings are intended to help the operator detect this +situation and make necessary adjustments or investigate buggy clients. + +MDS Cache Trimming +------------------ + +There are two configurations for throttling the rate of cache trimming in the MDS: + +:: + + mds_cache_trim_threshold (default 64k) + + +and + +:: + + mds_cache_trim_decay_rate (default 1) + + +The intent of the throttle is to prevent the MDS from spending too much time +trimming its cache. This may limit its ability to handle client requests or +perform other upkeep. + +The trim configurations control an internal **decay counter**. Anytime metadata +is trimmed from the cache, the counter is incremented. The threshold sets the +maximum size of the counter while the decay rate indicates the exponential half +life for the counter. If the MDS is continually removing items from its cache, +it will reach a steady state of ``-ln(0.5)/rate*threshold`` items removed per +second. + +The defaults are conservative and may need changed for production MDS with +large cache sizes. + + +MDS Recall +---------- + +MDS limits its recall of client state (capabilities/leases) to prevent creating +too much work for itself handling release messages from clients. This is controlled +via the following configurations: + + +The maximum number of capabilities to recall from a single client in a given recall +event:: + + mds_recall_max_caps (default: 5000) + +The threshold and decay rate for the decay counter on a session:: + + mds_recall_max_decay_threshold (default: 16k) + +and:: + + mds_recall_max_decay_rate (default: 2.5 seconds) + +The session decay counter controls the rate of recall for an individual +session. The behavior of the counter works the same as for cache trimming +above. Each capability that is recalled increments the counter. + +There is also a global decay counter that throttles for all session recall:: + + mds_recall_global_max_decay_threshold (default: 64k) + +its decay rate is the same as ``mds_recall_max_decay_rate``. Any recalled +capability for any session also increments this counter. + +If clients are slow to release state, the warning "failing to respond to cache +pressure" or ``MDS_HEALTH_CLIENT_RECALL`` will be reported. Each session's rate +of release is monitored by another decay counter configured by:: + + mds_recall_warning_threshold (default: 32k) + +and:: + + mds_recall_warning_decay_rate (default: 60.0 seconds) + +Each time a capability is released, the counter is incremented. If clients do +not release capabilities quickly enough and there is cache pressure, the +counter will indicate if the client is slow to release state. + +Some workloads and client behaviors may require faster recall of client state +to keep up with capability acquisition. It is recommended to increase the above +counters as needed to resolve any slow recall warnings in the cluster health +state. + + +Session Liveness +---------------- + +The MDS also keeps track of whether sessions are quiescent. If a client session +is not utilizing its capabilities or is otherwise quiet, the MDS will begin +recalling state from the session even if its not under cache pressure. This +helps the MDS avoid future work when the cluster workload is hot and cache +pressure is forcing the MDS to recall state. The expectation is that a client +not utilizing its capabilities is unlikely to use those capabilities anytime +in the near future. + +Determining whether a given session is quiescent is controlled by the following +configuration variables:: + + mds_session_cache_liveness_magnitude (default: 10) + +and:: + + mds_session_cache_liveness_decay_rate (default: 5min) + +The configuration ``mds_session_cache_liveness_decay_rate`` indicates the +half-life for the decay counter tracking the use of capabilities by the client. +Each time a client manipulates or acquires a capability, the MDS will increment +the counter. This is a rough but effective way to monitor utilization of the +client cache. + +The ``mds_session_cache_liveness_magnitude`` is a base-2 magnitude difference +of the liveness decay counter and the number of capabilities outstanding for +the session. So if the client has ``1*2^20`` (1M) capabilities outstanding and +only uses **less** than ``1*2^(20-mds_session_cache_liveness_magnitude)`` (1K +using defaults), the MDS will consider the client to be quiescent and begin +recall. + + +Capability Limit +---------------- + +The MDS also tries to prevent a single client from acquiring too many +capabilities. This helps prevent recovery from taking a long time in some +situations. It is not generally necessary for a client to have such a large +cache. The limit is configured via:: + + mds_max_caps_per_client (default: 1M) + +It is not recommended to set this value above 5M but it may be helpful with +some workloads. diff -Nru ceph-15.2.8/doc/cephfs/cache-size-limits.rst ceph-15.2.11/doc/cephfs/cache-size-limits.rst --- ceph-15.2.8/doc/cephfs/cache-size-limits.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephfs/cache-size-limits.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Understanding MDS Cache Size Limits -=================================== - -This section describes ways to limit MDS cache size. - -You can limit the size of the Metadata Server (MDS) cache by: - -* *A memory limit*: A new behavior introduced in the Luminous release. Use the `mds_cache_memory_limit` parameters. - -In addition, you can specify a cache reservation by using the `mds_cache_reservation` parameter for MDS operations. The cache reservation is limited as a percentage of the memory and is set to 5% by default. The intent of this parameter is to have the MDS maintain an extra reserve of memory for its cache for new metadata operations to use. As a consequence, the MDS should in general operate below its memory limit because it will recall old state from clients in order to drop unused metadata in its cache. - -The `mds_cache_reservation` parameter replaces the `mds_health_cache_threshold` in all situations except when MDS nodes sends a health alert to the Monitors indicating the cache is too large. By default, `mds_health_cache_threshold` is 150% of the maximum cache size. - -Be aware that the cache limit is not a hard limit. Potential bugs in the CephFS client or MDS or misbehaving applications might cause the MDS to exceed its cache size. The `mds_health_cache_threshold` configures the cluster health warning message so that operators can investigate why the MDS cannot shrink its cache. diff -Nru ceph-15.2.8/doc/cephfs/fs-volumes.rst ceph-15.2.11/doc/cephfs/fs-volumes.rst --- ceph-15.2.8/doc/cephfs/fs-volumes.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephfs/fs-volumes.rst 2021-04-19 13:47:30.000000000 +0000 @@ -85,7 +85,7 @@ Create a subvolume group using:: - $ ceph fs subvolumegroup create [--pool_layout --uid --gid --mode ] + $ ceph fs subvolumegroup create [--pool_layout ] [--uid ] [--gid ] [--mode ] The command succeeds even if the subvolume group already exists. @@ -111,12 +111,8 @@ $ ceph fs subvolumegroup ls -Create a snapshot (see :doc:`/cephfs/experimental-features`) of a -subvolume group using:: - - $ ceph fs subvolumegroup snapshot create - -This implicitly snapshots all the subvolumes under the subvolume group. +.. note:: Subvolume group snapshot feature is no longer supported in mainline CephFS (existing group + snapshots can still be listed and deleted) Remove a snapshot of a subvolume group using:: @@ -135,7 +131,7 @@ Create a subvolume using:: - $ ceph fs subvolume create [--size --group_name --pool_layout --uid --gid --mode --namespace-isolated] + $ ceph fs subvolume create [--size ] [--group_name ] [--pool_layout ] [--uid ] [--gid ] [--mode ] [--namespace-isolated] The command succeeds even if the subvolume already exists. @@ -150,16 +146,24 @@ Remove a subvolume using:: - $ ceph fs subvolume rm [--group_name --force] + $ ceph fs subvolume rm [--group_name ] [--force] [--retain-snapshots] The command removes the subvolume and its contents. It does this in two steps. -First, it move the subvolume to a trash folder, and then asynchronously purges +First, it moves the subvolume to a trash folder, and then asynchronously purges its contents. The removal of a subvolume fails if it has snapshots, or is non-existent. '--force' flag allows the non-existent subvolume remove command to succeed. +A subvolume can be removed retaining existing snapshots of the subvolume using the +'--retain-snapshots' option. If snapshots are retained, the subvolume is considered +empty for all operations not involving the retained snapshots. + +.. note:: Snapshot retained subvolumes can be recreated using 'ceph fs subvolume create' + +.. note:: Retained snapshots can be used as a clone source to recreate the subvolume, or clone to a newer subvolume. + Resize a subvolume using:: $ ceph fs subvolume resize [--group_name ] [--no_shrink] @@ -169,6 +173,24 @@ The subvolume can be resized to an infinite size by passing 'inf' or 'infinite' as the new_size. +Authorize cephx auth IDs, the read/read-write access to fs subvolumes:: + + $ ceph fs subvolume authorize [--group_name=] [--access_level=] + +The 'access_level' takes 'r' or 'rw' as value. + +Deauthorize cephx auth IDs, the read/read-write access to fs subvolumes:: + + $ ceph fs subvolume deauthorize [--group_name=] + +List cephx auth IDs authorized to access fs subvolume:: + + $ ceph fs subvolume authorized_list [--group_name=] + +Evict fs clients based on auth ID and subvolume mounted:: + + $ ceph fs subvolume evict [--group_name=] + Fetch the absolute path of a subvolume using:: $ ceph fs subvolume getpath [--group_name ] @@ -195,17 +217,32 @@ * type: subvolume type indicating whether it's clone or subvolume * pool_namespace: RADOS namespace of the subvolume * features: features supported by the subvolume +* state: current state of the subvolume + +If a subvolume has been removed retaining its snapshots, the output only contains fields as follows. + +* type: subvolume type indicating whether it's clone or subvolume +* features: features supported by the subvolume +* state: current state of the subvolume The subvolume "features" are based on the internal version of the subvolume and is a list containing a subset of the following features, * "snapshot-clone": supports cloning using a subvolumes snapshot as the source * "snapshot-autoprotect": supports automatically protecting snapshots, that are active clone sources, from deletion +* "snapshot-retention": supports removing subvolume contents, retaining any existing snapshots + +The subvolume "state" is based on the current state of the subvolume and contains one of the following values. + +* "complete": subvolume is ready for all operations +* "snapshot-retained": subvolume is removed but its snapshots are retained List subvolumes using:: $ ceph fs subvolume ls [--group_name ] +.. note:: subvolumes that are removed but have snapshots retained, are also listed. + Create a snapshot of a subvolume using:: $ ceph fs subvolume snapshot create [--group_name ] @@ -213,11 +250,13 @@ Remove a snapshot of a subvolume using:: - $ ceph fs subvolume snapshot rm [--group_name --force] + $ ceph fs subvolume snapshot rm [--group_name ] [--force] Using the '--force' flag allows the command to succeed that would otherwise fail if the snapshot did not exist. +.. note:: if the last snapshot within a snapshot retained subvolume is removed, the subvolume is also removed + List snapshots of a subvolume using:: $ ceph fs subvolume snapshot ls [--group_name ] diff -Nru ceph-15.2.8/doc/cephfs/index.rst ceph-15.2.11/doc/cephfs/index.rst --- ceph-15.2.8/doc/cephfs/index.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/cephfs/index.rst 2021-04-19 13:47:30.000000000 +0000 @@ -79,7 +79,7 @@ Administrative commands Provision/Add/Remove MDS(s) MDS failover and standby configuration - MDS Cache Size Limits + MDS Cache Configuration MDS Configuration Settings Manual: ceph-mds <../../man/8/ceph-mds> Export over NFS diff -Nru ceph-15.2.8/doc/dev/cephadm/compliance-check.rst ceph-15.2.11/doc/dev/cephadm/compliance-check.rst --- ceph-15.2.8/doc/dev/cephadm/compliance-check.rst 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/doc/dev/cephadm/compliance-check.rst 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,121 @@ +================ +Compliance Check +================ + +The stability and reliability of a Ceph cluster is dependent not just upon the Ceph daemons, but +also the OS and hardware that Ceph is installed on. This document is intended to promote a design +discussion for providing a "compliance" feature within mgr/cephadm, which would be responsible for +identifying common platform-related issues that could impact Ceph stability and operation. + +The ultimate goal of these checks is to identify issues early and raise a healthcheck WARN +event, to alert the Administrator to the issue. + +Prerequisites +============= +In order to effectively analyse the hosts that Ceph is deployed to, this feature requires a cache +of host-related metadata. The metadata is already available from cephadm's HostFacts class and the +``gather-facts`` cephadm command. For the purposes of this document, we will assume that this +data is available within the mgr/cephadm "cache" structure. + +Some checks will require that the host status is also populated e.g. ONLINE, OFFLINE, MAINTENANCE + +Administrator Interaction +========================= +Not all users will require this feature, and must be able to 'opt out'. For this reason, +mgr/cephadm must provide controls, such as the following; + +.. code-block:: + + ceph cephadm compliance enable | disable | status [--format json] + ceph cephadm compliance ls [--format json] + ceph cephadm compliance enable-check + ceph cephadm compliance disable-check + ceph cephadm compliance set-check-interval + ceph cephadm compliance get-check-interval + +The status option would show the enabled/disabled state of the feature, along with the +check-interval. + +The ``ls`` subcommand would show all checks in the following format; + +``check-name status description`` + +Proposed Integration +==================== +The compliance checks are not required to run all the time, but instead should run at discrete +intervals. The interval would be configurable under via the :code:`set-check-interval` +subcommand (default would be every 12 hours) + + +mgr/cephadm currently executes an event driven (time based) serve loop to act on deploy/remove and +reconcile activity. In order to execute the compliance checks, the compliance check code would be +called from this main serve loop - when the :code:`set-check-interval` is met. + + +Proposed Checks +=============== +All checks would push any errors to a list, so multiple issues can be escalated to the Admin at +the same time. The list below provides a description of each check, with the text following the +name indicating a shortname version *(the shortname is the reference for command Interaction +when enabling or disabling a check)* + + +OS Consistency (OS) +___________________ +* all hosts must use same vendor +* all hosts must be on the same major release (this check would only be applicable to distributions that + offer a long-term-support strategy (RHEL, CentOS, SLES, Ubuntu etc) + + +*src: gather-facts output* + +Linux Kernel Security Mode (LSM) +________________________________ +* All hosts should have a consistent SELINUX/AppArmor configuration + +*src: gather-facts output* + +Services Check (SERVICES) +_________________________ +Hosts that are in an ONLINE state should adhere to the following; + +* all daemons (systemd units) should be enabled +* all daemons should be running (not dead) + +*src: list_daemons output* + +Support Status (SUPPORT) +________________________ +If support status has been detected, it should be consistent across all hosts. At this point +support status is available only for Red Hat machines. + +*src: gather-facts output* + +Network : MTU (MTU) +________________________________ +All network interfaces on the same Ceph network (public/cluster) should have the same MTU + +*src: gather-facts output* + +Network : LinkSpeed (LINKSPEED) +____________________________________________ +All network interfaces on the same Ceph network (public/cluster) should have the same Linkspeed + +*src: gather-facts output* + +Network : Consistency (INTERFACE) +______________________________________________ +All hosts with OSDs should have consistent network configuration - eg. if some hosts do +not separate cluster/public traffic but others do, that is an anomaly that would generate a +compliance check warning. + +*src: gather-facts output* + +Notification Strategy +===================== +If any of the checks fail, mgr/cephadm would raise a WARN level alert + +Futures +======= +The checks highlighted here serve only as a starting point, and we should expect to expand +on the checks over time. diff -Nru ceph-15.2.8/doc/dev/cephadm/host-maintenance.rst ceph-15.2.11/doc/dev/cephadm/host-maintenance.rst --- ceph-15.2.8/doc/dev/cephadm/host-maintenance.rst 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/doc/dev/cephadm/host-maintenance.rst 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,104 @@ +================ +Host Maintenance +================ + +All hosts that support Ceph daemons need to support maintenance activity, whether the host +is physical or virtual. This means that management workflows should provide +a simple and consistent way to support this operational requirement. This document defines +the maintenance strategy that could be implemented in cephadm and mgr/cephadm. + + +High Level Design +================= +Placing a host into maintenance, adopts the following workflow; + +#. confirm that the removal of the host does not impact data availability (the following + steps will assume it is safe to proceed) + + * orch host ok-to-stop would be used here + +#. if the host has osd daemons, apply noout to the host subtree to prevent data migration + from triggering during the planned maintenance slot. +#. Stop the ceph target (all daemons stop) +#. Disable the ceph target on that host, to prevent a reboot from automatically starting + ceph services again) + + +Exiting Maintenance, is basically the reverse of the above sequence + +Admin Interaction +================= +The ceph orch command will be extended to support maintenance. + +.. code-block:: + + ceph orch host enter-maintenance [ --check ] + ceph orch host exit-maintenance + +.. note:: In addition, the host's status should be updated to reflect whether it + is in maintenance or not. + +The 'check' Option +__________________ +The orch host ok-to-stop command focuses on ceph daemons (mon, osd, mds), which +provides the first check. However, a ceph cluster also uses other types of daemons +for monitoring, management and non-native protocol support which means the +logic will need to consider service impact too. The 'check' option provides +this additional layer to alert the user of service impact to *secondary* +daemons. + +The list below shows some of these additional daemons. + +* mgr (not included in ok-to-stop checks) +* prometheus, grafana, alertmanager +* rgw +* haproxy +* iscsi gateways +* ganesha gateways + +By using the --check option first, the Admin can choose whether to proceed. This +workflow is obviously optional for the CLI user, but could be integrated into the +UI workflow to help less experienced Administators manage the cluster. + +By adopting this two-phase approach, a UI based workflow would look something +like this. + +#. User selects a host to place into maintenance + + * orchestrator checks for data **and** service impact +#. If potential impact is shown, the next steps depend on the impact type + + * **data availability** : maintenance is denied, informing the user of the issue + * **service availability** : user is provided a list of affected services and + asked to confirm + + +Components Impacted +=================== +Implementing this capability will require changes to the following; + +* cephadm + + * Add maintenance subcommand with the following 'verbs'; enter, exit, check + +* mgr/cephadm + + * add methods to CephadmOrchestrator for enter/exit and check + * data gathering would be skipped for hosts in a maintenance state + +* mgr/orchestrator + + * add CLI commands to OrchestratorCli which expose the enter/exit and check interaction + + +Ideas for Future Work +===================== +#. When a host is placed into maintenance, the time of the event could be persisted. This + would allow the orchestrator layer to establish a maintenance window for the task and + alert if the maintenance window has been exceeded. +#. The maintenance process could support plugins to allow other integration tasks to be + initiated as part of the transition to and from maintenance. This plugin capability could + support actions like; + + * alert suppression to 3rd party monitoring framework(s) + * service level reporting, to record outage windows diff -Nru ceph-15.2.8/doc/dev/cephadm/index.rst ceph-15.2.11/doc/dev/cephadm/index.rst --- ceph-15.2.8/doc/dev/cephadm/index.rst 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/doc/dev/cephadm/index.rst 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,13 @@ +=================================== +CEPHADM Developer Documentation +=================================== + +.. rubric:: Contents + +.. toctree:: + :maxdepth: 1 + + + host-maintenance + compliance-check + diff -Nru ceph-15.2.8/doc/man/8/rbd.rst ceph-15.2.11/doc/man/8/rbd.rst --- ceph-15.2.8/doc/man/8/rbd.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/man/8/rbd.rst 2021-04-19 13:47:30.000000000 +0000 @@ -732,24 +732,32 @@ * noshare - Disable sharing of client instances with other mappings. -* crc - Enable CRC32C checksumming for data writes (default). +* crc - Enable CRC32C checksumming for msgr1 on-the-wire protocol (default). + For msgr2.1 protocol this option is ignored: full checksumming is always on + in 'crc' mode and always off in 'secure' mode. + +* nocrc - Disable CRC32C checksumming for msgr1 on-the-wire protocol. Note + that only payload checksumming is disabled, header checksumming is always on. + For msgr2.1 protocol this option is ignored. + +* cephx_require_signatures - Require msgr1 message signing feature (since 3.19, + default). This option is deprecated and will be removed in the future as the + feature has been supported since the Bobtail release. -* nocrc - Disable CRC32C checksumming for data writes. - -* cephx_require_signatures - Require cephx message signing (since 3.19, - default). - -* nocephx_require_signatures - Don't require cephx message signing (since - 3.19). +* nocephx_require_signatures - Don't require msgr1 message signing feature + (since 3.19). This option is deprecated and will be removed in the future. * tcp_nodelay - Disable Nagle's algorithm on client sockets (since 4.0, default). * notcp_nodelay - Enable Nagle's algorithm on client sockets (since 4.0). -* cephx_sign_messages - Enable message signing (since 4.4, default). +* cephx_sign_messages - Enable message signing for msgr1 on-the-wire protocol + (since 4.4, default). For msgr2.1 protocol this option is ignored: message + signing is built into 'secure' mode and not offered in 'crc' mode. -* nocephx_sign_messages - Disable message signing (since 4.4). +* nocephx_sign_messages - Disable message signing for msgr1 on-the-wire protocol + (since 4.4). For msgr2.1 protocol this option is ignored. * mount_timeout=x - A timeout on various steps in `rbd device map` and `rbd device unmap` sequences (default is 60 seconds). In particular, @@ -844,6 +852,25 @@ backend that the data is incompressible, disabling compression in aggressive mode (since 5.8). +* ms_mode=legacy - Use msgr1 on-the-wire protocol (since 5.11, default). + +* ms_mode=crc - Use msgr2.1 on-the-wire protocol, select 'crc' mode, also + referred to as plain mode (since 5.11). If the daemon denies 'crc' mode, + fail the connection. + +* ms_mode=secure - Use msgr2.1 on-the-wire protocol, select 'secure' mode + (since 5.11). 'secure' mode provides full in-transit encryption ensuring + both confidentiality and authenticity. If the daemon denies 'secure' mode, + fail the connection. + +* ms_mode=prefer-crc - Use msgr2.1 on-the-wire protocol, select 'crc' + mode (since 5.11). If the daemon denies 'crc' mode in favor of 'secure' + mode, agree to 'secure' mode. + +* ms_mode=prefer-secure - Use msgr2.1 on-the-wire protocol, select 'secure' + mode (since 5.11). If the daemon denies 'secure' mode in favor of 'crc' + mode, agree to 'crc' mode. + * udev - Wait for udev device manager to finish executing all matching "add" rules and release the device before exiting (default). This option is not passed to the kernel. diff -Nru ceph-15.2.8/doc/mgr/dashboard.rst ceph-15.2.11/doc/mgr/dashboard.rst --- ceph-15.2.8/doc/mgr/dashboard.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/mgr/dashboard.rst 2021-04-19 13:47:30.000000000 +0000 @@ -268,7 +268,35 @@ To create a user with the administrator role you can use the following commands:: - $ ceph dashboard ac-user-create administrator + $ ceph dashboard ac-user-create -i administrator + +Account Lock-out +^^^^^^^^^^^^^^^^ + +It disables a user account if a user repeatedly enters the wrong credentials +for multiple times. It is enabled by default to prevent brute-force or dictionary +attacks. The user can get or set the default number of lock-out attempts using +these commands respectively:: + + $ ceph dashboard get-account-lockout-attempts + $ ceph dashboard set-account-lockout-attempts + +.. warning:: + + This feature can be disabled by setting the default number of lock-out attempts to 0. + However, by disabling this feature, the account is more vulnerable to brute-force or + dictionary based attacks. This can be disabled by:: + + $ ceph dashboard set-account-lockout-attempts 0 + +Enable a Locked User +^^^^^^^^^^^^^^^^^^^^ + +If a user account is disabled as a result of multiple invalid login attempts, then +it needs to be manually enabled by the administrator. This can be done by the following +command:: + + $ ceph dashboard ac-user-enable Accessing the Dashboard ^^^^^^^^^^^^^^^^^^^^^^^ @@ -305,8 +333,8 @@ Finally, provide the credentials to the dashboard:: - $ ceph dashboard set-rgw-api-access-key - $ ceph dashboard set-rgw-api-secret-key + $ ceph dashboard set-rgw-api-access-key -i + $ ceph dashboard set-rgw-api-secret-key -i In a typical default configuration with a single RGW endpoint, this is all you have to do to get the Object Gateway management functionality working. The @@ -368,7 +396,8 @@ The available iSCSI gateways must be defined using the following commands:: $ ceph dashboard iscsi-gateway-list - $ ceph dashboard iscsi-gateway-add ://:@[:port] + $ # Gateway URL format for a new gateway: ://:@[:port] + $ ceph dashboard iscsi-gateway-add -i [] $ ceph dashboard iscsi-gateway-rm @@ -479,7 +508,8 @@ After you have set up Grafana and Prometheus, you will need to configure the connection information that the Ceph Dashboard will use to access Grafana. -You need to tell the dashboard on which url Grafana instance is running/deployed:: +You need to tell the dashboard on which URL the Grafana instance is +running/deployed:: $ ceph dashboard set-grafana-api-url # default: '' @@ -503,6 +533,38 @@ You can directly access Grafana Instance as well to monitor your cluster. +Alternative URL for Browsers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Ceph Dashboard backend requires the Grafana URL to be able to verify the +existence of Grafana Dashboards before the frontend even loads them. Due to the +nature of how Grafana is implemented in Ceph Dashboard, this means that two +working connections are required in order to be able to see Grafana graphs in +Ceph Dashboard: + +- The backend (Ceph Mgr module) needs to verify the existence of the requested + graph. If this request succeeds, it lets the frontend know that it can safely + access Grafana. +- The frontend then requests the Grafana graphs directly from the user's + browser using an iframe. The Grafana instance is accessed directly without any + detour through Ceph Dashboard. + +Now, it might be the case that your environment makes it difficult for the +user's browser to directly access the URL configured in Ceph Dashboard. To solve +this issue, a separate URL can be configured which will solely be used to tell +the frontend (the user's browser) which URL it should use to access Grafana. +This setting won't ever be changed automatically, unlike the GRAFANA_API_URL +which is set by :ref:`cephadm` (only if cephadm is used to deploy monitoring +services). + +To change the URL that is returned to the frontend issue the following command:: + + $ ceph dashboard set-grafana-frontend-api-url + +If no value is set for that option, it will simply fall back to the value of the +GRAFANA_API_URL option. If set, it will instruct the browser to use this URL to +access Grafana. + .. _dashboard-sso-support: Enabling Single Sign-On (SSO) @@ -658,6 +720,19 @@ should not disturb each other through annoying duplicated notifications popping up. +If you are using a self-signed certificate in your Prometheus or your +Alertmanager setup, you should disable certificate verification in the +dashboard to avoid refused connections, e.g. caused by certificates signed by +unknown CA or not matching the host name. + +- For Prometheus:: + + $ ceph dashboard set-prometheus-api-ssl-verify False + +- For Alertmanager:: + + $ ceph dashboard set-alertmanager-api-ssl-verify False + .. _dashboard-user-role-management: User and Role Management @@ -734,7 +809,7 @@ - *Create User*:: - $ ceph dashboard ac-user-create [--enabled] [--force-password] [--pwd_update_required] [] [] [] [] [] + $ ceph dashboard ac-user-create [--enabled] [--force-password] [--pwd_update_required] -i [] [] [] [] To bypass the password policy checks use the `force-password` option. Use the option `pwd_update_required` so that a newly created user has @@ -746,11 +821,11 @@ - *Change Password*:: - $ ceph dashboard ac-user-set-password [--force-password] + $ ceph dashboard ac-user-set-password [--force-password] -i - *Change Password Hash*:: - $ ceph dashboard ac-user-set-password-hash + $ ceph dashboard ac-user-set-password-hash -i The hash must be a bcrypt hash and salt, e.g. ``$2b$12$Pt3Vq/rDt2y9glTPSV.VFegiLkQeIpddtkhoFetNApYmIJOY8gau2``. This can be used to import users from an external database. @@ -887,7 +962,7 @@ 1. *Create the user*:: - $ ceph dashboard ac-user-create bob mypassword + $ ceph dashboard ac-user-create bob -i 2. *Create role and specify scope permissions*:: diff -Nru ceph-15.2.8/doc/mgr/orchestrator.rst ceph-15.2.11/doc/mgr/orchestrator.rst --- ceph-15.2.8/doc/mgr/orchestrator.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/mgr/orchestrator.rst 2021-04-19 13:47:30.000000000 +0000 @@ -58,6 +58,8 @@ Show current orchestrator mode and high-level status (whether the orchestrator plugin is available and operational) +.. _orchestrator-cli-host-management: + Host Management =============== @@ -70,7 +72,7 @@ ceph orch host add [] [...] ceph orch host rm -For cephadm, see also :ref:`cephadm-fqdn`. +For cephadm, see also :ref:`cephadm-fqdn` and :ref:`cephadm-removing-hosts`. Host Specification ------------------ diff -Nru ceph-15.2.8/doc/rados/configuration/osd-config-ref.rst ceph-15.2.11/doc/rados/configuration/osd-config-ref.rst --- ceph-15.2.8/doc/rados/configuration/osd-config-ref.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/rados/configuration/osd-config-ref.rst 2021-04-19 13:47:30.000000000 +0000 @@ -1127,7 +1127,7 @@ when osd data is on HDD and osd journal is on SSD. :Type: Float -:Default: ``2`` +:Default: ``1`` ``osd command max records`` diff -Nru ceph-15.2.8/doc/rados/operations/erasure-code-clay.rst ceph-15.2.11/doc/rados/operations/erasure-code-clay.rst --- ceph-15.2.8/doc/rados/operations/erasure-code-clay.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/rados/operations/erasure-code-clay.rst 2021-04-19 13:47:30.000000000 +0000 @@ -88,7 +88,7 @@ :Description: Number of OSDs requested to send data during recovery of a single chunk. *d* needs to be chosen such that - k+1 <= d <= k+m-1. Larger the *d*, the better the savings. + k+1 <= d <= k+m-1. The larger the *d*, the better the savings. :Type: Integer :Required: No. diff -Nru ceph-15.2.8/doc/rados/operations/health-checks.rst ceph-15.2.11/doc/rados/operations/health-checks.rst --- ceph-15.2.8/doc/rados/operations/health-checks.rst 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/doc/rados/operations/health-checks.rst 2021-04-19 13:47:30.000000000 +0000 @@ -122,6 +122,73 @@ ceph config set global mon_data_size_warn +AUTH_INSECURE_GLOBAL_ID_RECLAIM +_______________________________ + +One or more clients or daemons are connected to the cluster that are +not securely reclaiming their global_id (a unique number identifying +each entity in the cluster) when reconnecting to a monitor. The +client is being permitted to connect anyway because the +``auth_allow_insecure_global_id_reclaim`` option is set to true (which may +be necessary until all ceph clients have been upgraded), and the +``auth_expose_insecure_global_id_reclaim`` option set to ``true`` (which +allows monitors to detect clients with insecure reclaim early by forcing them to +reconnect right after they first authenticate). + +You can identify which client(s) are using unpatched ceph client code with:: + + ceph health detail + +Clients global_id reclaim rehavior can also seen in the +``global_id_status`` field in the dump of clients connected to an +individual monitor (``reclaim_insecure`` means the client is +unpatched and is contributing to this health alert):: + + ceph tell mon.\* sessions + +We strongly recommend that all clients in the system are upgraded to a +newer version of Ceph that correctly reclaims global_id values. Once +all clients have been updated, you can stop allowing insecure reconnections +with:: + + ceph config set mon auth_allow_insecure_global_id_reclaim false + +If it is impractical to upgrade all clients immediately, you can silence +this warning temporarily with:: + + ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM 1w # 1 week + +Although we do NOT recommend doing so, you can also disable this warning indefinitely +with:: + + ceph config set mon mon_warn_on_insecure_global_id_reclaim false + +AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED +_______________________________________ + +Ceph is currently configured to allow clients to reconnect to monitors using +an insecure process to reclaim their previous global_id because the setting +``auth_allow_insecure_global_id_reclaim`` is set to ``true``. It may be necessary to +leave this setting enabled while existing Ceph clients are upgraded to newer +versions of Ceph that correctly and securely reclaim their global_id. + +If the ``AUTH_INSECURE_GLOBAL_ID_RECLAIM`` health alert has not also been raised and +the ``auth_expose_insecure_global_id_reclaim`` setting has not been disabled (it is +on by default), then there are currently no clients connected that need to be +upgraded, and it is safe to disallow insecure global_id reclaim with:: + + ceph config set mon auth_allow_insecure_global_id_reclaim false + +If there are still clients that need to be upgraded, then this alert can be +silenced temporarily with:: + + ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w # 1 week + +Although we do NOT recommend doing so, you can also disable this warning indefinitely +with:: + + ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false + Manager ------- @@ -1175,3 +1242,16 @@ ``mon_warn_on_osd_down_out_interval_zero`` to false:: ceph config global mon mon_warn_on_osd_down_out_interval_zero false + +DASHBOARD_DEBUG +_______________ + +The Dashboard debug mode is enabled. This means, if there is an error +while processing a REST API request, the HTTP error response contains +a Python traceback. This behaviour should be disabled in production +environments because such a traceback might contain and expose sensible +information. + +The debug mode can be disabled with:: + + ceph dashboard debug disable diff -Nru ceph-15.2.8/do_cmake.sh ceph-15.2.11/do_cmake.sh --- ceph-15.2.8/do_cmake.sh 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/do_cmake.sh 2021-04-19 13:47:30.000000000 +0000 @@ -17,8 +17,10 @@ case "$ID" in fedora) PYBUILD="3.7" - if [ "$VERSION_ID" -ge "32" ] ; then + if [ "$VERSION_ID" -eq "32" ] ; then PYBUILD="3.8" + elif [ "$VERSION_ID" -ge "33" ] ; then + PYBUILD="3.9" fi ;; rhel|centos) diff -Nru ceph-15.2.8/.github/CODEOWNERS ceph-15.2.11/.github/CODEOWNERS --- ceph-15.2.8/.github/CODEOWNERS 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/.github/CODEOWNERS 2021-04-19 13:47:30.000000000 +0000 @@ -3,8 +3,7 @@ /qa/suites/rados/dashboard @ceph/dashboard /qa/tasks/mgr/test_dashboard.py @ceph/dashboard /qa/tasks/mgr/dashboard @ceph/dashboard -/monitoring/grafana @ceph/dashboard -/monitoring/prometheus @ceph/dashboard +/monitoring @ceph/dashboard /doc/mgr/dashboard.rst @ceph/dashboard # Dashboard API team diff -Nru ceph-15.2.8/.github/labeler.yml ceph-15.2.11/.github/labeler.yml --- ceph-15.2.8/.github/labeler.yml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/.github/labeler.yml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,10 @@ +dashboard: + - /src/pybind/mgr/dashboard/** + - /qa/suites/rados/dashboard/** + - /qa/tasks/mgr/test_dashboard.py + - /qa/tasks/mgr/dashboard/** + - /monitoring/** + - /doc/mgr/dashboard.rst + +CI: + - /.github/** diff -Nru ceph-15.2.8/.github/milestone.yml ceph-15.2.11/.github/milestone.yml --- ceph-15.2.8/.github/milestone.yml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/.github/milestone.yml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,6 @@ +base-branch: + - "(luminous)" + - "(nautilus)" + - "(octopus)" + - "(pacific)" + - "(quincy)" diff -Nru ceph-15.2.8/.github/workflows/pr-triage.yml ceph-15.2.11/.github/workflows/pr-triage.yml --- ceph-15.2.8/.github/workflows/pr-triage.yml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/.github/workflows/pr-triage.yml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,15 @@ +--- +name: "Pull Request Triage" +on: pull_request_target +jobs: + pr-triage: + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@9794b1493b6f1fa7b006c5f8635a19c76c98be95 + with: + sync-labels: '' + repo-token: "${{ secrets.GITHUB_TOKEN }}" + - uses: iyu/actions-milestone@dbf7e5348844c9ddc6b803a5721b85fa70fe3bb9 + with: + configuration-path: .github/milestone.yml + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff -Nru ceph-15.2.8/install-deps.sh ceph-15.2.11/install-deps.sh --- ceph-15.2.8/install-deps.sh 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/install-deps.sh 2021-04-19 13:47:30.000000000 +0000 @@ -365,7 +365,8 @@ --enable rhel-7-server-devtools-rpms dts_ver=8 elif test $ID = centos -a $MAJOR_VERSION = 8 ; then - $SUDO dnf config-manager --set-enabled PowerTools + # Enable 'powertools' or 'PowerTools' repo + $SUDO dnf config-manager --set-enabled $(dnf repolist --all 2>/dev/null|gawk 'tolower($0) ~ /^powertools\s/{print $1}') # before EPEL8 and PowerTools provide all dependencies, we use sepia for the dependencies $SUDO dnf config-manager --add-repo http://apt-mirror.front.sepia.ceph.com/lab-extras/8/ $SUDO dnf config-manager --setopt=apt-mirror.front.sepia.ceph.com_lab-extras_8_.gpgcheck=0 --save diff -Nru ceph-15.2.8/monitoring/grafana/dashboards/osd-device-details.json ceph-15.2.11/monitoring/grafana/dashboards/osd-device-details.json --- ceph-15.2.8/monitoring/grafana/dashboards/osd-device-details.json 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/monitoring/grafana/dashboards/osd-device-details.json 2021-04-19 13:47:30.000000000 +0000 @@ -126,7 +126,7 @@ "label": "Read (-) / Write (+)", "logBase": 1, "max": null, - "min": "0", + "min": null, "show": true }, { diff -Nru ceph-15.2.8/monitoring/prometheus/alerts/ceph_default_alerts.yml ceph-15.2.11/monitoring/prometheus/alerts/ceph_default_alerts.yml --- ceph-15.2.8/monitoring/prometheus/alerts/ceph_default_alerts.yml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/monitoring/prometheus/alerts/ceph_default_alerts.yml 2021-04-19 13:47:30.000000000 +0000 @@ -175,30 +175,48 @@ description: > Root volume (OSD and MON store) is dangerously full: {{ $value | humanize }}% free. - # alert on nic packet errors and drops rates > 1 packet/s + # alert on nic packet errors and drops rates > 1% packets/s - alert: network packets dropped - expr: irate(node_network_receive_drop_total{device!="lo"}[5m]) + irate(node_network_transmit_drop_total{device!="lo"}[5m]) > 1 + expr: | + ( + increase(node_network_receive_drop_total{device!="lo"}[1m]) + + increase(node_network_transmit_drop_total{device!="lo"}[1m]) + ) / ( + increase(node_network_receive_packets_total{device!="lo"}[1m]) + + increase(node_network_transmit_packets_total{device!="lo"}[1m]) + ) >= 0.0001 or ( + increase(node_network_receive_drop_total{device!="lo"}[1m]) + + increase(node_network_transmit_drop_total{device!="lo"}[1m]) + ) >= 10 labels: severity: warning type: ceph_default oid: 1.3.6.1.4.1.50495.15.1.2.8.2 annotations: description: > - Node {{ $labels.instance }} experiences packet drop > 1 - packet/s on interface {{ $labels.device }}. + Node {{ $labels.instance }} experiences packet drop > 0.01% or > + 10 packets/s on interface {{ $labels.device }}. - alert: network packet errors expr: | - irate(node_network_receive_errs_total{device!="lo"}[5m]) + - irate(node_network_transmit_errs_total{device!="lo"}[5m]) > 1 + ( + increase(node_network_receive_errs_total{device!="lo"}[1m]) + + increase(node_network_transmit_errs_total{device!="lo"}[1m]) + ) / ( + increase(node_network_receive_packets_total{device!="lo"}[1m]) + + increase(node_network_transmit_packets_total{device!="lo"}[1m]) + ) >= 0.0001 or ( + increase(node_network_receive_errs_total{device!="lo"}[1m]) + + increase(node_network_transmit_errs_total{device!="lo"}[1m]) + ) >= 10 labels: severity: warning type: ceph_default oid: 1.3.6.1.4.1.50495.15.1.2.8.3 annotations: description: > - Node {{ $labels.instance }} experiences packet errors > 1 - packet/s on interface {{ $labels.device }}. + Node {{ $labels.instance }} experiences packet errors > 0.01% or + > 10 packets/s on interface {{ $labels.device }}. - alert: storage filling up expr: | @@ -214,6 +232,17 @@ will be full in less than 5 days assuming the average fill-up rate of the past 48 hours. + - alert: MTU Mismatch + expr: node_network_mtu_bytes{device!="lo"} != on() group_left() (quantile(0.5, node_network_mtu_bytes{device!="lo"})) + labels: + severity: warning + type: ceph_default + oid: 1.3.6.1.4.1.50495.15.1.2.8.5 + annotations: + description: > + Node {{ $labels.instance }} has a different MTU size ({{ $value }}) + than the median value on device {{ $labels.device }}. + - name: pools rules: - alert: pool full @@ -230,8 +259,8 @@ - alert: pool filling up expr: | ( - predict_linear(ceph_pool_stored[2d], 3600 * 24 * 5) >= - ceph_pool_max_avail + predict_linear(ceph_pool_stored[2d], 3600 * 24 * 5) + >= ceph_pool_stored + ceph_pool_max_avail ) * on(pool_id) group_left(name) ceph_pool_metadata labels: severity: warning @@ -241,3 +270,15 @@ description: > Pool {{ $labels.name }} will be full in less than 5 days assuming the average fill-up rate of the past 48 hours. + + - name: healthchecks + rules: + - alert: Slow OSD Ops + expr: ceph_healthcheck_slow_ops > 0 + for: 30s + labels: + severity: warning + type: ceph_default + annotations: + description: > + {{ $value }} OSD requests are taking too long to process (osd_op_complaint_time exceeded) diff -Nru ceph-15.2.8/PendingReleaseNotes ceph-15.2.11/PendingReleaseNotes --- ceph-15.2.8/PendingReleaseNotes 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/PendingReleaseNotes 2021-04-19 13:47:30.000000000 +0000 @@ -1,5 +1,17 @@ +15.2.9 +------ +* MGR: progress module can now be turned on/off, using the commands: + ``ceph progress on`` and ``ceph progress off``. + +* New bluestore_rocksdb_options_annex config parameter. Complements + bluestore_rocksdb_options and allows setting rocksdb options without repeating + the existing defaults. + 15.2.8 ------ +* $pid expansion in config paths like `admin_socket` will now properly expand + to the daemon pid for commands like `ceph-mds` or `ceph-osd`. Previously only + `ceph-fuse`/`rbd-nbd` expanded `$pid` with the actual daemon pid. * ceph-volume: The ``lvm batch` subcommand received a major rewrite. This closed a number of bugs and improves usability in terms of size specification and diff -Nru ceph-15.2.8/qa/cephfs/overrides/whitelist_health.yaml ceph-15.2.11/qa/cephfs/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/cephfs/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/cephfs/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/cephfs/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/cephfs/tasks/cfuse_workunit_suites_ffsb.yaml ceph-15.2.11/qa/cephfs/tasks/cfuse_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/cephfs/tasks/cfuse_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/cephfs/tasks/cfuse_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request conf: diff -Nru ceph-15.2.8/qa/distros/all/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/distros/all/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/distros/all/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/distros/all/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/overrides/2-size-2-min-size.yaml ceph-15.2.11/qa/overrides/2-size-2-min-size.yaml --- ceph-15.2.8/qa/overrides/2-size-2-min-size.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/overrides/2-size-2-min-size.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: osd_pool_default_size: 2 osd_pool_default_min_size: 2 - log-whitelist: + log-ignorelist: - \(REQUEST_STUCK\) diff -Nru ceph-15.2.8/qa/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running conf: mds: diff -Nru ceph-15.2.8/qa/releases/luminous.yaml ceph-15.2.11/qa/releases/luminous.yaml --- ceph-15.2.8/qa/releases/luminous.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/releases/luminous.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,5 +17,5 @@ conf: mon: mon warn on osd down out interval zero: false - log-whitelist: + log-ignorelist: - no active mgr diff -Nru ceph-15.2.8/qa/standalone/ceph-helpers.sh ceph-15.2.11/qa/standalone/ceph-helpers.sh --- ceph-15.2.8/qa/standalone/ceph-helpers.sh 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/standalone/ceph-helpers.sh 2021-04-19 13:47:30.000000000 +0000 @@ -480,6 +480,7 @@ --mon-allow-pool-delete \ --osd-pool-default-pg-autoscale-mode off \ --mon-osd-backfillfull-ratio .99 \ + --mon-warn-on-insecure-global-id-reclaim-allowed=false \ "$@" || return 1 cat > $dir/ceph.conf <&1 || return 1 +} + main osd-erasure-code-profile "$@" # Local Variables: diff -Nru ceph-15.2.8/qa/suites/big/rados-thrash/thrashers/default.yaml ceph-15.2.11/qa/suites/big/rados-thrash/thrashers/default.yaml --- ceph-15.2.8/qa/suites/big/rados-thrash/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/big/rados-thrash/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/buildpackages/any/distros/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/buildpackages/any/distros/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/buildpackages/any/distros/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/buildpackages/any/distros/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/buildpackages/tests/distros/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/buildpackages/tests/distros/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/buildpackages/tests/distros/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/buildpackages/tests/distros/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/fs/32bits/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/32bits/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/32bits/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/32bits/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/32bits/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/basic_functional/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/basic_functional/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/alternate-pool.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/alternate-pool.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/alternate-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/alternate-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace - object missing on disk - error reading table object diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/auto-repair.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/auto-repair.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/auto-repair.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/auto-repair.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - force file system read-only - bad backtrace - MDS in read-only mode diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/cephfs_scrub_tests.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/cephfs_scrub_tests.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/cephfs_scrub_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/cephfs_scrub_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds - Scrub error on inode - Behind on trimming diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/client-limits.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/client-limits.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/client-limits.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/client-limits.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - responding to mclientcaps\(revoke\) - not advance its oldest_client_tid - failing to advance its oldest client/flush tid diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/client-recovery.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/client-recovery.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/client-recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/client-recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ # to permit OSDs to complain about that. overrides: ceph: - log-whitelist: + log-ignorelist: - evicting unresponsive client - but it is still running - slow request diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/damage.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/damage.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/damage.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/damage.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace - object missing on disk - error reading table object diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/data-scan.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/data-scan.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/data-scan.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/data-scan.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace - object missing on disk - error reading table object diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/forward-scrub.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/forward-scrub.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/forward-scrub.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/forward-scrub.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - inode wrongly marked free - bad backtrace on inode - inode table repaired for inode diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/journal-repair.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/journal-repair.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/journal-repair.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/journal-repair.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace on directory inode - error reading table object - Metadata damage detected diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/mds-full.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/mds-full.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/mds-full.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/mds-full.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ ceph: cephfs_ec_profile: - disabled - log-whitelist: + log-ignorelist: - OSD full dropping all updates - OSD near full - pausewr flag diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/sessionmap/sessionmap.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/sessionmap/sessionmap.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/sessionmap/sessionmap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/sessionmap/sessionmap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - client session with non-allowable root tasks: diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/volume-client/task/test/test.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/volume-client/task/test/test.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/volume-client/task/test/test.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/volume-client/task/test/test.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - MON_DOWN tasks: - cephfs_test_runner: diff -Nru ceph-15.2.8/qa/suites/fs/basic_functional/tasks/volumes.yaml ceph-15.2.11/qa/suites/fs/basic_functional/tasks/volumes.yaml --- ceph-15.2.8/qa/suites/fs/basic_functional/tasks/volumes.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_functional/tasks/volumes.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: mgr: debug client: 10 - log-whitelist: + log-ignorelist: - OSD full dropping all updates - OSD near full - pausewr flag @@ -15,5 +15,6 @@ tasks: - cephfs_test_runner: + fail_on_skip: false modules: - tasks.cephfs.test_volumes diff -Nru ceph-15.2.8/qa/suites/fs/basic_workload/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/basic_workload/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/basic_workload/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_workload/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/basic_workload/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/basic_workload/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/basic_workload/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_workload/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/basic_workload/tasks/cfuse_workunit_suites_ffsb.yaml ceph-15.2.11/qa/suites/fs/basic_workload/tasks/cfuse_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/suites/fs/basic_workload/tasks/cfuse_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/basic_workload/tasks/cfuse_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request conf: diff -Nru ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/tasks/trim-i22073.yaml ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/tasks/trim-i22073.yaml --- ceph-15.2.8/qa/suites/fs/bugs/client_trim_caps/tasks/trim-i22073.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/bugs/client_trim_caps/tasks/trim-i22073.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - MDS cache is too large - \(MDS_CACHE_OVERSIZED\) tasks: diff -Nru ceph-15.2.8/qa/suites/fs/multiclient/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/multiclient/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/multiclient/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multiclient/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multiclient/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/multiclient/tasks/cephfs_misc_tests.yaml ceph-15.2.11/qa/suites/fs/multiclient/tasks/cephfs_misc_tests.yaml --- ceph-15.2.8/qa/suites/fs/multiclient/tasks/cephfs_misc_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multiclient/tasks/cephfs_misc_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - evicting unresponsive client - POOL_APP_NOT_ENABLED - has not responded to cap revoke by MDS for over diff -Nru ceph-15.2.8/qa/suites/fs/multifs/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/multifs/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/multifs/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multifs/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multifs/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/multifs/tasks/failover.yaml ceph-15.2.11/qa/suites/fs/multifs/tasks/failover.yaml --- ceph-15.2.8/qa/suites/fs/multifs/tasks/failover.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/multifs/tasks/failover.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds - \(MDS_INSUFFICIENT_STANDBY\) - \(MDS_ALL_DOWN\) diff -Nru ceph-15.2.8/qa/suites/fs/permission/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/permission/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/permission/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/permission/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/permission/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/snaps/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/snaps/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/snaps/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/snaps/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/snaps/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/thrash/ceph-thrash/mds.yaml ceph-15.2.11/qa/suites/fs/thrash/ceph-thrash/mds.yaml --- ceph-15.2.8/qa/suites/fs/thrash/ceph-thrash/mds.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/thrash/ceph-thrash/mds.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,5 +3,5 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds diff -Nru ceph-15.2.8/qa/suites/fs/thrash/ceph-thrash/mon.yaml ceph-15.2.11/qa/suites/fs/thrash/ceph-thrash/mon.yaml --- ceph-15.2.8/qa/suites/fs/thrash/ceph-thrash/mon.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/thrash/ceph-thrash/mon.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) tasks: diff -Nru ceph-15.2.8/qa/suites/fs/thrash/msgr-failures/osd-mds-delay.yaml ceph-15.2.11/qa/suites/fs/thrash/msgr-failures/osd-mds-delay.yaml --- ceph-15.2.8/qa/suites/fs/thrash/msgr-failures/osd-mds-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/thrash/msgr-failures/osd-mds-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -7,5 +7,5 @@ ms inject delay probability: .005 ms inject delay max: 1 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/fs/thrash/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/thrash/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/thrash/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/thrash/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/thrash/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/thrash/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/thrash/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/thrash/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/traceless/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/traceless/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/traceless/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/traceless/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/traceless/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/traceless/tasks/cfuse_workunit_suites_ffsb.yaml ceph-15.2.11/qa/suites/fs/traceless/tasks/cfuse_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/suites/fs/traceless/tasks/cfuse_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/traceless/tasks/cfuse_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request conf: diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/3-compat_client/mimic.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/3-compat_client/mimic.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/old_client/tasks/3-compat_client/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/old_client/tasks/3-compat_client/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/4-compat_client.yaml ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/4-compat_client.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/4-compat_client.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/featureful_client/upgraded_client/tasks/4-compat_client.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/3-verify.yaml ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/3-verify.yaml --- ceph-15.2.8/qa/suites/fs/upgrade/volumes/import-legacy/tasks/3-verify.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/upgrade/volumes/import-legacy/tasks/3-verify.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/fs/verify/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/fs/verify/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/fs/verify/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/verify/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/verify/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/fs/verify/validater/valgrind.yaml ceph-15.2.11/qa/suites/fs/verify/validater/valgrind.yaml --- ceph-15.2.8/qa/suites/fs/verify/validater/valgrind.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/fs/verify/validater/valgrind.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,11 +4,10 @@ overrides: install: ceph: - flavor: notcmalloc debuginfo: true ceph: # Valgrind makes everything slow, so ignore slow requests and extend heartbeat grace - log-whitelist: + log-ignorelist: - slow requests are blocked conf: global: diff -Nru ceph-15.2.8/qa/suites/kcephfs/cephfs/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/kcephfs/cephfs/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/kcephfs/cephfs/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/cephfs/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/kcephfs/cephfs/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/kcephfs/cephfs/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/kcephfs/cephfs/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/cephfs/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/kcephfs/cephfs/tasks/kclient_workunit_suites_ffsb.yaml ceph-15.2.11/qa/suites/kcephfs/cephfs/tasks/kclient_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/suites/kcephfs/cephfs/tasks/kclient_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/cephfs/tasks/kclient_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request tasks: diff -Nru ceph-15.2.8/qa/suites/kcephfs/mixed-clients/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/kcephfs/mixed-clients/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/kcephfs/mixed-clients/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/mixed-clients/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/kcephfs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/kcephfs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/kcephfs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/mixed-clients/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/auto-repair.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/auto-repair.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/auto-repair.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/auto-repair.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - force file system read-only - bad backtrace - MDS in read-only mode diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/client-limits.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/client-limits.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/client-limits.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/client-limits.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - responding to mclientcaps\(revoke\) - not advance its oldest_client_tid - failing to advance its oldest client/flush tid diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/client-recovery.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/client-recovery.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/client-recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/client-recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ # to permit OSDs to complain about that. overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - slow request - evicting unresponsive client diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/damage.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/damage.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/damage.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/damage.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace - object missing on disk - error reading table object diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/data-scan.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/data-scan.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/data-scan.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/data-scan.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace - object missing on disk - error reading table object diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/failover.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/failover.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/failover.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/failover.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds - \(MDS_INSUFFICIENT_STANDBY\) - \(MDS_ALL_DOWN\) diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/forward-scrub.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/forward-scrub.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/forward-scrub.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/forward-scrub.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - inode wrongly marked free - bad backtrace on inode - inode table repaired for inode diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/journal-repair.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/journal-repair.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/journal-repair.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/journal-repair.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - bad backtrace on directory inode - error reading table object - Metadata damage detected diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/mds-full.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/mds-full.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/mds-full.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/mds-full.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ ceph: cephfs_ec_profile: - disabled - log-whitelist: + log-ignorelist: - OSD full dropping all updates - OSD near full - pausewr flag diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/sessionmap.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/sessionmap.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/sessionmap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/sessionmap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - client session with non-allowable root tasks: diff -Nru ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/volume-client.yaml ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/volume-client.yaml --- ceph-15.2.8/qa/suites/kcephfs/recovery/tasks/volume-client.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/recovery/tasks/volume-client.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - MON_DOWN tasks: - cephfs_test_runner: diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/thrash-health-whitelist.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/thrash-health-whitelist.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/thrash-health-whitelist.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/thrash-health-whitelist.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/default.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/default.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/mds.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/mds.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/mds.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/mds.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds tasks: diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/mon.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/mon.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/thrashers/mon.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/thrashers/mon.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) tasks: diff -Nru ceph-15.2.8/qa/suites/kcephfs/thrash/workloads/kclient_workunit_suites_ffsb.yaml ceph-15.2.11/qa/suites/kcephfs/thrash/workloads/kclient_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/suites/kcephfs/thrash/workloads/kclient_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/kcephfs/thrash/workloads/kclient_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request conf: diff -Nru ceph-15.2.8/qa/suites/krbd/basic/ms_mode/crc.yaml ceph-15.2.11/qa/suites/krbd/basic/ms_mode/crc.yaml --- ceph-15.2.8/qa/suites/krbd/basic/ms_mode/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/basic/ms_mode/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc diff -Nru ceph-15.2.8/qa/suites/krbd/basic/ms_mode/legacy.yaml ceph-15.2.11/qa/suites/krbd/basic/ms_mode/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/basic/ms_mode/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/basic/ms_mode/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy diff -Nru ceph-15.2.8/qa/suites/krbd/basic/ms_mode/secure.yaml ceph-15.2.11/qa/suites/krbd/basic/ms_mode/secure.yaml --- ceph-15.2.8/qa/suites/krbd/basic/ms_mode/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/basic/ms_mode/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/conf.yaml ceph-15.2.11/qa/suites/krbd/fsx/conf.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/conf.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/conf.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,5 +3,3 @@ conf: global: ms die on skipped message: false - client: - rbd default map options: read_from_replica=balance diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/crc.yaml ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/crc.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc,read_from_replica=balance diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/legacy.yaml ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy,read_from_replica=balance diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/prefer-crc.yaml ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/prefer-crc.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/prefer-crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/prefer-crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=prefer-crc,read_from_replica=balance diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/secure.yaml ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/secure.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/ms_mode$/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/ms_mode$/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure,read_from_replica=balance diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/striping/default/msgr-failures/few.yaml ceph-15.2.11/qa/suites/krbd/fsx/striping/default/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/striping/default/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/striping/default/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/striping/default/msgr-failures/many.yaml ceph-15.2.11/qa/suites/krbd/fsx/striping/default/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/striping/default/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/striping/default/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/fsx/striping/fancy/msgr-failures/few.yaml ceph-15.2.11/qa/suites/krbd/fsx/striping/fancy/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/krbd/fsx/striping/fancy/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/fsx/striping/fancy/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/rbd/msgr-failures/few.yaml ceph-15.2.11/qa/suites/krbd/rbd/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/krbd/rbd/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/rbd/msgr-failures/many.yaml ceph-15.2.11/qa/suites/krbd/rbd/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/krbd/rbd/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/crc.yaml ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/crc.yaml --- ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc diff -Nru ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/legacy.yaml ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy diff -Nru ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/secure.yaml ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/secure.yaml --- ceph-15.2.8/qa/suites/krbd/rbd/ms_mode/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd/ms_mode/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/msgr-failures/few.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/msgr-failures/many.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/crc.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/crc.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/legacy.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/secure.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/secure.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/ms_mode/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/ms_mode/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure diff -Nru ceph-15.2.8/qa/suites/krbd/rbd-nomount/tasks/krbd_udev_netlink_enobufs.yaml ceph-15.2.11/qa/suites/krbd/rbd-nomount/tasks/krbd_udev_netlink_enobufs.yaml --- ceph-15.2.8/qa/suites/krbd/rbd-nomount/tasks/krbd_udev_netlink_enobufs.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/rbd-nomount/tasks/krbd_udev_netlink_enobufs.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - pauserd,pausewr flag\(s\) set tasks: diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/msgr-failures/few.yaml ceph-15.2.11/qa/suites/krbd/singleton/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/msgr-failures/many.yaml ceph-15.2.11/qa/suites/krbd/singleton/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/crc.yaml ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/crc.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/legacy.yaml ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/prefer-crc.yaml ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/prefer-crc.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/prefer-crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/prefer-crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=prefer-crc diff -Nru ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/secure.yaml ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/secure.yaml --- ceph-15.2.8/qa/suites/krbd/singleton/ms_mode$/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/singleton/ms_mode$/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/crc.yaml ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/crc.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=crc diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/legacy.yaml ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/legacy.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/legacy.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/legacy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=legacy diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/prefer-crc.yaml ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/prefer-crc.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/prefer-crc.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/prefer-crc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=prefer-crc diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/secure.yaml ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/secure.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/ms_mode$/secure.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/ms_mode$/secure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +overrides: + ceph: + conf: + client: + rbd default map options: ms_mode=secure diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/thrashers/backoff.yaml ceph-15.2.11/qa/suites/krbd/thrash/thrashers/backoff.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/thrashers/backoff.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/thrashers/backoff.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ osd: osd backoff on peering: true osd backoff on degraded: true - log-whitelist: + log-ignorelist: - wrongly marked me down - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/thrashers/mon-thrasher.yaml ceph-15.2.11/qa/suites/krbd/thrash/thrashers/mon-thrasher.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/thrashers/mon-thrasher.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/thrashers/mon-thrasher.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) tasks: - mon_thrash: diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/krbd/thrash/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/thrashers/upmap.yaml ceph-15.2.11/qa/suites/krbd/thrash/thrashers/upmap.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/thrashers/upmap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/thrashers/upmap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ conf: mon: mon osd initial require min compat client: luminous - log-whitelist: + log-ignorelist: - wrongly marked me down - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/krbd/thrash/thrashosds-health.yaml ceph-15.2.11/qa/suites/krbd/thrash/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/krbd/thrash/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/thrash/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/krbd/wac/sysfs/tasks/stable_pages_required.yaml ceph-15.2.11/qa/suites/krbd/wac/sysfs/tasks/stable_pages_required.yaml --- ceph-15.2.8/qa/suites/krbd/wac/sysfs/tasks/stable_pages_required.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/wac/sysfs/tasks/stable_pages_required.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -tasks: -- workunit: - clients: - all: - - rbd/krbd_stable_pages_required.sh diff -Nru ceph-15.2.8/qa/suites/krbd/wac/sysfs/tasks/stable_writes.yaml ceph-15.2.11/qa/suites/krbd/wac/sysfs/tasks/stable_writes.yaml --- ceph-15.2.8/qa/suites/krbd/wac/sysfs/tasks/stable_writes.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/wac/sysfs/tasks/stable_writes.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,5 @@ +tasks: +- workunit: + clients: + all: + - rbd/krbd_stable_writes.sh diff -Nru ceph-15.2.8/qa/suites/krbd/wac/wac/verify/many-resets.yaml ceph-15.2.11/qa/suites/krbd/wac/wac/verify/many-resets.yaml --- ceph-15.2.8/qa/suites/krbd/wac/wac/verify/many-resets.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/krbd/wac/wac/verify/many-resets.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/multimds/basic/overrides/basic/whitelist_health.yaml ceph-15.2.11/qa/suites/multimds/basic/overrides/basic/whitelist_health.yaml --- ceph-15.2.8/qa/suites/multimds/basic/overrides/basic/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/basic/overrides/basic/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/multimds/basic/overrides/basic/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/multimds/basic/overrides/basic/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/multimds/basic/overrides/basic/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/basic/overrides/basic/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/multimds/basic/tasks/cephfs_test_exports.yaml ceph-15.2.11/qa/suites/multimds/basic/tasks/cephfs_test_exports.yaml --- ceph-15.2.8/qa/suites/multimds/basic/tasks/cephfs_test_exports.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/basic/tasks/cephfs_test_exports.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds tasks: - cephfs_test_runner: diff -Nru ceph-15.2.8/qa/suites/multimds/basic/tasks/cephfs_test_snapshots.yaml ceph-15.2.11/qa/suites/multimds/basic/tasks/cephfs_test_snapshots.yaml --- ceph-15.2.8/qa/suites/multimds/basic/tasks/cephfs_test_snapshots.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/basic/tasks/cephfs_test_snapshots.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ check-counter: dry_run: true ceph: - log-whitelist: + log-ignorelist: - evicting unresponsive client - RECENT_CRASH diff -Nru ceph-15.2.8/qa/suites/multimds/basic/tasks/cfuse_workunit_suites_ffsb.yaml ceph-15.2.11/qa/suites/multimds/basic/tasks/cfuse_workunit_suites_ffsb.yaml --- ceph-15.2.8/qa/suites/multimds/basic/tasks/cfuse_workunit_suites_ffsb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/basic/tasks/cfuse_workunit_suites_ffsb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - SLOW_OPS - slow request conf: diff -Nru ceph-15.2.8/qa/suites/multimds/thrash/ceph-thrash/mds.yaml ceph-15.2.11/qa/suites/multimds/thrash/ceph-thrash/mds.yaml --- ceph-15.2.8/qa/suites/multimds/thrash/ceph-thrash/mds.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/thrash/ceph-thrash/mds.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,5 +3,5 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - Replacing daemon mds diff -Nru ceph-15.2.8/qa/suites/multimds/thrash/ceph-thrash/mon.yaml ceph-15.2.11/qa/suites/multimds/thrash/ceph-thrash/mon.yaml --- ceph-15.2.8/qa/suites/multimds/thrash/ceph-thrash/mon.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/thrash/ceph-thrash/mon.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) tasks: diff -Nru ceph-15.2.8/qa/suites/multimds/thrash/msgr-failures/osd-mds-delay.yaml ceph-15.2.11/qa/suites/multimds/thrash/msgr-failures/osd-mds-delay.yaml --- ceph-15.2.8/qa/suites/multimds/thrash/msgr-failures/osd-mds-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/thrash/msgr-failures/osd-mds-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -7,5 +7,5 @@ ms inject delay probability: .005 ms inject delay max: 1 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/multimds/thrash/overrides/thrash/whitelist_health.yaml ceph-15.2.11/qa/suites/multimds/thrash/overrides/thrash/whitelist_health.yaml --- ceph-15.2.8/qa/suites/multimds/thrash/overrides/thrash/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/thrash/overrides/thrash/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/multimds/thrash/overrides/thrash/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/multimds/thrash/overrides/thrash/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/multimds/thrash/overrides/thrash/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/thrash/overrides/thrash/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/multimds/verify/overrides/verify/whitelist_health.yaml ceph-15.2.11/qa/suites/multimds/verify/overrides/verify/whitelist_health.yaml --- ceph-15.2.8/qa/suites/multimds/verify/overrides/verify/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/verify/overrides/verify/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/multimds/verify/overrides/verify/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/multimds/verify/overrides/verify/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/multimds/verify/overrides/verify/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/verify/overrides/verify/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/multimds/verify/validater/valgrind.yaml ceph-15.2.11/qa/suites/multimds/verify/validater/valgrind.yaml --- ceph-15.2.8/qa/suites/multimds/verify/validater/valgrind.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/multimds/verify/validater/valgrind.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,11 +4,10 @@ overrides: install: ceph: - flavor: notcmalloc debuginfo: true ceph: # Valgrind makes everything slow, so ignore slow requests and extend heartbeat grace - log-whitelist: + log-ignorelist: - slow requests are blocked conf: global: diff -Nru ceph-15.2.8/qa/suites/perf-basic/ceph.yaml ceph-15.2.11/qa/suites/perf-basic/ceph.yaml --- ceph-15.2.8/qa/suites/perf-basic/ceph.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/perf-basic/ceph.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ - ceph: fs: xfs wait-for-scrub: false - log-whitelist: + log-ignorelist: - \(PG_ - \(OSD_ - \(OBJECT_ diff -Nru ceph-15.2.8/qa/suites/powercycle/osd/tasks/rados_api_tests.yaml ceph-15.2.11/qa/suites/powercycle/osd/tasks/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/powercycle/osd/tasks/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/powercycle/osd/tasks/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - \(POOL_APP_NOT_ENABLED\) - \(PG_AVAILABILITY\) diff -Nru ceph-15.2.8/qa/suites/powercycle/osd/thrashosds-health.yaml ceph-15.2.11/qa/suites/powercycle/osd/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/powercycle/osd/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/powercycle/osd/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/powercycle/osd/whitelist_health.yaml ceph-15.2.11/qa/suites/powercycle/osd/whitelist_health.yaml --- ceph-15.2.8/qa/suites/powercycle/osd/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/powercycle/osd/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MDS_TRIM\) - \(MDS_SLOW_REQUEST\) - MDS_SLOW_METADATA_IO diff -Nru ceph-15.2.8/qa/suites/rados/basic/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/basic/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/basic/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/basic/msgr-failures/many.yaml ceph-15.2.11/qa/suites/rados/basic/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/rados/basic/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 1500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_api_tests.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - but it is still running - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_python.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_python.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_python.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_python.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_stress_watch.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_stress_watch.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_stress_watch.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_stress_watch.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(TOO_FEW_PGS\) diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_big.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_big.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_big.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_big.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mix.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mix.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mix.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mix.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mostlyread.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mostlyread.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mostlyread.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/rados_workunit_loadgen_mostlyread.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/repair_test.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/repair_test.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/repair_test.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/repair_test.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: wait-for-scrub: false - log-whitelist: + log-ignorelist: - candidate had a stat error - candidate had a read error - deep-scrub 0 missing, 1 inconsistent objects diff -Nru ceph-15.2.8/qa/suites/rados/basic/tasks/scrub_test.yaml ceph-15.2.11/qa/suites/rados/basic/tasks/scrub_test.yaml --- ceph-15.2.8/qa/suites/rados/basic/tasks/scrub_test.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/basic/tasks/scrub_test.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: wait-for-scrub: false - log-whitelist: + log-ignorelist: - '!= data_digest' - '!= omap_digest' - '!= size' diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/orchestrator_cli/orchestrator_cli.yaml ceph-15.2.11/qa/suites/rados/cephadm/orchestrator_cli/orchestrator_cli.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/orchestrator_cli/orchestrator_cli.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/orchestrator_cli/orchestrator_cli.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(DEVICE_IDENT_ON\) diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/smoke/distro/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/rados/cephadm/smoke/distro/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/smoke/distro/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/smoke/distro/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/smoke/start.yaml ceph-15.2.11/qa/suites/rados/cephadm/smoke/start.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/smoke/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/smoke/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -11,3 +11,4 @@ - ceph orch ls - ceph orch host ls - ceph orch device ls + - ceph orch ls --format yaml diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/smoke-roleless/distro/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/rados/cephadm/smoke-roleless/distro/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/smoke-roleless/distro/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/smoke-roleless/distro/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/upgrade/3-start-upgrade.yaml ceph-15.2.11/qa/suites/rados/cephadm/upgrade/3-start-upgrade.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/upgrade/3-start-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/upgrade/3-start-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,4 +2,6 @@ - cephadm.shell: env: [sha1] mon.a: + - ceph config set mon mon_warn_on_insecure_global_id_reclaim false --force + - ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false --force - ceph orch upgrade start --image quay.ceph.io/ceph-ci/ceph:$sha1 diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/upgrade/distro$/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/rados/cephadm/upgrade/distro$/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/upgrade/distro$/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/upgrade/distro$/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/with-work/distro/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/rados/cephadm/with-work/distro/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/with-work/distro/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/with-work/distro/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/with-work/tasks/rados_api_tests.yaml ceph-15.2.11/qa/suites/rados/cephadm/with-work/tasks/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/with-work/tasks/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/with-work/tasks/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - but it is still running - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/with-work/tasks/rados_python.yaml ceph-15.2.11/qa/suites/rados/cephadm/with-work/tasks/rados_python.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/with-work/tasks/rados_python.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/with-work/tasks/rados_python.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/cephadm/workunits/distro/ubuntu_18.04_podman.yaml ceph-15.2.11/qa/suites/rados/cephadm/workunits/distro/ubuntu_18.04_podman.yaml --- ceph-15.2.8/qa/suites/rados/cephadm/workunits/distro/ubuntu_18.04_podman.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/cephadm/workunits/distro/ubuntu_18.04_podman.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,4 +9,4 @@ - echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list - sudo apt update - sudo apt -y install podman - - echo -e "[registries.search]\nregistries = ['docker.io']" | sudo tee /etc/containers/registries.conf + - echo -e "[[registry]]\nlocation = 'docker.io'\n\n[[registry.mirror]]\nlocation='docker-mirror.front.sepia.ceph.com:5000'\n" | sudo tee /etc/containers/registries.conf diff -Nru ceph-15.2.8/qa/suites/rados/dashboard/tasks/dashboard.yaml ceph-15.2.11/qa/suites/rados/dashboard/tasks/dashboard.yaml --- ceph-15.2.8/qa/suites/rados/dashboard/tasks/dashboard.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/dashboard/tasks/dashboard.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ @@ -22,6 +22,8 @@ - \(OSD_HOST_DOWN\) - \(POOL_APP_NOT_ENABLED\) - \(OSDMAP_FLAGS\) + - \(OSD_FLAGS\) + - \(TELEMETRY_CHANGED\) - pauserd,pausewr flag\(s\) set - Monitor daemon marked osd\.[[:digit:]]+ down, but it is still running - evicting unresponsive client .+ diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/crash.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/crash.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/crash.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/crash.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/failover.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/failover.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/failover.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/failover.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/insights.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/insights.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/insights.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/insights.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(MGR_INSIGHTS_WARNING\) diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/module_selftest.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/module_selftest.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/module_selftest.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/module_selftest.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/progress.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/progress.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/progress.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/progress.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(MDS_ALL_DOWN\) diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/prometheus.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/prometheus.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/prometheus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/prometheus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/mgr/tasks/workunits.yaml ceph-15.2.11/qa/suites/rados/mgr/tasks/workunits.yaml --- ceph-15.2.8/qa/suites/rados/mgr/tasks/workunits.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/mgr/tasks/workunits.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ # tests may leave mgrs broken, so don't try and call into them # to invoke e.g. pg dump during teardown. wait-for-scrub: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/ceph.yaml ceph-15.2.11/qa/suites/rados/monthrash/ceph.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/ceph.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/ceph.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -11,7 +11,7 @@ mon scrub inject crc mismatch: 0.01 mon scrub inject missing keys: 0.05 # thrashing monitors may make mgr have trouble w/ its keepalive - log-whitelist: + log-ignorelist: - ScrubResult - scrub mismatch - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/monthrash/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/msgr-failures/mon-delay.yaml ceph-15.2.11/qa/suites/rados/monthrash/msgr-failures/mon-delay.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/msgr-failures/mon-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/msgr-failures/mon-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -10,5 +10,5 @@ mon client directed command retry: 5 mgr: debug monc: 10 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/thrashers/force-sync-many.yaml ceph-15.2.11/qa/suites/rados/monthrash/thrashers/force-sync-many.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/thrashers/force-sync-many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/thrashers/force-sync-many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(TOO_FEW_PGS\) diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/thrashers/many.yaml ceph-15.2.11/qa/suites/rados/monthrash/thrashers/many.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/thrashers/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/thrashers/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) conf: diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/thrashers/one.yaml ceph-15.2.11/qa/suites/rados/monthrash/thrashers/one.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/thrashers/one.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/thrashers/one.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) tasks: diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/thrashers/sync-many.yaml ceph-15.2.11/qa/suites/rados/monthrash/thrashers/sync-many.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/thrashers/sync-many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/thrashers/sync-many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) conf: diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/thrashers/sync.yaml ceph-15.2.11/qa/suites/rados/monthrash/thrashers/sync.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/thrashers/sync.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/thrashers/sync.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) conf: diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/workloads/pool-create-delete.yaml ceph-15.2.11/qa/suites/rados/monthrash/workloads/pool-create-delete.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/workloads/pool-create-delete.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/workloads/pool-create-delete.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - slow request - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_5925.yaml ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_5925.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_5925.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_5925.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) tasks: diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_api_tests.yaml ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_mon_osdmap_prune.yaml ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_mon_osdmap_prune.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_mon_osdmap_prune.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_mon_osdmap_prune.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -10,7 +10,7 @@ mon osdmap full prune txsize: 100 osd: osd beacon report interval: 10 - log-whitelist: + log-ignorelist: # setting/unsetting noup will trigger health warns, # causing tests to fail due to health warns, even if # the tests themselves are successful. diff -Nru ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_mon_workunits.yaml ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_mon_workunits.yaml --- ceph-15.2.8/qa/suites/rados/monthrash/workloads/rados_mon_workunits.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/monthrash/workloads/rados_mon_workunits.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/multimon/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/multimon/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/multimon/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/multimon/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/multimon/msgr-failures/many.yaml ceph-15.2.11/qa/suites/rados/multimon/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/rados/multimon/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/multimon/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 1000 mon client directed command retry: 5 mon mgr beacon grace: 90 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_clock_no_skews.yaml ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_clock_no_skews.yaml --- ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_clock_no_skews.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_clock_no_skews.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - slow request - .*clock.*skew.* - clocks not synchronized diff -Nru ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_clock_with_skews.yaml ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_clock_with_skews.yaml --- ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_clock_with_skews.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_clock_with_skews.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ - date -u -s @$(expr $(date -u +%s) + 2) - ceph: wait-for-healthy: false - log-whitelist: + log-ignorelist: - .*clock.*skew.* - clocks not synchronized - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_recovery.yaml ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_recovery.yaml --- ceph-15.2.8/qa/suites/rados/multimon/tasks/mon_recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/multimon/tasks/mon_recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(PG_AVAILABILITY\) diff -Nru ceph-15.2.8/qa/suites/rados/objectstore/backends/ceph_objectstore_tool.yaml ceph-15.2.11/qa/suites/rados/objectstore/backends/ceph_objectstore_tool.yaml --- ceph-15.2.8/qa/suites/rados/objectstore/backends/ceph_objectstore_tool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/objectstore/backends/ceph_objectstore_tool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ osd max object namespace len: 64 osd: osd objectstore: filestore - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/perf/ceph.yaml ceph-15.2.11/qa/suites/rados/perf/ceph.yaml --- ceph-15.2.8/qa/suites/rados/perf/ceph.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/perf/ceph.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ - ceph: fs: xfs wait-for-scrub: false - log-whitelist: + log-ignorelist: - \(PG_ - \(OSD_ - \(OBJECT_ diff -Nru ceph-15.2.8/qa/suites/rados/rest/mgr-restful.yaml ceph-15.2.11/qa/suites/rados/rest/mgr-restful.yaml --- ceph-15.2.8/qa/suites/rados/rest/mgr-restful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/rest/mgr-restful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -7,7 +7,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MGR_DOWN\) - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/deduptool.yaml ceph-15.2.11/qa/suites/rados/singleton/all/deduptool.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/deduptool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/deduptool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - had wrong client addr - had wrong cluster addr diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/divergent_priors2.yaml ceph-15.2.11/qa/suites/rados/singleton/all/divergent_priors2.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/divergent_priors2.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/divergent_priors2.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/divergent_priors.yaml ceph-15.2.11/qa/suites/rados/singleton/all/divergent_priors.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/divergent_priors.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/divergent_priors.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/dump-stuck.yaml ceph-15.2.11/qa/suites/rados/singleton/all/dump-stuck.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/dump-stuck.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/dump-stuck.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/ec-lost-unfound.yaml ceph-15.2.11/qa/suites/rados/singleton/all/ec-lost-unfound.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/ec-lost-unfound.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/ec-lost-unfound.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ create_rbd_pool: false pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - objects unfound and apparently lost - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/lost-unfound-delete.yaml ceph-15.2.11/qa/suites/rados/singleton/all/lost-unfound-delete.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/lost-unfound-delete.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/lost-unfound-delete.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - objects unfound and apparently lost - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/lost-unfound.yaml ceph-15.2.11/qa/suites/rados/singleton/all/lost-unfound.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/lost-unfound.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/lost-unfound.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - objects unfound and apparently lost - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-mon.yaml ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-mon.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-mon.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-mon.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -18,7 +18,7 @@ osd: mon max pg per osd : 2 osd max pg per osd hard ratio : 1 - log-whitelist: + log-ignorelist: - \(TOO_FEW_PGS\) - \(PENDING_CREATING_PGS\) tasks: diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-primary.yaml ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-primary.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-primary.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-primary.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -20,7 +20,7 @@ osd: mon max pg per osd : 1 osd max pg per osd hard ratio : 1 - log-whitelist: + log-ignorelist: - \(TOO_FEW_PGS\) - \(PG_ - \(PENDING_CREATING_PGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-replica.yaml ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-replica.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/max-pg-per-osd.from-replica.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/max-pg-per-osd.from-replica.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -20,7 +20,7 @@ osd: mon max pg per osd : 1 osd max pg per osd hard ratio : 1 - log-whitelist: + log-ignorelist: - \(TOO_FEW_PGS\) - \(PG_ - \(PENDING_CREATING_PGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/mon-auth-caps.yaml ceph-15.2.11/qa/suites/rados/singleton/all/mon-auth-caps.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/mon-auth-caps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/mon-auth-caps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -10,7 +10,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(AUTH_BAD_CAPS\) - workunit: diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/mon-config-key-caps.yaml ceph-15.2.11/qa/suites/rados/singleton/all/mon-config-key-caps.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/mon-config-key-caps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/mon-config-key-caps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -10,7 +10,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(AUTH_BAD_CAPS\) - workunit: diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/mon-memory-target-compliance.yaml.disabled ceph-15.2.11/qa/suites/rados/singleton/all/mon-memory-target-compliance.yaml.disabled --- ceph-15.2.8/qa/suites/rados/singleton/all/mon-memory-target-compliance.yaml.disabled 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/mon-memory-target-compliance.yaml.disabled 2021-04-19 13:47:30.000000000 +0000 @@ -44,7 +44,7 @@ create_rbd_pool: false pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/osd-backfill.yaml ceph-15.2.11/qa/suites/rados/singleton/all/osd-backfill.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/osd-backfill.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/osd-backfill.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/osd-recovery-incomplete.yaml ceph-15.2.11/qa/suites/rados/singleton/all/osd-recovery-incomplete.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/osd-recovery-incomplete.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/osd-recovery-incomplete.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/osd-recovery.yaml ceph-15.2.11/qa/suites/rados/singleton/all/osd-recovery.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/osd-recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/osd-recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/peer.yaml ceph-15.2.11/qa/suites/rados/singleton/all/peer.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/peer.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/peer.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -18,7 +18,7 @@ config: global: osd pool default min size : 1 - log-whitelist: + log-ignorelist: - objects unfound and apparently lost - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/pg-autoscaler-progress-off.yaml ceph-15.2.11/qa/suites/rados/singleton/all/pg-autoscaler-progress-off.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/pg-autoscaler-progress-off.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/pg-autoscaler-progress-off.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,44 @@ +roles: +- - mon.a + - mgr.x + - osd.0 + - osd.1 + - osd.2 + - osd.3 + - client.0 +- - mon.b + - mon.c + - osd.4 + - osd.5 + - osd.6 + - osd.7 +openstack: + - volumes: # attached to each instance + count: 4 + size: 10 # GB +tasks: +- install: +- ceph: + create_rbd_pool: false + pre-mgr-commands: + - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force + log-ignorelist: + - overall HEALTH_ + - \(OSDMAP_FLAGS\) + - \(OSD_ + - \(PG_ + - \(POOL_ + - \(CACHE_POOL_ + - \(OBJECT_ + - \(SLOW_OPS\) + - \(REQUEST_SLOW\) + - \(TOO_FEW_PGS\) + - slow request +- exec: + client.0: + - ceph progress off + +- workunit: + clients: + all: + - mon/pg_autoscaler.sh diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/pg-autoscaler.yaml ceph-15.2.11/qa/suites/rados/singleton/all/pg-autoscaler.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/pg-autoscaler.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/pg-autoscaler.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -22,7 +22,7 @@ create_rbd_pool: false pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/pg-removal-interruption.yaml ceph-15.2.11/qa/suites/rados/singleton/all/pg-removal-interruption.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/pg-removal-interruption.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/pg-removal-interruption.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - slow request - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/radostool.yaml ceph-15.2.11/qa/suites/rados/singleton/all/radostool.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/radostool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/radostool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - had wrong client addr - had wrong cluster addr diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/random-eio.yaml ceph-15.2.11/qa/suites/rados/singleton/all/random-eio.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/random-eio.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/random-eio.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - missing primary copy of - objects unfound and apparently lost - had a read error diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/rebuild-mondb.yaml ceph-15.2.11/qa/suites/rados/singleton/all/rebuild-mondb.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/rebuild-mondb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/rebuild-mondb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - no reply from - overall HEALTH_ - \(MON_DOWN\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/recovery-preemption.yaml ceph-15.2.11/qa/suites/rados/singleton/all/recovery-preemption.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/recovery-preemption.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/recovery-preemption.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -23,7 +23,7 @@ osd max pg log entries: 1000 osd_target_pg_log_entries_per_osd: 0 osd pg log trim min: 10 - log-whitelist: + log-ignorelist: - \(POOL_APP_NOT_ENABLED\) - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/resolve_stuck_peering.yaml ceph-15.2.11/qa/suites/rados/singleton/all/resolve_stuck_peering.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/resolve_stuck_peering.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/resolve_stuck_peering.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,7 +8,7 @@ pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/test-crash.yaml ceph-15.2.11/qa/suites/rados/singleton/all/test-crash.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/test-crash.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/test-crash.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - Reduced data availability - OSD_.*DOWN - \(RECENT_CRASH\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/test_envlibrados_for_rocksdb.yaml ceph-15.2.11/qa/suites/rados/singleton/all/test_envlibrados_for_rocksdb.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/test_envlibrados_for_rocksdb.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/test_envlibrados_for_rocksdb.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) - workunit: diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/thrash-backfill-full.yaml ceph-15.2.11/qa/suites/rados/singleton/all/thrash-backfill-full.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/thrash-backfill-full.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/thrash-backfill-full.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -24,7 +24,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - missing primary copy of - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/thrash_cache_writeback_proxy_none.yaml ceph-15.2.11/qa/suites/rados/singleton/all/thrash_cache_writeback_proxy_none.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/thrash_cache_writeback_proxy_none.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/thrash_cache_writeback_proxy_none.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - slow request - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/thrash-eio.yaml ceph-15.2.11/qa/suites/rados/singleton/all/thrash-eio.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/thrash-eio.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/thrash-eio.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -22,7 +22,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - missing primary copy of - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/thrash-rados/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/singleton/all/thrash-rados/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/thrash-rados/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/thrash-rados/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/thrash-rados/thrash-rados.yaml ceph-15.2.11/qa/suites/rados/singleton/all/thrash-rados/thrash-rados.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/thrash-rados/thrash-rados.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/thrash-rados/thrash-rados.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -15,7 +15,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - thrashosds: op_delay: 30 diff -Nru ceph-15.2.8/qa/suites/rados/singleton/all/watch-notify-same-primary.yaml ceph-15.2.11/qa/suites/rados/singleton/all/watch-notify-same-primary.yaml --- ceph-15.2.8/qa/suites/rados/singleton/all/watch-notify-same-primary.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/all/watch-notify-same-primary.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -23,7 +23,7 @@ debug ms: 1 debug objecter: 20 debug rados: 20 - log-whitelist: + log-ignorelist: - objects unfound and apparently lost - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/singleton/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/singleton/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/singleton/msgr-failures/many.yaml ceph-15.2.11/qa/suites/rados/singleton/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/rados/singleton/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ mon client directed command retry: 5 mgr: debug monc: 10 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/singleton-bluestore/all/cephtool.yaml ceph-15.2.11/qa/suites/rados/singleton-bluestore/all/cephtool.yaml --- ceph-15.2.8/qa/suites/rados/singleton-bluestore/all/cephtool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-bluestore/all/cephtool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - had wrong client addr - had wrong cluster addr diff -Nru ceph-15.2.8/qa/suites/rados/singleton-bluestore/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/singleton-bluestore/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/singleton-bluestore/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-bluestore/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/singleton-bluestore/msgr-failures/many.yaml ceph-15.2.11/qa/suites/rados/singleton-bluestore/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/rados/singleton-bluestore/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-bluestore/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ mon client directed command retry: 5 mgr: debug monc: 10 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/admin_socket_output.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/admin_socket_output.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/admin_socket_output.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/admin_socket_output.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ - [mon.a, mds.a, mgr.x, osd.0, osd.1, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - MDS in read-only mode - force file system read-only - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/balancer.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/balancer.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/balancer.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/balancer.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force fs: xfs - log-whitelist: + log-ignorelist: - \(PG_AVAILABILITY\) - cram: clients: diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/cache-fs-trunc.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/cache-fs-trunc.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/cache-fs-trunc.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/cache-fs-trunc.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) conf: diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/ceph-kvstore-tool.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/ceph-kvstore-tool.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/ceph-kvstore-tool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/ceph-kvstore-tool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/export-after-evict.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/export-after-evict.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/export-after-evict.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/export-after-evict.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,7 +14,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) conf: diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/full-tiering.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/full-tiering.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/full-tiering.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/full-tiering.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -7,7 +7,7 @@ - [mon.a, mgr.x, osd.0, osd.1, osd.2, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - is full - overall HEALTH_ - \(POOL_FULL\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/health-warnings.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/health-warnings.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/health-warnings.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/health-warnings.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -10,7 +10,7 @@ # we may land on ext4 osd max object name len: 400 osd max object namespace len: 64 - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/large-omap-object-warnings.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/large-omap-object-warnings.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/large-omap-object-warnings.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/large-omap-object-warnings.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,7 +8,7 @@ ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - \(OSDMAP_FLAGS\) - \(OSD_FULL\) - \(MDS_READ_ONLY\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/lazy_omap_stats_output.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/lazy_omap_stats_output.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/lazy_omap_stats_output.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/lazy_omap_stats_output.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ - [mon.a, mgr.x, osd.0, osd.1, osd.2, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - \(POOL_APP_NOT_ENABLED\) tasks: - install: diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/librados_hello_world.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/librados_hello_world.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/librados_hello_world.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/librados_hello_world.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ - [mon.a, mds.a, mgr.x, osd.0, osd.1, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - \(POOL_APP_NOT_ENABLED\) tasks: - install: diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/multi-backfill-reject.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/multi-backfill-reject.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/multi-backfill-reject.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/multi-backfill-reject.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ - ceph: pre-mgr-commands: - sudo ceph config set mgr mgr/devicehealth/enable_monitoring false --force - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(PG_ - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/osd_stale_reads.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/osd_stale_reads.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/osd_stale_reads.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/osd_stale_reads.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ - [mon.a, mgr.x, osd.0, osd.1, osd.2, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - \(OSD_DOWN\) - \(POOL_APP_NOT_ENABLED\) - \(SLOW_OPS\) diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/recovery-unfound-found.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/recovery-unfound-found.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/recovery-unfound-found.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/recovery-unfound-found.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -19,7 +19,7 @@ osd: osd recovery sleep: .1 osd objectstore: filestore - log-whitelist: + log-ignorelist: - \(POOL_APP_NOT_ENABLED\) - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/version-number-sanity.yaml ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/version-number-sanity.yaml --- ceph-15.2.8/qa/suites/rados/singleton-nomsgr/all/version-number-sanity.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/singleton-nomsgr/all/version-number-sanity.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ - [mon.a, mds.a, mgr.x, osd.0, osd.1, client.0] overrides: ceph: - log-whitelist: + log-ignorelist: - \(POOL_APP_NOT_ENABLED\) tasks: - install: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/0-size-min-size-overrides/2-size-2-min-size.yaml ceph-15.2.11/qa/suites/rados/thrash/0-size-min-size-overrides/2-size-2-min-size.yaml --- ceph-15.2.8/qa/suites/rados/thrash/0-size-min-size-overrides/2-size-2-min-size.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/0-size-min-size-overrides/2-size-2-min-size.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: osd_pool_default_size: 2 osd_pool_default_min_size: 2 - log-whitelist: + log-ignorelist: - \(REQUEST_STUCK\) diff -Nru ceph-15.2.8/qa/suites/rados/thrash/crc-failures/bad_map_crc_failure.yaml ceph-15.2.11/qa/suites/rados/thrash/crc-failures/bad_map_crc_failure.yaml --- ceph-15.2.8/qa/suites/rados/thrash/crc-failures/bad_map_crc_failure.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/crc-failures/bad_map_crc_failure.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,5 +3,5 @@ conf: osd: osd inject bad map crc probability: 0.1 - log-whitelist: + log-ignorelist: - failed to encode map diff -Nru ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashers/mapgap.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashers/mapgap.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashers/mapgap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashers/mapgap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - osd_map_cache_size diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ filestore queue throttle high multiple: 2 filestore queue throttle max multiple: 10 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-agent-big.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-agent-big.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-agent-big.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-agent-big.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-agent-small.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-agent-small.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-agent-small.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-agent-small.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-pool-snaps-readproxy.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-pool-snaps-readproxy.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-pool-snaps-readproxy.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-pool-snaps-readproxy.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-pool-snaps.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-pool-snaps.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-pool-snaps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-pool-snaps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-snaps-balanced.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-snaps-balanced.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-snaps-balanced.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-snaps-balanced.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-snaps.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-snaps.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache-snaps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache-snaps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/cache.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/cache.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/cache.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/cache.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate conf: osd: diff -Nru ceph-15.2.8/qa/suites/rados/thrash/workloads/rados_api_tests.yaml ceph-15.2.11/qa/suites/rados/thrash/workloads/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/rados/thrash/workloads/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash/workloads/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - \(POOL_APP_NOT_ENABLED\) - \(PG_AVAILABILITY\) diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/fastread.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/fastread.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/fastread.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/fastread.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/minsize_recovery.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/minsize_recovery.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/minsize_recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/minsize_recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost create_rbd_pool: False diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ osd scrub min interval: 60 osd scrub max interval: 120 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - slow request diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - slow request diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/fastread.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/fastread.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/fastread.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/fastread.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/mapgap.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/mapgap.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/mapgap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/mapgap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - osd_map_cache_size diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ osd scrub min interval: 60 osd scrub max interval: 120 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-big/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-big/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/mapgap.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/mapgap.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/mapgap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/mapgap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - osd_map_cache_size diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ filestore queue throttle high multiple: 2 filestore queue throttle max multiple: 10 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-isa/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-isa/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/fastread.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/fastread.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/fastread.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/fastread.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/minsize_recovery.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/minsize_recovery.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/minsize_recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/minsize_recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost create_rbd_pool: False diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ osd scrub min interval: 60 osd scrub max interval: 120 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-overwrites/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-overwrites/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - slow request diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - slow request diff -Nru ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-erasure-code-shec/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-erasure-code-shec/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/0-size-min-size-overrides/2-size-2-min-size.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/0-size-min-size-overrides/2-size-2-min-size.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/0-size-min-size-overrides/2-size-2-min-size.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/0-size-min-size-overrides/2-size-2-min-size.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: osd_pool_default_size: 2 osd_pool_default_min_size: 2 - log-whitelist: + log-ignorelist: - \(REQUEST_STUCK\) diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/jewel-v1only.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/jewel-v1only.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/jewel-v1only.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/jewel-v1only.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/jewel.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/jewel.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/jewel.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/jewel.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/luminous-v1only.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/luminous-v1only.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/luminous-v1only.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/luminous-v1only.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/luminous.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/luminous.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/luminous.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/luminous.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/mimic-v1only.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/mimic-v1only.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/mimic-v1only.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/mimic-v1only.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/mimic.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/mimic.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus-v1only.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus-v1only.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus-v1only.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus-v1only.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ overrides: ceph: mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus-v2only.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus-v2only.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus-v2only.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus-v2only.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) conf: global: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/1-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/1-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) tasks: - install: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/ceph.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/ceph.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/ceph.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/ceph.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,2 +1,5 @@ tasks: - cephadm: + conf: + mon: + auth allow insecure global id reclaim: true diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/fastclose.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/fastclose.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/fastclose.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/fastclose.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,5 +5,5 @@ ms inject socket failures: 2500 ms tcp read timeout: 5 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,5 +6,5 @@ mon client directed command retry: 5 osd: osd heartbeat use min delay socket: true - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/osd-delay.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/osd-delay.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/msgr-failures/osd-delay.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/msgr-failures/osd-delay.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,5 +8,5 @@ ms inject delay max: 1 ms inject internal delays: .002 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/careful.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/careful.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/careful.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/careful.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/default.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/mapgap.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/mapgap.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/mapgap.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/mapgap.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - osd_map_cache_size diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/morepggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/morepggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/morepggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/morepggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ filestore queue throttle high multiple: 2 filestore queue throttle max multiple: 10 osd max backfills: 9 - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/pggrow.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/pggrow.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashers/pggrow.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashers/pggrow.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost conf: diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/thrash-old-clients/workloads/cache-snaps.yaml ceph-15.2.11/qa/suites/rados/thrash-old-clients/workloads/cache-snaps.yaml --- ceph-15.2.8/qa/suites/rados/thrash-old-clients/workloads/cache-snaps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/thrash-old-clients/workloads/cache-snaps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - must scrub before tier agent can activate tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/1-install/mimic.yaml ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/1-install/mimic.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/1-install/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/1-install/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) - \(MGR_DOWN\) - slow request diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/3-thrash/default.yaml ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - log bound mismatch diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/6-finish-upgrade.yaml ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/6-finish-upgrade.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/6-finish-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/6-finish-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ restartin remaining osds overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/mimic-x-singleton/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/mimic-x-singleton/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/1-install/nautilus.yaml ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/1-install/nautilus.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/1-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/1-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,9 +1,10 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) - \(MGR_DOWN\) - slow request + - evicting unresponsive client meta: - desc: install ceph/nautilus latest tasks: diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/3-thrash/default.yaml ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - log bound mismatch diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ restartin remaining osds overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/upgrade/nautilus-x-singleton/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/upgrade/nautilus-x-singleton/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/valgrind-leaks/1-start.yaml ceph-15.2.11/qa/suites/rados/valgrind-leaks/1-start.yaml --- ceph-15.2.8/qa/suites/rados/valgrind-leaks/1-start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/valgrind-leaks/1-start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,10 +6,9 @@ overrides: install: ceph: - flavor: notcmalloc debuginfo: true ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(PG_ conf: diff -Nru ceph-15.2.8/qa/suites/rados/verify/d-thrash/default/default.yaml ceph-15.2.11/qa/suites/rados/verify/d-thrash/default/default.yaml --- ceph-15.2.8/qa/suites/rados/verify/d-thrash/default/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/d-thrash/default/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rados/verify/d-thrash/default/thrashosds-health.yaml ceph-15.2.11/qa/suites/rados/verify/d-thrash/default/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rados/verify/d-thrash/default/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/d-thrash/default/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rados/verify/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rados/verify/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rados/verify/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rados/verify/tasks/mon_recovery.yaml ceph-15.2.11/qa/suites/rados/verify/tasks/mon_recovery.yaml --- ceph-15.2.8/qa/suites/rados/verify/tasks/mon_recovery.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/tasks/mon_recovery.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/rados/verify/tasks/rados_api_tests.yaml ceph-15.2.11/qa/suites/rados/verify/tasks/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/rados/verify/tasks/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/tasks/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rados/verify/validater/valgrind.yaml ceph-15.2.11/qa/suites/rados/verify/validater/valgrind.yaml --- ceph-15.2.8/qa/suites/rados/verify/validater/valgrind.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rados/verify/validater/valgrind.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,6 @@ overrides: install: ceph: - flavor: notcmalloc debuginfo: true ceph: conf: @@ -16,7 +15,7 @@ osd fast shutdown: false debug bluestore: 1 debug bluefs: 1 - log-whitelist: + log-ignorelist: - overall HEALTH_ # valgrind is slow.. we might get PGs stuck peering etc - \(PG_ diff -Nru ceph-15.2.8/qa/suites/rbd/basic/cachepool/small.yaml ceph-15.2.11/qa/suites/rbd/basic/cachepool/small.yaml --- ceph-15.2.8/qa/suites/rbd/basic/cachepool/small.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/basic/cachepool/small.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/basic/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/basic/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/basic/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/basic/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/basic/tasks/rbd_api_tests_old_format.yaml ceph-15.2.11/qa/suites/rbd/basic/tasks/rbd_api_tests_old_format.yaml --- ceph-15.2.8/qa/suites/rbd/basic/tasks/rbd_api_tests_old_format.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/basic/tasks/rbd_api_tests_old_format.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/basic/tasks/rbd_python_api_tests_old_format.yaml ceph-15.2.11/qa/suites/rbd/basic/tasks/rbd_python_api_tests_old_format.yaml --- ceph-15.2.8/qa/suites/rbd/basic/tasks/rbd_python_api_tests_old_format.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/basic/tasks/rbd_python_api_tests_old_format.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(SLOW_OPS\) - slow request tasks: diff -Nru ceph-15.2.8/qa/suites/rbd/cli/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/cli/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/cli/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/cli/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/cli/pool/ec-data-pool.yaml ceph-15.2.11/qa/suites/rbd/cli/pool/ec-data-pool.yaml --- ceph-15.2.8/qa/suites/rbd/cli/pool/ec-data-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/cli/pool/ec-data-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ bdev_inject_crash_probability: .5 ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) conf: diff -Nru ceph-15.2.8/qa/suites/rbd/cli/pool/small-cache-pool.yaml ceph-15.2.11/qa/suites/rbd/cli/pool/small-cache-pool.yaml --- ceph-15.2.8/qa/suites/rbd/cli/pool/small-cache-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/cli/pool/small-cache-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/cli_v1/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/cli_v1/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/cli_v1/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/cli_v1/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/cli_v1/pool/small-cache-pool.yaml ceph-15.2.11/qa/suites/rbd/cli_v1/pool/small-cache-pool.yaml --- ceph-15.2.8/qa/suites/rbd/cli_v1/pool/small-cache-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/cli_v1/pool/small-cache-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/immutable-object-cache/workloads/c_api_tests_with_defaults.yaml ceph-15.2.11/qa/suites/rbd/immutable-object-cache/workloads/c_api_tests_with_defaults.yaml --- ceph-15.2.8/qa/suites/rbd/immutable-object-cache/workloads/c_api_tests_with_defaults.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/immutable-object-cache/workloads/c_api_tests_with_defaults.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/librbd/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/librbd/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/librbd/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/librbd/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,6 +4,6 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - but it is still running - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/librbd/pool/small-cache-pool.yaml ceph-15.2.11/qa/suites/rbd/librbd/pool/small-cache-pool.yaml --- ceph-15.2.8/qa/suites/rbd/librbd/pool/small-cache-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/librbd/pool/small-cache-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests_with_defaults.yaml ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests_with_defaults.yaml --- ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests_with_defaults.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests_with_defaults.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests_with_journaling.yaml ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests_with_journaling.yaml --- ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests_with_journaling.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests_with_journaling.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests.yaml ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests.yaml --- ceph-15.2.8/qa/suites/rbd/librbd/workloads/c_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/librbd/workloads/c_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/mirror/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/mirror/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/mirror/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-journal-stress-workunit.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-journal-stress-workunit.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-journal-stress-workunit.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-journal-stress-workunit.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,15 @@ +meta: +- desc: run the rbd_mirror_stress.sh workunit to test the rbd-mirror daemon +tasks: +- workunit: + clients: + cluster1.client.mirror: [rbd/rbd_mirror_stress.sh] + env: + # override workunit setting of CEPH_ARGS='--cluster' + CEPH_ARGS: '' + RBD_MIRROR_INSTANCES: '4' + RBD_MIRROR_USE_EXISTING_CLUSTER: '1' + RBD_MIRROR_USE_RBD_MIRROR: '1' + MIRROR_POOL_MODE: 'pool' + MIRROR_IMAGE_MODE: 'journal' + timeout: 6h diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-exclusive-lock.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-exclusive-lock.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-exclusive-lock.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-exclusive-lock.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,16 @@ +meta: +- desc: run the rbd_mirror_stress.sh workunit to test the rbd-mirror daemon +tasks: +- workunit: + clients: + cluster1.client.mirror: [rbd/rbd_mirror_stress.sh] + env: + # override workunit setting of CEPH_ARGS='--cluster' + CEPH_ARGS: '' + MIRROR_POOL_MODE: 'image' + MIRROR_IMAGE_MODE: 'snapshot' + RBD_IMAGE_FEATURES: 'layering,exclusive-lock' + RBD_MIRROR_INSTANCES: '4' + RBD_MIRROR_USE_EXISTING_CLUSTER: '1' + RBD_MIRROR_USE_RBD_MIRROR: '1' + timeout: 6h diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-fast-diff.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-fast-diff.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-fast-diff.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-fast-diff.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,16 @@ +meta: +- desc: run the rbd_mirror_stress.sh workunit to test the rbd-mirror daemon +tasks: +- workunit: + clients: + cluster1.client.mirror: [rbd/rbd_mirror_stress.sh] + env: + # override workunit setting of CEPH_ARGS='--cluster' + CEPH_ARGS: '' + MIRROR_POOL_MODE: 'image' + MIRROR_IMAGE_MODE: 'snapshot' + RBD_IMAGE_FEATURES: 'layering,exclusive-lock,object-map,fast-diff' + RBD_MIRROR_INSTANCES: '4' + RBD_MIRROR_USE_EXISTING_CLUSTER: '1' + RBD_MIRROR_USE_RBD_MIRROR: '1' + timeout: 6h diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-minimum.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-minimum.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-minimum.yaml 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-snapshot-stress-workunit-minimum.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,16 @@ +meta: +- desc: run the rbd_mirror_stress.sh workunit to test the rbd-mirror daemon +tasks: +- workunit: + clients: + cluster1.client.mirror: [rbd/rbd_mirror_stress.sh] + env: + # override workunit setting of CEPH_ARGS='--cluster' + CEPH_ARGS: '' + MIRROR_POOL_MODE: 'image' + MIRROR_IMAGE_MODE: 'snapshot' + RBD_IMAGE_FEATURES: 'layering' + RBD_MIRROR_INSTANCES: '4' + RBD_MIRROR_USE_EXISTING_CLUSTER: '1' + RBD_MIRROR_USE_RBD_MIRROR: '1' + timeout: 6h diff -Nru ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-stress-workunit.yaml ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-stress-workunit.yaml --- ceph-15.2.8/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-stress-workunit.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/mirror-thrash/workloads/rbd-mirror-stress-workunit.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -meta: -- desc: run the rbd_mirror_stress.sh workunit to test the rbd-mirror daemon -tasks: -- workunit: - clients: - cluster1.client.mirror: [rbd/rbd_mirror_stress.sh] - env: - # override workunit setting of CEPH_ARGS='--cluster' - CEPH_ARGS: '' - RBD_MIRROR_INSTANCES: '4' - RBD_MIRROR_USE_EXISTING_CLUSTER: '1' - RBD_MIRROR_USE_RBD_MIRROR: '1' - timeout: 6h diff -Nru ceph-15.2.8/qa/suites/rbd/nbd/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/nbd/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/nbd/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/nbd/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/nbd/thrashers/cache.yaml ceph-15.2.11/qa/suites/rbd/nbd/thrashers/cache.yaml --- ceph-15.2.8/qa/suites/rbd/nbd/thrashers/cache.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/nbd/thrashers/cache.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rbd/nbd/thrashers/default.yaml ceph-15.2.11/qa/suites/rbd/nbd/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rbd/nbd/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/nbd/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rbd/nbd/thrashosds-health.yaml ceph-15.2.11/qa/suites/rbd/nbd/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rbd/nbd/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/nbd/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rbd/qemu/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/qemu/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/qemu/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/qemu/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,6 +4,6 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - but it is still running - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/qemu/pool/ec-cache-pool.yaml ceph-15.2.11/qa/suites/rbd/qemu/pool/ec-cache-pool.yaml --- ceph-15.2.8/qa/suites/rbd/qemu/pool/ec-cache-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/qemu/pool/ec-cache-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/qemu/pool/small-cache-pool.yaml ceph-15.2.11/qa/suites/rbd/qemu/pool/small-cache-pool.yaml --- ceph-15.2.8/qa/suites/rbd/qemu/pool/small-cache-pool.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/qemu/pool/small-cache-pool.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NEAR_FULL\) - \(CACHE_POOL_NO_HIT_SET\) diff -Nru ceph-15.2.8/qa/suites/rbd/singleton/all/rbd_mirror.yaml ceph-15.2.11/qa/suites/rbd/singleton/all/rbd_mirror.yaml --- ceph-15.2.8/qa/suites/rbd/singleton/all/rbd_mirror.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/singleton/all/rbd_mirror.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ - install: - ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/singleton/all/rbd_tasks.yaml ceph-15.2.11/qa/suites/rbd/singleton/all/rbd_tasks.yaml --- ceph-15.2.8/qa/suites/rbd/singleton/all/rbd_tasks.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/singleton/all/rbd_tasks.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ - install: - ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/singleton-bluestore/all/issue-20295.yaml ceph-15.2.11/qa/suites/rbd/singleton-bluestore/all/issue-20295.yaml --- ceph-15.2.8/qa/suites/rbd/singleton-bluestore/all/issue-20295.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/singleton-bluestore/all/issue-20295.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - 'application not enabled' - workunit: timeout: 30m diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rbd/thrash/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/thrashers/cache.yaml ceph-15.2.11/qa/suites/rbd/thrash/thrashers/cache.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/thrashers/cache.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/thrashers/cache.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/thrashers/default.yaml ceph-15.2.11/qa/suites/rbd/thrash/thrashers/default.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost tasks: diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/thrashosds-health.yaml ceph-15.2.11/qa/suites/rbd/thrash/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_copy_on_read.yaml ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_copy_on_read.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_copy_on_read.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_copy_on_read.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -7,7 +7,7 @@ RBD_FEATURES: "61" overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_journaling.yaml ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_journaling.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_journaling.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_journaling.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_no_locking.yaml ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_no_locking.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests_no_locking.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests_no_locking.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests.yaml ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests.yaml --- ceph-15.2.8/qa/suites/rbd/thrash/workloads/rbd_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/thrash/workloads/rbd_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/valgrind/validator/memcheck.yaml ceph-15.2.11/qa/suites/rbd/valgrind/validator/memcheck.yaml --- ceph-15.2.8/qa/suites/rbd/valgrind/validator/memcheck.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/valgrind/validator/memcheck.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,6 @@ overrides: install: ceph: - flavor: notcmalloc debuginfo: true rbd_fsx: valgrind: ["--tool=memcheck"] diff -Nru ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests_with_defaults.yaml ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests_with_defaults.yaml --- ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests_with_defaults.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests_with_defaults.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests_with_journaling.yaml ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests_with_journaling.yaml --- ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests_with_journaling.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests_with_journaling.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests.yaml ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests.yaml --- ceph-15.2.8/qa/suites/rbd/valgrind/workloads/c_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/valgrind/workloads/c_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rbd/valgrind/workloads/rbd_mirror.yaml ceph-15.2.11/qa/suites/rbd/valgrind/workloads/rbd_mirror.yaml --- ceph-15.2.8/qa/suites/rbd/valgrind/workloads/rbd_mirror.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rbd/valgrind/workloads/rbd_mirror.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(CACHE_POOL_NO_HIT_SET\) - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/rgw/multisite/overrides.yaml ceph-15.2.11/qa/suites/rgw/multisite/overrides.yaml --- ceph-15.2.8/qa/suites/rgw/multisite/overrides.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/multisite/overrides.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -13,5 +13,6 @@ rgw curl low speed time: 300 rgw md log max shards: 4 rgw data log num shards: 4 + rgw sync obj etag verify: true rgw: compression type: random diff -Nru ceph-15.2.8/qa/suites/rgw/multisite/valgrind.yaml ceph-15.2.11/qa/suites/rgw/multisite/valgrind.yaml --- ceph-15.2.8/qa/suites/rgw/multisite/valgrind.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/multisite/valgrind.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,6 @@ overrides: install: ceph: -# flavor: notcmalloc ceph: conf: global: diff -Nru ceph-15.2.8/qa/suites/rgw/thrash/thrashosds-health.yaml ceph-15.2.11/qa/suites/rgw/thrash/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/rgw/thrash/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/thrash/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/rgw/verify/msgr-failures/few.yaml ceph-15.2.11/qa/suites/rgw/verify/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/rgw/verify/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/verify/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/rgw/verify/validater/valgrind.yaml ceph-15.2.11/qa/suites/rgw/verify/validater/valgrind.yaml --- ceph-15.2.8/qa/suites/rgw/verify/validater/valgrind.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/verify/validater/valgrind.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,6 @@ overrides: install: ceph: -# flavor: notcmalloc #debuginfo: true ceph: conf: diff -Nru ceph-15.2.8/qa/suites/rgw/website/overrides.yaml ceph-15.2.11/qa/suites/rgw/website/overrides.yaml --- ceph-15.2.8/qa/suites/rgw/website/overrides.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/rgw/website/overrides.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,6 @@ overrides: install: -# flavor: notcmalloc ceph: conf: global: diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/mon_thrash.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/mon_thrash.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/mon_thrash.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/mon_thrash.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - mons down - overall HEALTH_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_api_tests.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_api_tests.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ - install: null - ceph: fs: ext4 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_bench.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_bench.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_bench.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_bench.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ - install: null - ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_cache_snaps.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_cache_snaps.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_cache_snaps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_cache_snaps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: null - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_ec_snaps.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_ec_snaps.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_ec_snaps.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_ec_snaps.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ - install: null - ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_python.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_python.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_python.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_python.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(OSDMAP_FLAGS\) diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_workunit_loadgen_mix.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_workunit_loadgen_mix.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rados_workunit_loadgen_mix.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rados_workunit_loadgen_mix.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ - install: - ceph: fs: ext4 - log-whitelist: + log-ignorelist: - but it is still running - overall HEALTH_ - \(POOL_APP_NOT_ENABLED\) diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rbd_api_tests.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rbd_api_tests.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rbd_api_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rbd_api_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/smoke/basic/tasks/rbd_fsx.yaml ceph-15.2.11/qa/suites/smoke/basic/tasks/rbd_fsx.yaml --- ceph-15.2.8/qa/suites/smoke/basic/tasks/rbd_fsx.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/smoke/basic/tasks/rbd_fsx.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/stress/thrash/thrashers/default.yaml ceph-15.2.11/qa/suites/stress/thrash/thrashers/default.yaml --- ceph-15.2.8/qa/suites/stress/thrash/thrashers/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/stress/thrash/thrashers/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - thrashosds: diff -Nru ceph-15.2.8/qa/suites/stress/thrash/thrashers/fast.yaml ceph-15.2.11/qa/suites/stress/thrash/thrashers/fast.yaml --- ceph-15.2.8/qa/suites/stress/thrash/thrashers/fast.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/stress/thrash/thrashers/fast.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - thrashosds: diff -Nru ceph-15.2.8/qa/suites/stress/thrash/thrashers/more-down.yaml ceph-15.2.11/qa/suites/stress/thrash/thrashers/more-down.yaml --- ceph-15.2.8/qa/suites/stress/thrash/thrashers/more-down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/stress/thrash/thrashers/more-down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,7 +1,7 @@ tasks: - install: - ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - thrashosds: diff -Nru ceph-15.2.8/qa/suites/teuthology/multi-cluster/all/upgrade.yaml ceph-15.2.11/qa/suites/teuthology/multi-cluster/all/upgrade.yaml --- ceph-15.2.8/qa/suites/teuthology/multi-cluster/all/upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/teuthology/multi-cluster/all/upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - failed to encode map conf: mon: diff -Nru ceph-15.2.8/qa/suites/tgt/basic/msgr-failures/few.yaml ceph-15.2.11/qa/suites/tgt/basic/msgr-failures/few.yaml --- ceph-15.2.8/qa/suites/tgt/basic/msgr-failures/few.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/tgt/basic/msgr-failures/few.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 5000 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/tgt/basic/msgr-failures/many.yaml ceph-15.2.11/qa/suites/tgt/basic/msgr-failures/many.yaml --- ceph-15.2.8/qa/suites/tgt/basic/msgr-failures/many.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/tgt/basic/msgr-failures/many.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,5 +4,5 @@ global: ms inject socket failures: 500 mon client directed command retry: 5 - log-whitelist: + log-ignorelist: - \(OSD_SLOW_PING_TIME diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/3-compat_client/mimic.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/3-compat_client/mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/3-compat_client/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/old_client/tasks/3-compat_client/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/4-compat_client.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/4-compat_client.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/4-compat_client.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/featureful_client/upgraded_client/tasks/4-compat_client.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_health.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_health.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_FAILED\) diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/overrides/whitelist_wrongly_marked_down.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSD_DOWN\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/0-mimic.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/0-mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/0-mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/0-mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -17,7 +17,7 @@ - ceph: mon_bind_addrvec: false mon_bind_msgr2: false - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/2-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/2-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/2-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/2-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/3-verify.yaml ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/3-verify.yaml --- ceph-15.2.8/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/3-verify.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/cephfs/volumes/import-legacy/tasks/3-verify.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - missing required features tasks: - exec: diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -29,7 +29,7 @@ ceph: mon_bind_msgr2: false mon_bind_addrvec: false - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/1-ceph-install/mimic.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/1-ceph-install/mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/1-ceph-install/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/1-ceph-install/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ extra_packages: ['librados2'] - print: "**** done installing mimic" - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/6-final-workload/rados_mon_thrash.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/6-final-workload/rados_mon_thrash.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/parallel/6-final-workload/rados_mon_thrash.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/parallel/6-final-workload/rados_mon_thrash.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ librados C and C++ api tests overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - \(REQUEST_SLOW\) tasks: diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -11,7 +11,7 @@ mon_bind_msgr2: false mon_bind_addrvec: false fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(MGR_DOWN\) diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - wrongly marked me down - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -11,7 +11,7 @@ mon_bind_msgr2: false mon_bind_addrvec: false fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(MGR_DOWN\) diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - wrongly marked me down - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x/stress-split-erasure-code/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x/stress-split-erasure-code/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/1-install/mimic.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/1-install/mimic.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/1-install/mimic.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/1-install/mimic.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) - \(MGR_DOWN\) - slow request diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - log bound mismatch diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/6-finish-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/6-finish-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/6-finish-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/6-finish-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ restartin remaining osds overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/mimic-x-singleton/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/mimic-x-singleton/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -28,7 +28,7 @@ - client.3 overrides: ceph: - log-whitelist: + log-ignorelist: - scrub mismatch - ScrubResult - wrongly marked diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/1-ceph-install/nautilus.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/1-ceph-install/nautilus.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/1-ceph-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/1-ceph-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -12,7 +12,7 @@ branch: nautilus - print: "**** done installing nautilus" - ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_ - \(MDS_ @@ -26,6 +26,7 @@ - Monitor daemon marked osd - Behind on trimming - Manager daemon + - evicting unresponsive client conf: global: mon warn on pool no app: false diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/5-final-workload/rados_mon_thrash.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/5-final-workload/rados_mon_thrash.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/parallel/5-final-workload/rados_mon_thrash.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/parallel/5-final-workload/rados_mon_thrash.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ librados C and C++ api tests overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - \(REQUEST_SLOW\) tasks: diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,7 +8,7 @@ mon_bind_msgr2: false mon_bind_addrvec: false fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(MGR_DOWN\) diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/1-ceph-install/nautilus.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/1-ceph-install/nautilus.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/1-ceph-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/1-ceph-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,6 +14,11 @@ bluestore_warn_on_legacy_statfs: false bluestore warn on no per pool omap: false mon pg warn min per osd: 0 + mon: + mon_warn_on_insecure_global_id_reclaim: false + mon_warn_on_insecure_global_id_reclaim_allowed: false + log-ignorelist: + - evicting unresponsive client - exec: osd.0: - ceph osd require-osd-release nautilus diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - wrongly marked me down - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -8,7 +8,7 @@ mon_bind_msgr2: false mon_bind_addrvec: false fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(MGR_DOWN\) diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/1-nautilus-install/nautilus.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/1-nautilus-install/nautilus.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/1-nautilus-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/1-nautilus-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -14,6 +14,11 @@ bluestore_warn_on_legacy_statfs: false bluestore warn on no per pool omap: false mon pg warn min per osd: 0 + mon: + mon_warn_on_insecure_global_id_reclaim: false + mon_warn_on_insecure_global_id_reclaim_allowed: false + log-ignorelist: + - evicting unresponsive client - exec: osd.0: - ceph osd require-osd-release nautilus diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - wrongly marked me down - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x/stress-split-erasure-code/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/1-install/nautilus.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/1-install/nautilus.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/1-install/nautilus.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/1-install/nautilus.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,9 +1,10 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - \(MON_DOWN\) - \(MGR_DOWN\) - slow request + - evicting unresponsive client meta: - desc: install ceph/nautilus latest tasks: diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - objects unfound and apparently lost - log bound mismatch diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/6-finish-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ restartin remaining osds overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(FS_DEGRADED\) - \(MDS_ diff -Nru ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/nautilus-x-singleton/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/nautilus-x-singleton/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-parallel/point-to-point-upgrade.yaml ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-parallel/point-to-point-upgrade.yaml --- ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-parallel/point-to-point-upgrade.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-parallel/point-to-point-upgrade.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -11,7 +11,7 @@ run workload and upgrade-sequence in parallel overrides: ceph: - log-whitelist: + log-ignorelist: - reached quota - scrub - osd_map_max_advance diff -Nru ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ overrides: ceph: fs: xfs - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(MON_DOWN\) - \(MGR_DOWN\) diff -Nru ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/3-thrash/default.yaml ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/3-thrash/default.yaml --- ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/3-thrash/default.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/3-thrash/default.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -4,7 +4,7 @@ small chance to increase the number of pgs overrides: ceph: - log-whitelist: + log-ignorelist: - but it is still running - wrongly marked me down - objects unfound and apparently lost diff -Nru ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/thrashosds-health.yaml ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/thrashosds-health.yaml --- ceph-15.2.8/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade/octopus-p2p/octopus-p2p-stress-split/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ overrides: ceph: - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/0-cluster/start.yaml ceph-15.2.11/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/0-cluster/start.yaml --- ceph-15.2.8/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/0-cluster/start.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/0-cluster/start.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -16,6 +16,6 @@ - - client.1 overrides: ceph: - #log-whitelist: + #log-ignorelist: #- failed to encode map fs: xfs diff -Nru ceph-15.2.8/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/3-workload/rbd_notification_tests.yaml ceph-15.2.11/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/3-workload/rbd_notification_tests.yaml --- ceph-15.2.8/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/3-workload/rbd_notification_tests.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/suites/upgrade-clients/client-upgrade-octopus-pacific/octopus-client-x/rbd/3-workload/rbd_notification_tests.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -27,7 +27,7 @@ RBD_FEATURES: "61" - workunit: #The line below to change to 'pacific' - branch: master + branch: pacific clients: client.1: - rbd/notify_master.sh diff -Nru ceph-15.2.8/qa/tasks/cephadm.conf ceph-15.2.11/qa/tasks/cephadm.conf --- ceph-15.2.8/qa/tasks/cephadm.conf 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephadm.conf 2021-04-19 13:47:30.000000000 +0000 @@ -73,6 +73,14 @@ mon osd prime pg temp = true mon reweight min bytes per osd = 10 +# rotate auth tickets quickly to exercise renewal paths +auth mon ticket ttl = 660 # 11m +auth service ticket ttl = 240 # 4m + +# don't complain about global id reclaim +mon_warn_on_insecure_global_id_reclaim = false +mon_warn_on_insecure_global_id_reclaim_allowed = false + [client.rgw] rgw cache enabled = true rgw enable ops log = true diff -Nru ceph-15.2.8/qa/tasks/cephadm.py ceph-15.2.11/qa/tasks/cephadm.py --- ceph-15.2.8/qa/tasks/cephadm.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephadm.py 2021-04-19 13:47:30.000000000 +0000 @@ -212,13 +212,13 @@ return None if first_in_ceph_log('\[ERR\]|\[WRN\]|\[SEC\]', - config.get('log-whitelist')) is not None: + config.get('log-ignorelist')) is not None: log.warning('Found errors (ERR|WRN|SEC) in cluster log') ctx.summary['success'] = False # use the most severe problem as the failure reason if 'failure_reason' not in ctx.summary: for pattern in ['\[SEC\]', '\[ERR\]', '\[WRN\]']: - match = first_in_ceph_log(pattern, config['log-whitelist']) + match = first_in_ceph_log(pattern, config['log-ignorelist']) if match is not None: ctx.summary['failure_reason'] = \ '"{match}" in cluster log'.format( @@ -1317,13 +1317,17 @@ } else: v2 = config # type: ignore - dockers = [r for r in v2['registry'] if r['prefix'] == 'docker.io'] + dockers = [ + r for r in v2['registry'] if + r.get('prefix') == 'docker.io' or r.get('location') == 'docker.io' + ] if dockers: docker = dockers[0] - docker['mirror'] = [{ - "location": mirror, - "insecure": True, - }] + if 'mirror' not in docker: + docker['mirror'] = [{ + "location": mirror, + "insecure": True, + }] return v2 diff -Nru ceph-15.2.8/qa/tasks/ceph.conf.template ceph-15.2.11/qa/tasks/ceph.conf.template --- ceph-15.2.8/qa/tasks/ceph.conf.template 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/ceph.conf.template 2021-04-19 13:47:30.000000000 +0000 @@ -90,6 +90,14 @@ mon osd prime pg temp = true mon reweight min bytes per osd = 10 + # rotate auth tickets quickly to exercise renewal paths + auth mon ticket ttl = 660 # 11m + auth service ticket ttl = 240 # 4m + + # don't complain about insecure global_id in the test suite + mon_warn_on_insecure_global_id_reclaim = false + mon_warn_on_insecure_global_id_reclaim_allowed = false + [client] rgw cache enabled = true rgw enable ops log = true diff -Nru ceph-15.2.8/qa/tasks/cephfs/cephfs_test_case.py ceph-15.2.11/qa/tasks/cephfs/cephfs_test_case.py --- ceph-15.2.8/qa/tasks/cephfs/cephfs_test_case.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/cephfs_test_case.py 2021-04-19 13:47:30.000000000 +0000 @@ -227,6 +227,9 @@ def _session_by_id(self, session_ls): return dict([(s['id'], s) for s in session_ls]) + def perf_dump(self, rank=None, status=None): + return self.fs.rank_asok(['perf', 'dump'], rank=rank, status=status) + def wait_until_evicted(self, client_id, timeout=30): def is_client_evicted(): ls = self._session_list() diff -Nru ceph-15.2.8/qa/tasks/cephfs/filesystem.py ceph-15.2.11/qa/tasks/cephfs/filesystem.py --- ceph-15.2.8/qa/tasks/cephfs/filesystem.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/filesystem.py 2021-04-19 13:47:30.000000000 +0000 @@ -510,7 +510,7 @@ while count > max_mds: targets = sorted(self.get_ranks(status=status), key=lambda r: r['rank'], reverse=True) target = targets[0] - log.info("deactivating rank %d" % target['rank']) + log.debug("deactivating rank %d" % target['rank']) self.deactivate(target['rank']) status = self.wait_for_daemons(skip_max_mds_check=True) count = len(list(self.get_ranks(status=status))) @@ -571,7 +571,7 @@ else: data_pool_name = self.data_pool_name - log.info("Creating filesystem '{0}'".format(self.name)) + log.debug("Creating filesystem '{0}'".format(self.name)) self.mon_manager.raw_cluster_cmd('osd', 'pool', 'create', self.metadata_pool_name, self.pgs_per_fs_pool.__str__()) @@ -581,7 +581,7 @@ '--allow-dangerous-metadata-overlay') else: if self.ec_profile and 'disabled' not in self.ec_profile: - log.info("EC profile is %s", self.ec_profile) + log.debug("EC profile is %s", self.ec_profile) cmd = ['osd', 'erasure-code-profile', 'set', data_pool_name] cmd.extend(self.ec_profile) self.mon_manager.raw_cluster_cmd(*cmd) @@ -782,7 +782,7 @@ else: raise - log.info("are_daemons_healthy: mds map: {0}".format(mds_map)) + log.debug("are_daemons_healthy: mds map: {0}".format(mds_map)) for mds_id, mds_status in mds_map['info'].items(): if mds_status['state'] not in ["up:active", "up:standby", "up:standby-replay"]: @@ -791,13 +791,13 @@ elif mds_status['state'] == 'up:active': active_count += 1 - log.info("are_daemons_healthy: {0}/{1}".format( + log.debug("are_daemons_healthy: {0}/{1}".format( active_count, mds_map['max_mds'] )) if not skip_max_mds_check: if active_count > mds_map['max_mds']: - log.info("are_daemons_healthy: number of actives is greater than max_mds: {0}".format(mds_map)) + log.debug("are_daemons_healthy: number of actives is greater than max_mds: {0}".format(mds_map)) return False elif active_count == mds_map['max_mds']: # The MDSMap says these guys are active, but let's check they really are @@ -821,7 +821,7 @@ else: return False else: - log.info("are_daemons_healthy: skipping max_mds check") + log.debug("are_daemons_healthy: skipping max_mds check") return True def get_daemon_names(self, state=None, status=None): @@ -932,7 +932,7 @@ elapsed += 1 if elapsed > timeout: - log.info("status = {0}".format(status)) + log.debug("status = {0}".format(status)) raise RuntimeError("Timed out waiting for MDS daemons to become healthy") status = self.status() @@ -1014,7 +1014,7 @@ journal_header_dump = self.get_metadata_object('Journaler::Header', journal_header_object) version = journal_header_dump['journal_header']['stream_format'] - log.info("Read journal version {0}".format(version)) + log.debug("Read journal version {0}".format(version)) return version @@ -1079,11 +1079,11 @@ try: mds_info = status.get_rank(self.id, rank) current_state = mds_info['state'] if mds_info else None - log.info("Looked up MDS state for mds.{0}: {1}".format(rank, current_state)) + log.debug("Looked up MDS state for mds.{0}: {1}".format(rank, current_state)) except: mdsmap = self.get_mds_map(status=status) if rank in mdsmap['failed']: - log.info("Waiting for rank {0} to come back.".format(rank)) + log.debug("Waiting for rank {0} to come back.".format(rank)) current_state = None else: raise @@ -1091,7 +1091,7 @@ # mds_info is None if no daemon with this ID exists in the map mds_info = status.get_mds(mds_id) current_state = mds_info['state'] if mds_info else None - log.info("Looked up MDS state for {0}: {1}".format(mds_id, current_state)) + log.debug("Looked up MDS state for {0}: {1}".format(mds_id, current_state)) else: # In general, look for a single MDS states = [m['state'] for m in status.get_ranks(self.id)] @@ -1101,11 +1101,11 @@ current_state = reject else: current_state = None - log.info("mapped states {0} to {1}".format(states, current_state)) + log.debug("mapped states {0} to {1}".format(states, current_state)) elapsed = time.time() - started_at if current_state == goal_state: - log.info("reached state '{0}' in {1}s".format(current_state, elapsed)) + log.debug("reached state '{0}' in {1}s".format(current_state, elapsed)) return elapsed elif reject is not None and current_state == reject: raise RuntimeError("MDS in reject state {0}".format(current_state)) @@ -1237,12 +1237,12 @@ missing = set(want_objects) - set(exist_objects) if missing: - log.info("Objects missing (ino {0}, size {1}): {2}".format( + log.debug("Objects missing (ino {0}, size {1}): {2}".format( ino, size, missing )) return False else: - log.info("All objects for ino {0} size {1} found".format(ino, size)) + log.debug("All objects for ino {0} size {1} found".format(ino, size)) return True def data_objects_absent(self, ino, size): @@ -1250,12 +1250,12 @@ present = set(want_objects) & set(exist_objects) if present: - log.info("Objects not absent (ino {0}, size {1}): {2}".format( + log.debug("Objects not absent (ino {0}, size {1}): {2}".format( ino, size, present )) return False else: - log.info("All objects for ino {0} size {1} are absent".format(ino, size)) + log.debug("All objects for ino {0} size {1} are absent".format(ino, size)) return True def dirfrag_exists(self, ino, frag): @@ -1374,7 +1374,7 @@ t1 = datetime.datetime.now() r = self.tool_remote.sh(script=base_args + args, stdout=StringIO()).strip() duration = datetime.datetime.now() - t1 - log.info("Ran {0} in time {1}, result:\n{2}".format( + log.debug("Ran {0} in time {1}, result:\n{2}".format( base_args + args, duration, r )) return r diff -Nru ceph-15.2.8/qa/tasks/cephfs/mount.py ceph-15.2.11/qa/tasks/cephfs/mount.py --- ceph-15.2.8/qa/tasks/cephfs/mount.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/mount.py 2021-04-19 13:47:30.000000000 +0000 @@ -7,6 +7,8 @@ from six import StringIO from textwrap import dedent import os + +from teuthology.misc import sudo_write_file from teuthology.orchestra import run from teuthology.orchestra.run import CommandFailedError, ConnectionLostError, Raw from tasks.cephfs.filesystem import Filesystem @@ -173,6 +175,29 @@ if r.exitstatus != 0: raise RuntimeError("Expected file {0} not found".format(suffix)) + def write_file(self, path, data, perms=None): + """ + Write the given data at the given path and set the given perms to the + file on the path. + """ + if path.find(self.mountpoint) == -1: + path = os.path.join(self.mountpoint, path) + + sudo_write_file(self.client_remote, path, data) + + if perms: + self.run_shell(args=f'chmod {perms} {path}') + + def read_file(self, path): + """ + Return the data from the file on given path. + """ + if path.find(self.mountpoint) == -1: + path = os.path.join(self.mountpoint, path) + + return self.run_shell(args=['sudo', 'cat', path], omit_sudo=False).\ + stdout.getvalue().strip() + def create_destroy(self): assert(self.is_mounted()) @@ -201,7 +226,7 @@ return self.run_shell(["bash", "-c", Raw(f"'{payload}'")], **kwargs) def run_shell(self, args, wait=True, stdin=None, check_status=True, - omit_sudo=True): + omit_sudo=True, timeout=10800): if isinstance(args, str): args = args.split() @@ -209,7 +234,8 @@ return self.client_remote.run(args=args, stdout=StringIO(), stderr=StringIO(), wait=wait, stdin=stdin, check_status=check_status, - omit_sudo=omit_sudo) + omit_sudo=omit_sudo, + timeout=timeout) def open_no_data(self, basename): """ diff -Nru ceph-15.2.8/qa/tasks/cephfs/test_client_limits.py ceph-15.2.11/qa/tasks/cephfs/test_client_limits.py --- ceph-15.2.8/qa/tasks/cephfs/test_client_limits.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/test_client_limits.py 2021-04-19 13:47:30.000000000 +0000 @@ -156,6 +156,36 @@ else: raise RuntimeError("expected no client recall warning") + def test_cap_acquisition_throttle_readdir(self): + """ + Mostly readdir acquires caps faster than the mds recalls, so the cap + acquisition via readdir is throttled by retrying the readdir after + a fraction of second (0.5) by default when throttling condition is met. + """ + + max_caps_per_client = 500 + cap_acquisition_throttle = 250 + + self.config_set('mds', 'mds_max_caps_per_client', max_caps_per_client) + self.config_set('mds', 'mds_session_cap_acquisition_throttle', cap_acquisition_throttle) + + # Create 1500 files split across 6 directories, 250 each. + for i in range(1, 7): + self.mount_a.create_n_files("dir{0}/file".format(i), cap_acquisition_throttle, sync=True) + + mount_a_client_id = self.mount_a.get_global_id() + + # recursive readdir + self.mount_a.run_shell_payload("find | wc") + + # validate cap_acquisition decay counter after readdir to exceed throttle count i.e 250 + cap_acquisition_value = self.get_session(mount_a_client_id)['cap_acquisition']['value'] + self.assertGreaterEqual(cap_acquisition_value, cap_acquisition_throttle) + + # validate the throttle condition to be hit atleast once + cap_acquisition_throttle_hit_count = self.perf_dump()['mds_server']['cap_acquisition_throttle'] + self.assertGreaterEqual(cap_acquisition_throttle_hit_count, 1) + def test_client_release_bug(self): """ When a client has a bug (which we will simulate) preventing it from releasing caps, diff -Nru ceph-15.2.8/qa/tasks/cephfs/test_nfs.py ceph-15.2.11/qa/tasks/cephfs/test_nfs.py --- ceph-15.2.8/qa/tasks/cephfs/test_nfs.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/test_nfs.py 2021-04-19 13:47:30.000000000 +0000 @@ -425,12 +425,14 @@ ''' self._test_create_cluster() info_output = json.loads(self._nfs_cmd('cluster', 'info', self.cluster_id)) + info_ip = info_output[self.cluster_id][0].pop("ip") host_details = {self.cluster_id: [{ "hostname": self._sys_cmd(['hostname']).decode("utf-8").strip(), - "ip": list(set(self._sys_cmd(['hostname', '-I']).decode("utf-8").split())), "port": 2049 }]} + host_ip = self._sys_cmd(['hostname', '-I']).decode("utf-8").split() self.assertDictEqual(info_output, host_details) + self.assertTrue(any([ip in info_ip for ip in host_ip])) self._test_delete_cluster() def test_cluster_set_reset_user_config(self): diff -Nru ceph-15.2.8/qa/tasks/cephfs/test_volume_client.py ceph-15.2.11/qa/tasks/cephfs/test_volume_client.py --- ceph-15.2.8/qa/tasks/cephfs/test_volume_client.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/test_volume_client.py 2021-04-19 13:47:30.000000000 +0000 @@ -745,10 +745,10 @@ # for different volumes, versioning details, etc. expected_auth_metadata = { "version": 2, - "compat_version": 1, + "compat_version": 6, "dirty": False, "tenant_id": "tenant1", - "volumes": { + "subvolumes": { "groupid/volumeid": { "dirty": False, "access_level": "rw" @@ -856,7 +856,7 @@ volume_id = "volumeid" # Create auth_id - out = self.fs.mon_manager.raw_cluster_cmd( + self.fs.mon_manager.raw_cluster_cmd( "auth", "get-or-create", "client.guest1", "mds", "allow *", "osd", "allow rw", @@ -918,7 +918,7 @@ volume_id = "volumeid" # Create auth_id - out = self.fs.mon_manager.raw_cluster_cmd( + self.fs.mon_manager.raw_cluster_cmd( "auth", "get-or-create", "client.guest1", "mds", "allow *", "osd", "allow rw", @@ -1100,6 +1100,441 @@ auth_id=guestclient["auth_id"], ))) + def test_update_old_style_auth_metadata_to_new_during_recover(self): + """ + From nautilus onwards 'volumes' created by ceph_volume_client were + renamed and used as CephFS subvolumes accessed via the ceph-mgr + interface. Hence it makes sense to store the subvolume data in + auth-metadata file with 'subvolumes' key instead of 'volumes' key. + This test validates the transparent update of 'volumes' key to + 'subvolumes' key in auth metadata file during recover. + """ + volumeclient_mount = self.mounts[1] + volumeclient_mount.umount_wait() + + # Configure volumeclient_mount as the handle for driving volumeclient. + self._configure_vc_auth(volumeclient_mount, "manila") + + group_id = "groupid" + volume_id = "volumeid" + + guestclient = { + "auth_id": "guest", + "tenant_id": "tenant", + } + + # Create a volume. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.create_volume(vp, 1024*1024*10) + """.format( + group_id=group_id, + volume_id=volume_id, + ))) + + # Check that volume metadata file is created on volume creation. + vol_metadata_filename = "_{0}:{1}.meta".format(group_id, volume_id) + self.assertIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + + # Authorize 'guestclient' access to the volume. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.authorize(vp, "{auth_id}", tenant_id="{tenant_id}") + """.format( + group_id=group_id, + volume_id=volume_id, + auth_id=guestclient["auth_id"], + tenant_id=guestclient["tenant_id"] + ))) + + # Check that auth metadata file for auth ID 'guest' is created. + auth_metadata_filename = "${0}.meta".format(guestclient["auth_id"]) + self.assertIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Replace 'subvolumes' to 'volumes', old style auth-metadata file + self.mounts[0].run_shell(['sed', '-i', 's/subvolumes/volumes/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Verify that the auth metadata file stores the tenant ID that the + # auth ID belongs to, the auth ID's authorized access levels + # for different volumes, versioning details, etc. + expected_auth_metadata = { + "version": 2, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant", + "subvolumes": { + "groupid/volumeid": { + "dirty": False, + "access_level": "rw" + } + } + } + + # Induce partial auth update state by modifying the auth metadata file, + # and then run recovery procedure. This should also update 'volumes' key + # to 'subvolumes'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + auth_metadata = vc._auth_metadata_get("{auth_id}") + auth_metadata['dirty'] = True + vc._auth_metadata_set("{auth_id}", auth_metadata) + vc.recover() + """.format( + group_id=group_id, + volume_id=volume_id, + auth_id=guestclient["auth_id"], + ))) + + auth_metadata = self._volume_client_python(volumeclient_mount, dedent(""" + import json + auth_metadata = vc._auth_metadata_get("{auth_id}") + print(json.dumps(auth_metadata)) + """.format( + auth_id=guestclient["auth_id"], + ))) + auth_metadata = json.loads(auth_metadata) + + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # Check that auth metadata file is cleaned up on removing + # auth ID's access to volumes 'volumeid'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.deauthorize(vp, "{guest_entity}") + """.format( + group_id=group_id, + volume_id=volume_id, + guest_entity=guestclient["auth_id"] + ))) + self.assertNotIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Check that volume metadata file is cleaned up on volume deletion. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.delete_volume(vp) + """.format( + group_id=group_id, + volume_id=volume_id, + ))) + self.assertNotIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + + def test_update_old_style_auth_metadata_to_new_during_authorize(self): + """ + From nautilus onwards 'volumes' created by ceph_volume_client were + renamed and used as CephFS subvolumes accessed via the ceph-mgr + interface. Hence it makes sense to store the subvolume data in + auth-metadata file with 'subvolumes' key instead of 'volumes' key. + This test validates the transparent update of 'volumes' key to + 'subvolumes' key in auth metadata file during authorize. + """ + volumeclient_mount = self.mounts[1] + volumeclient_mount.umount_wait() + + # Configure volumeclient_mount as the handle for driving volumeclient. + self._configure_vc_auth(volumeclient_mount, "manila") + + group_id = "groupid" + volume_id1 = "volumeid1" + volume_id2 = "volumeid2" + + auth_id = "guest" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # Create a volume volumeid1. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + create_result = vc.create_volume(vp, 10*1024*1024) + print(create_result['mount_path']) + """.format( + group_id=group_id, + volume_id=volume_id1, + ))) + + # Create a volume volumeid2. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + create_result = vc.create_volume(vp, 10*1024*1024) + print(create_result['mount_path']) + """.format( + group_id=group_id, + volume_id=volume_id2, + ))) + + # Check that volume metadata file is created on volume creation. + vol_metadata_filename = "_{0}:{1}.meta".format(group_id, volume_id1) + self.assertIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + vol_metadata_filename2 = "_{0}:{1}.meta".format(group_id, volume_id2) + self.assertIn(vol_metadata_filename2, self.mounts[0].ls("volumes")) + + # Authorize 'guestclient_1', using auth ID 'guest' and belonging to + # 'tenant1', with 'rw' access to the volume 'volumeid1'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.authorize(vp, "{auth_id}", tenant_id="{tenant_id}") + """.format( + group_id=group_id, + volume_id=volume_id1, + auth_id=guestclient_1["auth_id"], + tenant_id=guestclient_1["tenant_id"] + ))) + + # Check that auth metadata file for auth ID 'guest', is + # created on authorizing 'guest' access to the volume. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Replace 'subvolumes' to 'volumes', old style auth-metadata file + self.mounts[0].run_shell(['sed', '-i', 's/subvolumes/volumes/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Authorize 'guestclient_1', using auth ID 'guest' and belonging to + # 'tenant1', with 'rw' access to the volume 'volumeid2'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.authorize(vp, "{auth_id}", tenant_id="{tenant_id}") + """.format( + group_id=group_id, + volume_id=volume_id2, + auth_id=guestclient_1["auth_id"], + tenant_id=guestclient_1["tenant_id"] + ))) + + # Verify that the auth metadata file stores the tenant ID that the + # auth ID belongs to, the auth ID's authorized access levels + # for different volumes, versioning details, etc. + expected_auth_metadata = { + "version": 2, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant1", + "subvolumes": { + "groupid/volumeid1": { + "dirty": False, + "access_level": "rw" + }, + "groupid/volumeid2": { + "dirty": False, + "access_level": "rw" + } + } + } + + auth_metadata = self._volume_client_python(volumeclient_mount, dedent(""" + import json + auth_metadata = vc._auth_metadata_get("{auth_id}") + print(json.dumps(auth_metadata)) + """.format( + auth_id=guestclient_1["auth_id"], + ))) + auth_metadata = json.loads(auth_metadata) + + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # Check that auth metadata file is cleaned up on removing + # auth ID's access to volumes 'volumeid1' and 'volumeid2'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.deauthorize(vp, "{guest_entity}") + """.format( + group_id=group_id, + volume_id=volume_id1, + guest_entity=guestclient_1["auth_id"] + ))) + + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.deauthorize(vp, "{guest_entity}") + """.format( + group_id=group_id, + volume_id=volume_id2, + guest_entity=guestclient_1["auth_id"] + ))) + self.assertNotIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Check that volume metadata file is cleaned up on volume deletion. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.delete_volume(vp) + """.format( + group_id=group_id, + volume_id=volume_id1, + ))) + self.assertNotIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + + # Check that volume metadata file is cleaned up on volume deletion. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.delete_volume(vp) + """.format( + group_id=group_id, + volume_id=volume_id2, + ))) + self.assertNotIn(vol_metadata_filename2, self.mounts[0].ls("volumes")) + + def test_update_old_style_auth_metadata_to_new_during_deauthorize(self): + """ + From nautilus onwards 'volumes' created by ceph_volume_client were + renamed and used as CephFS subvolumes accessed via the ceph-mgr + interface. Hence it makes sense to store the subvolume data in + auth-metadata file with 'subvolumes' key instead of 'volumes' key. + This test validates the transparent update of 'volumes' key to + 'subvolumes' key in auth metadata file during de-authorize. + """ + volumeclient_mount = self.mounts[1] + volumeclient_mount.umount_wait() + + # Configure volumeclient_mount as the handle for driving volumeclient. + self._configure_vc_auth(volumeclient_mount, "manila") + + group_id = "groupid" + volume_id1 = "volumeid1" + volume_id2 = "volumeid2" + + auth_id = "guest" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # Create a volume volumeid1. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + create_result = vc.create_volume(vp, 10*1024*1024) + print(create_result['mount_path']) + """.format( + group_id=group_id, + volume_id=volume_id1, + ))) + + # Create a volume volumeid2. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + create_result = vc.create_volume(vp, 10*1024*1024) + print(create_result['mount_path']) + """.format( + group_id=group_id, + volume_id=volume_id2, + ))) + + # Check that volume metadata file is created on volume creation. + vol_metadata_filename = "_{0}:{1}.meta".format(group_id, volume_id1) + self.assertIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + vol_metadata_filename2 = "_{0}:{1}.meta".format(group_id, volume_id2) + self.assertIn(vol_metadata_filename2, self.mounts[0].ls("volumes")) + + # Authorize 'guestclient_1', using auth ID 'guest' and belonging to + # 'tenant1', with 'rw' access to the volume 'volumeid1'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.authorize(vp, "{auth_id}", tenant_id="{tenant_id}") + """.format( + group_id=group_id, + volume_id=volume_id1, + auth_id=guestclient_1["auth_id"], + tenant_id=guestclient_1["tenant_id"] + ))) + + # Authorize 'guestclient_1', using auth ID 'guest' and belonging to + # 'tenant1', with 'rw' access to the volume 'volumeid2'. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.authorize(vp, "{auth_id}", tenant_id="{tenant_id}") + """.format( + group_id=group_id, + volume_id=volume_id2, + auth_id=guestclient_1["auth_id"], + tenant_id=guestclient_1["tenant_id"] + ))) + + # Check that auth metadata file for auth ID 'guest', is + # created on authorizing 'guest' access to the volume. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Replace 'subvolumes' to 'volumes', old style auth-metadata file + self.mounts[0].run_shell(['sed', '-i', 's/subvolumes/volumes/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Deauthorize 'guestclient_1' to access 'volumeid2'. This should update + # 'volumes' key to 'subvolumes' + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.deauthorize(vp, "{guest_entity}") + """.format( + group_id=group_id, + volume_id=volume_id2, + guest_entity=guestclient_1["auth_id"], + ))) + + # Verify that the auth metadata file stores the tenant ID that the + # auth ID belongs to, the auth ID's authorized access levels + # for different volumes, versioning details, etc. + expected_auth_metadata = { + "version": 2, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant1", + "subvolumes": { + "groupid/volumeid1": { + "dirty": False, + "access_level": "rw" + } + } + } + + auth_metadata = self._volume_client_python(volumeclient_mount, dedent(""" + import json + auth_metadata = vc._auth_metadata_get("{auth_id}") + print(json.dumps(auth_metadata)) + """.format( + auth_id=guestclient_1["auth_id"], + ))) + auth_metadata = json.loads(auth_metadata) + + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # Check that auth metadata file is cleaned up on removing + # auth ID's access to volumes 'volumeid1' and 'volumeid2' + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.deauthorize(vp, "{guest_entity}") + """.format( + group_id=group_id, + volume_id=volume_id1, + guest_entity=guestclient_1["auth_id"] + ))) + self.assertNotIn(auth_metadata_filename, self.mounts[0].ls("volumes")) + + # Check that volume metadata file is cleaned up on 'volumeid1' deletion. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.delete_volume(vp) + """.format( + group_id=group_id, + volume_id=volume_id1, + ))) + self.assertNotIn(vol_metadata_filename, self.mounts[0].ls("volumes")) + + # Check that volume metadata file is cleaned up on 'volumeid2' deletion. + self._volume_client_python(volumeclient_mount, dedent(""" + vp = VolumePath("{group_id}", "{volume_id}") + vc.delete_volume(vp) + """.format( + group_id=group_id, + volume_id=volume_id2, + ))) + self.assertNotIn(vol_metadata_filename2, self.mounts[0].ls("volumes")) + def test_put_object(self): vc_mount = self.mounts[1] vc_mount.umount_wait() diff -Nru ceph-15.2.8/qa/tasks/cephfs/test_volumes.py ceph-15.2.11/qa/tasks/cephfs/test_volumes.py --- ceph-15.2.8/qa/tasks/cephfs/test_volumes.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/cephfs/test_volumes.py 2021-04-19 13:47:30.000000000 +0000 @@ -5,9 +5,14 @@ import random import logging import collections +import uuid +import unittest +from hashlib import md5 +from textwrap import dedent from tasks.cephfs.cephfs_test_case import CephFSTestCase from teuthology.exceptions import CommandFailedError +from teuthology.misc import sudo_write_file log = logging.getLogger(__name__) @@ -20,7 +25,7 @@ TEST_FILE_NAME_PREFIX="subvolume_file" # for filling subvolume with data - CLIENTS_REQUIRED = 1 + CLIENTS_REQUIRED = 2 MDSS_REQUIRED = 2 # io defaults @@ -56,9 +61,22 @@ def _check_clone_canceled(self, clone, clone_group=None): self.__check_clone_state("canceled", clone, clone_group, timo=1) - def _verify_clone_attrs(self, subvolume, clone, source_group=None, clone_group=None): - path1 = self._get_subvolume_path(self.volname, subvolume, group_name=source_group) - path2 = self._get_subvolume_path(self.volname, clone, group_name=clone_group) + def _get_subvolume_snapshot_path(self, subvolume, snapshot, source_group, subvol_path, source_version): + if source_version == 2: + # v2 + if subvol_path is not None: + (base_path, uuid_str) = os.path.split(subvol_path) + else: + (base_path, uuid_str) = os.path.split(self._get_subvolume_path(self.volname, subvolume, group_name=source_group)) + return os.path.join(base_path, ".snap", snapshot, uuid_str) + + # v1 + base_path = self._get_subvolume_path(self.volname, subvolume, group_name=source_group) + return os.path.join(base_path, ".snap", snapshot) + + def _verify_clone_attrs(self, source_path, clone_path): + path1 = source_path + path2 = clone_path p = self.mount_a.run_shell(["find", path1]) paths = p.stdout.getvalue().strip().split() @@ -92,12 +110,38 @@ cval = int(self.mount_a.run_shell(['stat', '-c' '%Y', sink_path]).stdout.getvalue().strip()) self.assertEqual(sval, cval) - def _verify_clone(self, subvolume, clone, source_group=None, clone_group=None, timo=120): - path1 = self._get_subvolume_path(self.volname, subvolume, group_name=source_group) + def _verify_clone_root(self, source_path, clone_path, clone, clone_group, clone_pool): + # verifies following clone root attrs quota, data_pool and pool_namespace + # remaining attributes of clone root are validated in _verify_clone_attrs + + clone_info = json.loads(self._get_subvolume_info(self.volname, clone, clone_group)) + + # verify quota is inherited from source snapshot + src_quota = self.mount_a.getfattr(source_path, "ceph.quota.max_bytes") + self.assertEqual(clone_info["bytes_quota"], "infinite" if src_quota is None else int(src_quota)) + + if clone_pool: + # verify pool is set as per request + self.assertEqual(clone_info["data_pool"], clone_pool) + else: + # verify pool and pool namespace are inherited from snapshot + self.assertEqual(clone_info["data_pool"], + self.mount_a.getfattr(source_path, "ceph.dir.layout.pool")) + self.assertEqual(clone_info["pool_namespace"], + self.mount_a.getfattr(source_path, "ceph.dir.layout.pool_namespace")) + + def _verify_clone(self, subvolume, snapshot, clone, + source_group=None, clone_group=None, clone_pool=None, + subvol_path=None, source_version=2, timo=120): + # pass in subvol_path (subvolume path when snapshot was taken) when subvolume is removed + # but snapshots are retained for clone verification + path1 = self._get_subvolume_snapshot_path(subvolume, snapshot, source_group, subvol_path, source_version) path2 = self._get_subvolume_path(self.volname, clone, group_name=clone_group) check = 0 - while check < timo: + # TODO: currently snapshot rentries are not stable if snapshot source entries + # are removed, https://tracker.ceph.com/issues/46747 + while check < timo and subvol_path is None: val1 = int(self.mount_a.getfattr(path1, "ceph.dir.rentries")) val2 = int(self.mount_a.getfattr(path2, "ceph.dir.rentries")) if val1 == val2: @@ -106,7 +150,8 @@ time.sleep(1) self.assertTrue(check < timo) - self._verify_clone_attrs(subvolume, clone, source_group=source_group, clone_group=clone_group) + self._verify_clone_root(path1, path2, clone, clone_group, clone_pool) + self._verify_clone_attrs(path1, path2) def _generate_random_volume_name(self, count=1): n = self.volume_start @@ -184,6 +229,25 @@ def _delete_test_volume(self): self._fs_cmd("volume", "rm", self.volname, "--yes-i-really-mean-it") + def _do_subvolume_pool_and_namespace_update(self, subvolume, pool=None, pool_namespace=None, subvolume_group=None): + subvolpath = self._get_subvolume_path(self.volname, subvolume, group_name=subvolume_group) + + if pool is not None: + self.mount_a.setfattr(subvolpath, 'ceph.dir.layout.pool', pool) + + if pool_namespace is not None: + self.mount_a.setfattr(subvolpath, 'ceph.dir.layout.pool_namespace', pool_namespace) + + def _do_subvolume_attr_update(self, subvolume, uid, gid, mode, subvolume_group=None): + subvolpath = self._get_subvolume_path(self.volname, subvolume, group_name=subvolume_group) + + # mode + self.mount_a.run_shell(['chmod', mode, subvolpath]) + + # ownership + self.mount_a.run_shell(['chown', uid, subvolpath]) + self.mount_a.run_shell(['chgrp', gid, subvolpath]) + def _do_subvolume_io(self, subvolume, subvolume_group=None, create_dir=None, number_of_files=DEFAULT_NUMBER_OF_FILES, file_size=DEFAULT_FILE_SIZE): # get subvolume path for IO @@ -228,6 +292,90 @@ trashdir = os.path.join("./", "volumes", "_deleting") self.mount_a.wait_for_dir_empty(trashdir, timeout=timeout) + def _assert_meta_location_and_version(self, vol_name, subvol_name, subvol_group=None, version=2, legacy=False): + if legacy: + subvol_path = self._get_subvolume_path(vol_name, subvol_name, group_name=subvol_group) + m = md5() + m.update(("/"+subvol_path).encode('utf-8')) + meta_filename = "{0}.meta".format(m.digest().hex()) + metapath = os.path.join(".", "volumes", "_legacy", meta_filename) + else: + group = subvol_group if subvol_group is not None else '_nogroup' + metapath = os.path.join(".", "volumes", group, subvol_name, ".meta") + + out = self.mount_a.run_shell(['cat', metapath]) + lines = out.stdout.getvalue().strip().split('\n') + sv_version = -1 + for line in lines: + if line == "version = " + str(version): + sv_version = version + break + self.assertEqual(sv_version, version, "version expected was '{0}' but got '{1}' from meta file at '{2}'".format( + version, sv_version, metapath)) + + def _create_v1_subvolume(self, subvol_name, subvol_group=None, has_snapshot=True, subvol_type='subvolume', state='complete'): + group = subvol_group if subvol_group is not None else '_nogroup' + basepath = os.path.join("volumes", group, subvol_name) + uuid_str = str(uuid.uuid4()) + createpath = os.path.join(basepath, uuid_str) + self.mount_a.run_shell(['mkdir', '-p', createpath]) + + # create a v1 snapshot, to prevent auto upgrades + if has_snapshot: + snappath = os.path.join(createpath, ".snap", "fake") + self.mount_a.run_shell(['mkdir', '-p', snappath]) + + # add required xattrs to subvolume + default_pool = self.mount_a.getfattr(".", "ceph.dir.layout.pool") + self.mount_a.setfattr(createpath, 'ceph.dir.layout.pool', default_pool) + + # create a v1 .meta file + meta_contents = "[GLOBAL]\nversion = 1\ntype = {0}\npath = {1}\nstate = {2}\n".format(subvol_type, "/" + createpath, state) + if state == 'pending': + # add a fake clone source + meta_contents = meta_contents + '[source]\nvolume = fake\nsubvolume = fake\nsnapshot = fake\n' + meta_filepath1 = os.path.join(self.mount_a.mountpoint, basepath, ".meta") + sudo_write_file(self.mount_a.client_remote, meta_filepath1, meta_contents) + return createpath + + def _update_fake_trash(self, subvol_name, subvol_group=None, trash_name='fake', create=True): + group = subvol_group if subvol_group is not None else '_nogroup' + trashpath = os.path.join("volumes", group, subvol_name, '.trash', trash_name) + if create: + self.mount_a.run_shell(['mkdir', '-p', trashpath]) + else: + self.mount_a.run_shell(['rmdir', trashpath]) + + def _configure_guest_auth(self, guest_mount, authid, key): + """ + Set up auth credentials for a guest client. + """ + # Create keyring file for the guest client. + keyring_txt = dedent(""" + [client.{authid}] + key = {key} + + """.format(authid=authid,key=key)) + + guest_mount.client_id = authid + guest_mount.client_remote.write_file(guest_mount.get_keyring_path(), + keyring_txt, sudo=True) + # Add a guest client section to the ceph config file. + self.config_set("client.{0}".format(authid), "debug client", 20) + self.config_set("client.{0}".format(authid), "debug objecter", 20) + self.set_conf("client.{0}".format(authid), + "keyring", guest_mount.get_keyring_path()) + + def _auth_metadata_get(self, filedata): + """ + Return a deserialized JSON object, or None + """ + try: + data = json.loads(filedata) + except json.decoder.JSONDecodeError: + data = None + return data + def setUp(self): super(TestVolumes, self).setUp() self.volname = None @@ -248,7 +396,8 @@ def test_connection_expiration(self): # unmount any cephfs mounts - self.mount_a.umount_wait() + for i in range(0, self.CLIENTS_REQUIRED): + self.mounts[i].umount_wait() sessions = self._session_list() self.assertLessEqual(len(sessions), 1) # maybe mgr is already mounted @@ -284,7 +433,7 @@ volumes = [volume['name'] for volume in vls] #create new volumes and add it to the existing list of volumes - volumenames = self._generate_random_volume_name(3) + volumenames = self._generate_random_volume_name(2) for volumename in volumenames: self._fs_cmd("volume", "create", volumename) volumes.extend(volumenames) @@ -308,6 +457,8 @@ That the volume can only be removed when --yes-i-really-mean-it is used and verify that the deleted volume is not listed anymore. """ + for m in self.mounts: + m.umount_wait() try: self._fs_cmd("volume", "rm", self.volname) except CommandFailedError as ce: @@ -325,11 +476,49 @@ else: raise RuntimeError("expected the 'fs volume rm' command to fail.") + def test_subvolume_marked(self): + """ + ensure a subvolume is marked with the ceph.dir.subvolume xattr + """ + subvolume = self._generate_random_subvolume_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # getpath + subvolpath = self._get_subvolume_path(self.volname, subvolume) + + # subdirectory of a subvolume cannot be moved outside the subvolume once marked with + # the xattr ceph.dir.subvolume, hence test by attempting to rename subvol path (incarnation) + # outside the subvolume + dstpath = os.path.join(self.mount_a.mountpoint, 'volumes', '_nogroup', 'new_subvol_location') + srcpath = os.path.join(self.mount_a.mountpoint, subvolpath) + rename_script = dedent(""" + import os + import errno + try: + os.rename("{src}", "{dst}") + except OSError as e: + if e.errno != errno.EXDEV: + raise RuntimeError("invalid error code on renaming subvolume incarnation out of subvolume directory") + else: + raise RuntimeError("expected renaming subvolume incarnation out of subvolume directory to fail") + """) + self.mount_a.run_python(rename_script.format(src=srcpath, dst=dstpath)) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_volume_rm_arbitrary_pool_removal(self): """ That the arbitrary pool added to the volume out of band is removed successfully on volume removal. """ + for m in self.mounts: + m.umount_wait() new_pool = "new_pool" # add arbitrary data pool self.fs.add_data_pool(new_pool) @@ -351,6 +540,8 @@ That the volume can only be removed when mon_allowd_pool_delete is set to true and verify that the pools are removed after volume deletion. """ + for m in self.mounts: + m.umount_wait() self.config_set('mon', 'mon_allow_pool_delete', False) try: self._fs_cmd("volume", "rm", self.volname, "--yes-i-really-mean-it") @@ -420,6 +611,12 @@ size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, nsize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_shrink(self): """ That a subvolume can be shrinked in size and its quota matches the expected size. @@ -442,6 +639,12 @@ size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, nsize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_resize_fail_invalid_size(self): """ That a subvolume cannot be resized to an invalid size and the quota did not change @@ -461,15 +664,20 @@ try: self._fs_cmd("subvolume", "resize", self.volname, subvolname, str(nsize)) except CommandFailedError as ce: - if ce.exitstatus != errno.EINVAL: - raise + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on resize of subvolume with invalid size") else: - raise RuntimeError("expected the 'fs subvolume resize' command to fail") + self.fail("expected the 'fs subvolume resize' command to fail") # verify the quota did not change size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, osize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_resize_fail_zero_size(self): """ That a subvolume cannot be resized to a zero size and the quota did not change @@ -489,15 +697,20 @@ try: self._fs_cmd("subvolume", "resize", self.volname, subvolname, str(nsize)) except CommandFailedError as ce: - if ce.exitstatus != errno.EINVAL: - raise + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on resize of subvolume with invalid size") else: - raise RuntimeError("expected the 'fs subvolume resize' command to fail") + self.fail("expected the 'fs subvolume resize' command to fail") # verify the quota did not change size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, osize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_resize_quota_lt_used_size(self): """ That a subvolume can be resized to a size smaller than the current used size @@ -531,12 +744,18 @@ try: self._fs_cmd("subvolume", "resize", self.volname, subvolname, str(nsize)) except CommandFailedError: - raise RuntimeError("expected the 'fs subvolume resize' command to succeed") + self.fail("expected the 'fs subvolume resize' command to succeed") # verify the quota size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, nsize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_resize_fail_quota_lt_used_size_no_shrink(self): """ @@ -571,15 +790,20 @@ try: self._fs_cmd("subvolume", "resize", self.volname, subvolname, str(nsize), "--no_shrink") except CommandFailedError as ce: - if ce.exitstatus != errno.EINVAL: - raise + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on resize of subvolume with invalid size") else: - raise RuntimeError("expected the 'fs subvolume resize' command to fail") + self.fail("expected the 'fs subvolume resize' command to fail") # verify the quota did not change size = int(self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes")) self.assertEqual(size, osize) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_resize_expand_on_full_subvolume(self): """ That the subvolume can be expanded from a full subvolume and future writes succeed. @@ -617,12 +841,18 @@ try: self.mount_a.write_n_mb(os.path.join(subvolpath, filename), file_size) except CommandFailedError: - raise RuntimeError("expected filling subvolume {0} with {1} file of size {2}MB" + self.fail("expected filling subvolume {0} with {1} file of size {2}MB" "to succeed".format(subvolname, number_of_files, file_size)) else: - raise RuntimeError("expected filling subvolume {0} with {1} file of size {2}MB" + self.fail("expected filling subvolume {0} with {1} file of size {2}MB" "to fail".format(subvolname, number_of_files, file_size)) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_create_idempotence(self): # create subvolume subvolume = self._generate_random_subvolume_name() @@ -668,6 +898,12 @@ self._get_subtrees(status=status, rank=1) self._wait_subtrees([(path, 1)], status=status) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolumegroup_pin_distributed(self): self.fs.set_max_mds(2) status = self.fs.wait_for_daemons() @@ -683,6 +919,13 @@ self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) self._wait_distributed_subtrees(10, status=status) + # remove subvolumes + for subvolume in subvolumes: + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_pin_random(self): self.fs.set_max_mds(2) self.fs.wait_for_daemons() @@ -693,6 +936,12 @@ self._fs_cmd("subvolume", "pin", self.volname, subvolume, "random", ".01") # no verification + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_create_isolated_namespace(self): """ Create subvolume in separate rados namespace @@ -720,10 +969,12 @@ try: self._fs_cmd("subvolume", "create", self.volname, subvolume, "--pool_layout", data_pool) except CommandFailedError as ce: - if ce.exitstatus != errno.EINVAL: - raise + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on create of subvolume with invalid pool layout") else: - raise RuntimeError("expected the 'fs subvolume create' command to fail") + self.fail("expected the 'fs subvolume create' command to fail") + + # verify trash dir is clean + self._wait_for_trash_empty() def test_subvolume_rm_force(self): # test removing non-existing subvolume with --force @@ -731,7 +982,7 @@ try: self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--force") except CommandFailedError: - raise RuntimeError("expected the 'fs subvolume rm --force' command to succeed") + self.fail("expected the 'fs subvolume rm --force' command to succeed") def test_subvolume_create_with_auto_cleanup_on_fail(self): subvolume = self._generate_random_subvolume_name() @@ -744,10 +995,12 @@ try: self._fs_cmd("subvolume", "getpath", self.volname, subvolume) except CommandFailedError as ce: - if ce.exitstatus != errno.ENOENT: - raise + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on getpath of non-existent subvolume") else: - raise RuntimeError("expected the 'fs subvolume getpath' command to fail") + self.fail("expected the 'fs subvolume getpath' command to fail") + + # verify trash dir is clean + self._wait_for_trash_empty() def test_subvolume_create_with_invalid_size(self): # create subvolume with an invalid size -1 @@ -755,10 +1008,12 @@ try: self._fs_cmd("subvolume", "create", self.volname, subvolume, "--size", "-1") except CommandFailedError as ce: - if ce.exitstatus != errno.EINVAL: - raise + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on create of subvolume with invalid size") else: - raise RuntimeError("expected the 'fs subvolume create' command to fail") + self.fail("expected the 'fs subvolume create' command to fail") + + # verify trash dir is clean + self._wait_for_trash_empty() def test_nonexistent_subvolume_rm(self): # remove non-existing subvolume @@ -803,6 +1058,9 @@ # remove subvolume self._fs_cmd("subvolume", "rm", self.volname, subvolume) + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_ls(self): # tests the 'fs subvolume ls' command @@ -816,11 +1074,18 @@ # list subvolumes subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) if len(subvolumels) == 0: - raise RuntimeError("Expected the 'fs subvolume ls' command to list the created subvolumes.") + self.fail("Expected the 'fs subvolume ls' command to list the created subvolumes.") else: subvolnames = [subvolume['name'] for subvolume in subvolumels] if collections.Counter(subvolnames) != collections.Counter(subvolumes): - raise RuntimeError("Error creating or listing subvolumes") + self.fail("Error creating or listing subvolumes") + + # remove subvolume + for subvolume in subvolumes: + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() def test_subvolume_ls_for_notexistent_default_group(self): # tests the 'fs subvolume ls' command when the default group '_nogroup' doesn't exist @@ -853,6 +1118,128 @@ size = self.mount_a.getfattr(subvolpath, "ceph.quota.max_bytes") self.assertEqual(size, None) + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) + + # verify trash dir is clean + self._wait_for_trash_empty() + + ### authorize operations + + def test_authorize_deauthorize_legacy_subvolume(self): + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + authid = "alice" + + guest_mount = self.mount_b + guest_mount.umount_wait() + + # emulate a old-fashioned subvolume in a custom group + createpath = os.path.join(".", "volumes", group, subvolume) + self.mount_a.run_shell(['mkdir', '-p', createpath]) + + # add required xattrs to subvolume + default_pool = self.mount_a.getfattr(".", "ceph.dir.layout.pool") + self.mount_a.setfattr(createpath, 'ceph.dir.layout.pool', default_pool) + + mount_path = os.path.join("/", "volumes", group, subvolume) + + # authorize guest authID read-write access to subvolume + key = self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid, + "--group_name", group, "--tenant_id", "tenant_id") + + # guest authID should exist + existing_ids = [a['entity'] for a in self.auth_list()] + self.assertIn("client.{0}".format(authid), existing_ids) + + # configure credentials for guest client + self._configure_guest_auth(guest_mount, authid, key) + + # mount the subvolume, and write to it + guest_mount.mount(mount_path=mount_path) + guest_mount.write_n_mb("data.bin", 1) + + # authorize guest authID read access to subvolume + key = self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid, + "--group_name", group, "--tenant_id", "tenant_id", "--access_level", "r") + + # guest client sees the change in access level to read only after a + # remount of the subvolume. + guest_mount.umount_wait() + guest_mount.mount(mount_path=mount_path) + + # read existing content of the subvolume + self.assertListEqual(guest_mount.ls(guest_mount.mountpoint), ["data.bin"]) + # cannot write into read-only subvolume + with self.assertRaises(CommandFailedError): + guest_mount.write_n_mb("rogue.bin", 1) + + # cleanup + guest_mount.umount_wait() + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, authid, + "--group_name", group) + # guest authID should no longer exist + existing_ids = [a['entity'] for a in self.auth_list()] + self.assertNotIn("client.{0}".format(authid), existing_ids) + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_authorize_deauthorize_subvolume(self): + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + authid = "alice" + + guest_mount = self.mount_b + guest_mount.umount_wait() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + mount_path = self._fs_cmd("subvolume", "getpath", self.volname, subvolume, + "--group_name", group).rstrip() + + # authorize guest authID read-write access to subvolume + key = self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid, + "--group_name", group, "--tenant_id", "tenant_id") + + # guest authID should exist + existing_ids = [a['entity'] for a in self.auth_list()] + self.assertIn("client.{0}".format(authid), existing_ids) + + # configure credentials for guest client + self._configure_guest_auth(guest_mount, authid, key) + + # mount the subvolume, and write to it + guest_mount.mount(mount_path=mount_path) + guest_mount.write_n_mb("data.bin", 1) + + # authorize guest authID read access to subvolume + key = self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid, + "--group_name", group, "--tenant_id", "tenant_id", "--access_level", "r") + + # guest client sees the change in access level to read only after a + # remount of the subvolume. + guest_mount.umount_wait() + guest_mount.mount(mount_path=mount_path) + + # read existing content of the subvolume + self.assertListEqual(guest_mount.ls(guest_mount.mountpoint), ["data.bin"]) + # cannot write into read-only subvolume + with self.assertRaises(CommandFailedError): + guest_mount.write_n_mb("rogue.bin", 1) + + # cleanup + guest_mount.umount_wait() + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, authid, + "--group_name", group) + # guest authID should no longer exist + existing_ids = [a['entity'] for a in self.auth_list()] + self.assertNotIn("client.{0}".format(authid), existing_ids) + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + def test_subvolume_resize_infinite_size_future_writes(self): """ That a subvolume can be resized to an infinite size and the future writes succeed. @@ -885,94 +1272,721 @@ try: self.mount_a.write_n_mb(os.path.join(subvolpath, filename), file_size) except CommandFailedError: - raise RuntimeError("expected filling subvolume {0} with {1} file of size {2}MB " + self.fail("expected filling subvolume {0} with {1} file of size {2}MB " "to succeed".format(subvolname, number_of_files, file_size)) - def test_subvolume_info(self): - # tests the 'fs subvolume info' command + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolname) - subvol_md = ["atime", "bytes_pcent", "bytes_quota", "bytes_used", "created_at", "ctime", - "data_pool", "gid", "mode", "mon_addrs", "mtime", "path", "pool_namespace", - "type", "uid", "features"] + # verify trash dir is clean + self._wait_for_trash_empty() - # create subvolume - subvolume = self._generate_random_subvolume_name() - self._fs_cmd("subvolume", "create", self.volname, subvolume) + def test_multitenant_subvolumes(self): + """ + That subvolume access can be restricted to a tenant. - # get subvolume metadata - subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) - self.assertNotEqual(len(subvol_info), 0, "expected the 'fs subvolume info' command to list metadata of subvolume") - for md in subvol_md: - self.assertIn(md, subvol_info.keys(), "'{0}' key not present in metadata of subvolume".format(md)) + That metadata used to enforce tenant isolation of + subvolumes is stored as a two-way mapping between auth + IDs and subvolumes that they're authorized to access. + """ + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() - self.assertEqual(subvol_info["bytes_pcent"], "undefined", "bytes_pcent should be set to undefined if quota is not set") - self.assertEqual(subvol_info["bytes_quota"], "infinite", "bytes_quota should be set to infinite if quota is not set") - self.assertEqual(subvol_info["pool_namespace"], "", "expected pool namespace to be empty") + guest_mount = self.mount_b - self.assertEqual(len(subvol_info["features"]), 2, - msg="expected 2 features, found '{0}' ({1})".format(len(subvol_info["features"]), subvol_info["features"])) - for feature in ['snapshot-clone', 'snapshot-autoprotect']: - self.assertIn(feature, subvol_info["features"], msg="expected feature '{0}' in subvolume".format(feature)) + # Guest clients belonging to different tenants, but using the same + # auth ID. + auth_id = "alice" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + guestclient_2 = { + "auth_id": auth_id, + "tenant_id": "tenant2", + } - nsize = self.DEFAULT_FILE_SIZE*1024*1024 - self._fs_cmd("subvolume", "resize", self.volname, subvolume, str(nsize)) + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) - # get subvolume metadata after quota set - subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) - self.assertNotEqual(len(subvol_info), 0, "expected the 'fs subvolume info' command to list metadata of subvolume") + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) - self.assertNotEqual(subvol_info["bytes_pcent"], "undefined", "bytes_pcent should not be set to undefined if quota is not set") - self.assertNotEqual(subvol_info["bytes_quota"], "infinite", "bytes_quota should not be set to infinite if quota is not set") - self.assertEqual(subvol_info["type"], "subvolume", "type should be set to subvolume") + # Check that subvolume metadata file is created on subvolume creation. + subvol_metadata_filename = "_{0}:{1}.meta".format(group, subvolume) + self.assertIn(subvol_metadata_filename, guest_mount.ls("volumes")) + + # Authorize 'guestclient_1', using auth ID 'alice' and belonging to + # 'tenant1', with 'rw' access to the volume. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Check that auth metadata file for auth ID 'alice', is + # created on authorizing 'alice' access to the subvolume. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, guest_mount.ls("volumes")) + + # Verify that the auth metadata file stores the tenant ID that the + # auth ID belongs to, the auth ID's authorized access levels + # for different subvolumes, versioning details, etc. + expected_auth_metadata = { + "version": 5, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant1", + "subvolumes": { + "{0}/{1}".format(group,subvolume): { + "dirty": False, + "access_level": "rw" + } + } + } + + auth_metadata = self._auth_metadata_get(guest_mount.read_file("volumes/{0}".format(auth_metadata_filename))) + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # Verify that the subvolume metadata file stores info about auth IDs + # and their access levels to the subvolume, versioning details, etc. + expected_subvol_metadata = { + "version": 1, + "compat_version": 1, + "auths": { + "alice": { + "dirty": False, + "access_level": "rw" + } + } + } + subvol_metadata = self._auth_metadata_get(guest_mount.read_file("volumes/{0}".format(subvol_metadata_filename))) + + self.assertGreaterEqual(subvol_metadata["version"], expected_subvol_metadata["version"]) + del expected_subvol_metadata["version"] + del subvol_metadata["version"] + self.assertEqual(expected_subvol_metadata, subvol_metadata) + + # Cannot authorize 'guestclient_2' to access the volume. + # It uses auth ID 'alice', which has already been used by a + # 'guestclient_1' belonging to an another tenant for accessing + # the volume. - self.assertEqual(len(subvol_info["features"]), 2, - msg="expected 2 features, found '{0}' ({1})".format(len(subvol_info["features"]), subvol_info["features"])) - for feature in ['snapshot-clone', 'snapshot-autoprotect']: - self.assertIn(feature, subvol_info["features"], msg="expected feature '{0}' in subvolume".format(feature)) + try: + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_2["auth_id"], + "--group_name", group, "--tenant_id", guestclient_2["tenant_id"]) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EPERM, + "Invalid error code returned on authorize of subvolume with same auth_id but different tenant_id") + else: + self.fail("expected the 'fs subvolume authorize' command to fail") - # remove subvolumes - self._fs_cmd("subvolume", "rm", self.volname, subvolume) + # Check that auth metadata file is cleaned up on removing + # auth ID's only access to a volume. - # verify trash dir is clean - self._wait_for_trash_empty() + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, auth_id, + "--group_name", group) + self.assertNotIn(auth_metadata_filename, guest_mount.ls("volumes")) - def test_clone_subvolume_info(self): + # Check that subvolume metadata file is cleaned up on subvolume deletion. + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self.assertNotIn(subvol_metadata_filename, guest_mount.ls("volumes")) - # tests the 'fs subvolume info' command for a clone - subvol_md = ["atime", "bytes_pcent", "bytes_quota", "bytes_used", "created_at", "ctime", - "data_pool", "gid", "mode", "mon_addrs", "mtime", "path", "pool_namespace", - "type", "uid"] + # clean up + guest_mount.umount_wait() + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + def test_subvolume_authorized_list(self): subvolume = self._generate_random_subvolume_name() - snapshot = self._generate_random_snapshot_name() - clone = self._generate_random_clone_name() - - # create subvolume - self._fs_cmd("subvolume", "create", self.volname, subvolume) + group = self._generate_random_group_name() + authid1 = "alice" + authid2 = "guest1" + authid3 = "guest2" - # do some IO - self._do_subvolume_io(subvolume, number_of_files=1) + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) - # snapshot subvolume - self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) - # schedule a clone - self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + # authorize alice authID read-write access to subvolume + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid1, + "--group_name", group) + # authorize guest1 authID read-write access to subvolume + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid2, + "--group_name", group) + # authorize guest2 authID read access to subvolume + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, authid3, + "--group_name", group, "--access_level", "r") + + # list authorized-ids of the subvolume + expected_auth_list = [{'alice': 'rw'}, {'guest1': 'rw'}, {'guest2': 'r'}] + auth_list = json.loads(self._fs_cmd('subvolume', 'authorized_list', self.volname, subvolume, "--group_name", group)) + self.assertCountEqual(expected_auth_list, auth_list) + + # cleanup + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, authid1, + "--group_name", group) + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, authid2, + "--group_name", group) + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, authid3, + "--group_name", group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) - # check clone status - self._wait_for_clone_to_complete(clone) + def test_authorize_auth_id_not_created_by_mgr_volumes(self): + """ + If the auth_id already exists and is not created by mgr plugin, + it's not allowed to authorize the auth-id by default. + """ - # remove snapshot - self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() - subvol_info = json.loads(self._get_subvolume_info(self.volname, clone)) - if len(subvol_info) == 0: - raise RuntimeError("Expected the 'fs subvolume info' command to list metadata of subvolume") - for md in subvol_md: - if md not in subvol_info.keys(): - raise RuntimeError("%s not present in the metadata of subvolume" % md) - if subvol_info["type"] != "clone": - raise RuntimeError("type should be set to clone") + # Create auth_id + self.fs.mon_manager.raw_cluster_cmd( + "auth", "get-or-create", "client.guest1", + "mds", "allow *", + "osd", "allow rw", + "mon", "allow *" + ) + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + try: + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EPERM, + "Invalid error code returned on authorize of subvolume for auth_id created out of band") + else: + self.fail("expected the 'fs subvolume authorize' command to fail") + + # clean up + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_authorize_allow_existing_id_option(self): + """ + If the auth_id already exists and is not created by mgr volumes, + it's not allowed to authorize the auth-id by default but is + allowed with option allow_existing_id. + """ + + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + + # Create auth_id + self.fs.mon_manager.raw_cluster_cmd( + "auth", "get-or-create", "client.guest1", + "mds", "allow *", + "osd", "allow rw", + "mon", "allow *" + ) + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # Cannot authorize 'guestclient_1' to access the volume by default, + # which already exists and not created by mgr volumes but is allowed + # with option 'allow_existing_id'. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"], "--allow-existing-id") + + # clean up + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, auth_id, + "--group_name", group) + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_deauthorize_auth_id_after_out_of_band_update(self): + """ + If the auth_id authorized by mgr/volumes plugin is updated + out of band, the auth_id should not be deleted after a + deauthorize. It should only remove caps associated with it. + """ + + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # Authorize 'guestclient_1' to access the subvolume. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + subvol_path = self._fs_cmd("subvolume", "getpath", self.volname, subvolume, + "--group_name", group).rstrip() + + # Update caps for guestclient_1 out of band + out = self.fs.mon_manager.raw_cluster_cmd( + "auth", "caps", "client.guest1", + "mds", "allow rw path=/volumes/{0}, allow rw path={1}".format(group, subvol_path), + "osd", "allow rw pool=cephfs_data", + "mon", "allow r", + "mgr", "allow *" + ) + + # Deauthorize guestclient_1 + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, auth_id, "--group_name", group) + + # Validate the caps of guestclient_1 after deauthorize. It should not have deleted + # guestclient_1. The mgr and mds caps should be present which was updated out of band. + out = json.loads(self.fs.mon_manager.raw_cluster_cmd("auth", "get", "client.guest1", "--format=json-pretty")) + + self.assertEqual("client.guest1", out[0]["entity"]) + self.assertEqual("allow rw path=/volumes/{0}".format(group), out[0]["caps"]["mds"]) + self.assertEqual("allow *", out[0]["caps"]["mgr"]) + self.assertNotIn("osd", out[0]["caps"]) + + # clean up + out = self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_recover_auth_metadata_during_authorize(self): + """ + That auth metadata manager can recover from partial auth updates using + metadata files, which store auth info and its update status info. This + test validates the recovery during authorize. + """ + + guest_mount = self.mount_b + + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # Authorize 'guestclient_1' to access the subvolume. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Check that auth metadata file for auth ID 'guest1', is + # created on authorizing 'guest1' access to the subvolume. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, guest_mount.ls("volumes")) + expected_auth_metadata_content = self._auth_metadata_get(self.mount_a.read_file("volumes/{0}".format(auth_metadata_filename))) + + # Induce partial auth update state by modifying the auth metadata file, + # and then run authorize again. + guest_mount.run_shell(['sed', '-i', 's/false/true/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Authorize 'guestclient_1' to access the subvolume. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + auth_metadata_content = self._auth_metadata_get(self.mount_a.read_file("volumes/{0}".format(auth_metadata_filename))) + self.assertEqual(auth_metadata_content, expected_auth_metadata_content) + + # clean up + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume, auth_id, "--group_name", group) + guest_mount.umount_wait() + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_recover_auth_metadata_during_deauthorize(self): + """ + That auth metadata manager can recover from partial auth updates using + metadata files, which store auth info and its update status info. This + test validates the recovery during deauthorize. + """ + + guest_mount = self.mount_b + + subvolume1, subvolume2 = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + guestclient_1 = { + "auth_id": "guest1", + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolumes in group + self._fs_cmd("subvolume", "create", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "create", self.volname, subvolume2, "--group_name", group) + + # Authorize 'guestclient_1' to access the subvolume1. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume1, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Check that auth metadata file for auth ID 'guest1', is + # created on authorizing 'guest1' access to the subvolume1. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, guest_mount.ls("volumes")) + expected_auth_metadata_content = self._auth_metadata_get(self.mount_a.read_file("volumes/{0}".format(auth_metadata_filename))) + + # Authorize 'guestclient_1' to access the subvolume2. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume2, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Induce partial auth update state by modifying the auth metadata file, + # and then run de-authorize. + guest_mount.run_shell(['sed', '-i', 's/false/true/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Deauthorize 'guestclient_1' to access the subvolume2. + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume2, guestclient_1["auth_id"], + "--group_name", group) + + auth_metadata_content = self._auth_metadata_get(self.mount_a.read_file("volumes/{0}".format(auth_metadata_filename))) + self.assertEqual(auth_metadata_content, expected_auth_metadata_content) + + # clean up + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume1, "guest1", "--group_name", group) + guest_mount.umount_wait() + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_update_old_style_auth_metadata_to_new_during_authorize(self): + """ + CephVolumeClient stores the subvolume data in auth metadata file with + 'volumes' key as there was no subvolume namespace. It doesn't makes sense + with mgr/volumes. This test validates the transparent update of 'volumes' + key to 'subvolumes' key in auth metadata file during authorize. + """ + + guest_mount = self.mount_b + + subvolume1, subvolume2 = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolumes in group + self._fs_cmd("subvolume", "create", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "create", self.volname, subvolume2, "--group_name", group) + + # Authorize 'guestclient_1' to access the subvolume1. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume1, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Check that auth metadata file for auth ID 'guest1', is + # created on authorizing 'guest1' access to the subvolume1. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, guest_mount.ls("volumes")) + + # Replace 'subvolumes' to 'volumes', old style auth-metadata file + guest_mount.run_shell(['sed', '-i', 's/subvolumes/volumes/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Authorize 'guestclient_1' to access the subvolume2. This should transparently update 'volumes' to 'subvolumes' + self._fs_cmd("subvolume", "authorize", self.volname, subvolume2, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + expected_auth_metadata = { + "version": 5, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant1", + "subvolumes": { + "{0}/{1}".format(group,subvolume1): { + "dirty": False, + "access_level": "rw" + }, + "{0}/{1}".format(group,subvolume2): { + "dirty": False, + "access_level": "rw" + } + } + } + + auth_metadata = self._auth_metadata_get(guest_mount.read_file("volumes/{0}".format(auth_metadata_filename))) + + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # clean up + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume1, auth_id, "--group_name", group) + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume2, auth_id, "--group_name", group) + guest_mount.umount_wait() + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_update_old_style_auth_metadata_to_new_during_deauthorize(self): + """ + CephVolumeClient stores the subvolume data in auth metadata file with + 'volumes' key as there was no subvolume namespace. It doesn't makes sense + with mgr/volumes. This test validates the transparent update of 'volumes' + key to 'subvolumes' key in auth metadata file during deauthorize. + """ + + guest_mount = self.mount_b + + subvolume1, subvolume2 = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + auth_id = "guest1" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolumes in group + self._fs_cmd("subvolume", "create", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "create", self.volname, subvolume2, "--group_name", group) + + # Authorize 'guestclient_1' to access the subvolume1. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume1, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Authorize 'guestclient_1' to access the subvolume2. + self._fs_cmd("subvolume", "authorize", self.volname, subvolume2, guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + # Check that auth metadata file for auth ID 'guest1', is created. + auth_metadata_filename = "${0}.meta".format(guestclient_1["auth_id"]) + self.assertIn(auth_metadata_filename, guest_mount.ls("volumes")) + + # Replace 'subvolumes' to 'volumes', old style auth-metadata file + guest_mount.run_shell(['sed', '-i', 's/subvolumes/volumes/g', 'volumes/{0}'.format(auth_metadata_filename)]) + + # Deauthorize 'guestclient_1' to access the subvolume2. This should update 'volumes' to subvolumes' + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume2, auth_id, "--group_name", group) + + expected_auth_metadata = { + "version": 5, + "compat_version": 6, + "dirty": False, + "tenant_id": "tenant1", + "subvolumes": { + "{0}/{1}".format(group,subvolume1): { + "dirty": False, + "access_level": "rw" + } + } + } + + auth_metadata = self._auth_metadata_get(guest_mount.read_file("volumes/{0}".format(auth_metadata_filename))) + + self.assertGreaterEqual(auth_metadata["version"], expected_auth_metadata["version"]) + del expected_auth_metadata["version"] + del auth_metadata["version"] + self.assertEqual(expected_auth_metadata, auth_metadata) + + # clean up + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume1, auth_id, "--group_name", group) + guest_mount.umount_wait() + self.fs.mon_manager.raw_cluster_cmd("auth", "rm", "client.guest1") + self._fs_cmd("subvolume", "rm", self.volname, subvolume1, "--group_name", group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_subvolume_info(self): + # tests the 'fs subvolume info' command + + subvol_md = ["atime", "bytes_pcent", "bytes_quota", "bytes_used", "created_at", "ctime", + "data_pool", "gid", "mode", "mon_addrs", "mtime", "path", "pool_namespace", + "type", "uid", "features", "state"] + + # create subvolume + subvolume = self._generate_random_subvolume_name() + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # get subvolume metadata + subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) + for md in subvol_md: + self.assertIn(md, subvol_info, "'{0}' key not present in metadata of subvolume".format(md)) + + self.assertEqual(subvol_info["bytes_pcent"], "undefined", "bytes_pcent should be set to undefined if quota is not set") + self.assertEqual(subvol_info["bytes_quota"], "infinite", "bytes_quota should be set to infinite if quota is not set") + self.assertEqual(subvol_info["pool_namespace"], "", "expected pool namespace to be empty") + self.assertEqual(subvol_info["state"], "complete", "expected state to be complete") + + self.assertEqual(len(subvol_info["features"]), 3, + msg="expected 3 features, found '{0}' ({1})".format(len(subvol_info["features"]), subvol_info["features"])) + for feature in ['snapshot-clone', 'snapshot-autoprotect', 'snapshot-retention']: + self.assertIn(feature, subvol_info["features"], msg="expected feature '{0}' in subvolume".format(feature)) + + nsize = self.DEFAULT_FILE_SIZE*1024*1024 + self._fs_cmd("subvolume", "resize", self.volname, subvolume, str(nsize)) + + # get subvolume metadata after quota set + subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) + for md in subvol_md: + self.assertIn(md, subvol_info, "'{0}' key not present in metadata of subvolume".format(md)) + + self.assertNotEqual(subvol_info["bytes_pcent"], "undefined", "bytes_pcent should not be set to undefined if quota is not set") + self.assertEqual(subvol_info["bytes_quota"], nsize, "bytes_quota should be set to '{0}'".format(nsize)) + self.assertEqual(subvol_info["type"], "subvolume", "type should be set to subvolume") + self.assertEqual(subvol_info["state"], "complete", "expected state to be complete") + + self.assertEqual(len(subvol_info["features"]), 3, + msg="expected 3 features, found '{0}' ({1})".format(len(subvol_info["features"]), subvol_info["features"])) + for feature in ['snapshot-clone', 'snapshot-autoprotect', 'snapshot-retention']: + self.assertIn(feature, subvol_info["features"], msg="expected feature '{0}' in subvolume".format(feature)) + + # remove subvolumes + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_evict_client(self): + """ + That a subvolume client can be evicted based on the auth ID + """ + + subvolumes = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # mounts[0] and mounts[1] would be used as guests to mount the volumes/shares. + for i in range(0, 2): + self.mounts[i].umount_wait() + guest_mounts = (self.mounts[0], self.mounts[1]) + auth_id = "guest" + guestclient_1 = { + "auth_id": auth_id, + "tenant_id": "tenant1", + } + + # Create two subvolumes. Authorize 'guest' auth ID to mount the two + # subvolumes. Mount the two subvolumes. Write data to the volumes. + for i in range(2): + # Create subvolume. + self._fs_cmd("subvolume", "create", self.volname, subvolumes[i], "--group_name", group) + + # authorize guest authID read-write access to subvolume + key = self._fs_cmd("subvolume", "authorize", self.volname, subvolumes[i], guestclient_1["auth_id"], + "--group_name", group, "--tenant_id", guestclient_1["tenant_id"]) + + mount_path = self._fs_cmd("subvolume", "getpath", self.volname, subvolumes[i], + "--group_name", group).rstrip() + # configure credentials for guest client + self._configure_guest_auth(guest_mounts[i], auth_id, key) + + # mount the subvolume, and write to it + guest_mounts[i].mount(mount_path=mount_path) + guest_mounts[i].write_n_mb("data.bin", 1) + + # Evict client, guest_mounts[0], using auth ID 'guest' and has mounted + # one volume. + self._fs_cmd("subvolume", "evict", self.volname, subvolumes[0], auth_id, "--group_name", group) + + # Evicted guest client, guest_mounts[0], should not be able to do + # anymore metadata ops. It should start failing all operations + # when it sees that its own address is in the blocklist. + try: + guest_mounts[0].write_n_mb("rogue.bin", 1) + except CommandFailedError: + pass + else: + raise RuntimeError("post-eviction write should have failed!") + + # The blocklisted guest client should now be unmountable + guest_mounts[0].umount_wait() + + # Guest client, guest_mounts[1], using the same auth ID 'guest', but + # has mounted the other volume, should be able to use its volume + # unaffected. + guest_mounts[1].write_n_mb("data.bin.1", 1) + + # Cleanup. + guest_mounts[1].umount_wait() + for i in range(2): + self._fs_cmd("subvolume", "deauthorize", self.volname, subvolumes[i], auth_id, "--group_name", group) + self._fs_cmd("subvolume", "rm", self.volname, subvolumes[i], "--group_name", group) + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_clone_subvolume_info(self): + + # tests the 'fs subvolume info' command for a clone + subvol_md = ["atime", "bytes_pcent", "bytes_quota", "bytes_used", "created_at", "ctime", + "data_pool", "gid", "mode", "mon_addrs", "mtime", "path", "pool_namespace", + "type", "uid"] + + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + clone = self._generate_random_clone_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # do some IO + self._do_subvolume_io(subvolume, number_of_files=1) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # schedule a clone + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + + # check clone status + self._wait_for_clone_to_complete(clone) + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + subvol_info = json.loads(self._get_subvolume_info(self.volname, clone)) + if len(subvol_info) == 0: + raise RuntimeError("Expected the 'fs subvolume info' command to list metadata of subvolume") + for md in subvol_md: + if md not in subvol_info.keys(): + raise RuntimeError("%s not present in the metadata of subvolume" % md) + if subvol_info["type"] != "clone": + raise RuntimeError("type should be set to clone") # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) @@ -1095,6 +2109,9 @@ self._fs_cmd("subvolume", "rm", self.volname, subvol1, group) self._fs_cmd("subvolumegroup", "rm", self.volname, group) + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_group_create_with_desired_mode(self): group1, group2 = self._generate_random_group_name(2) # default mode @@ -1178,6 +2195,9 @@ self._fs_cmd("subvolume", "rm", self.volname, subvol3, group) self._fs_cmd("subvolumegroup", "rm", self.volname, group) + # verify trash dir is clean + self._wait_for_trash_empty() + def test_subvolume_create_with_desired_uid_gid(self): """ That the subvolume can be created with the desired uid and gid and its uid and gid matches the @@ -1203,6 +2223,9 @@ # remove subvolume self._fs_cmd("subvolume", "rm", self.volname, subvolname) + # verify trash dir is clean + self._wait_for_trash_empty() + def test_nonexistent_subvolume_group_rm(self): group = "non_existent_group" @@ -1286,10 +2309,10 @@ tests the 'fs subvolume snapshot info' command """ - snap_metadata = ["created_at", "data_pool", "has_pending_clones", "size"] + snap_md = ["created_at", "data_pool", "has_pending_clones", "size"] subvolume = self._generate_random_subvolume_name() - snapshot = self._generate_random_snapshot_name() + snapshot, snap_missing = self._generate_random_snapshot_name(2) # create subvolume self._fs_cmd("subvolume", "create", self.volname, subvolume) @@ -1301,12 +2324,18 @@ self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) snap_info = json.loads(self._get_subvolume_snapshot_info(self.volname, subvolume, snapshot)) - self.assertNotEqual(len(snap_info), 0) - for md in snap_metadata: - if md not in snap_info: - raise RuntimeError("%s not present in the metadata of subvolume snapshot" % md) + for md in snap_md: + self.assertIn(md, snap_info, "'{0}' key not present in metadata of snapshot".format(md)) self.assertEqual(snap_info["has_pending_clones"], "no") + # snapshot info for non-existent snapshot + try: + self._get_subvolume_snapshot_info(self.volname, subvolume, snap_missing) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on snapshot info of non-existent snapshot") + else: + self.fail("expected snapshot info of non-existent snapshot to fail") + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) @@ -1419,28 +2448,75 @@ subvolsnapshotls = json.loads(self._fs_cmd('subvolume', 'snapshot', 'ls', self.volname, subvolume)) if len(subvolsnapshotls) == 0: - raise RuntimeError("Expected the 'fs subvolume snapshot ls' command to list the created subvolume snapshots") + self.fail("Expected the 'fs subvolume snapshot ls' command to list the created subvolume snapshots") else: snapshotnames = [snapshot['name'] for snapshot in subvolsnapshotls] if collections.Counter(snapshotnames) != collections.Counter(snapshots): - raise RuntimeError("Error creating or listing subvolume snapshots") + self.fail("Error creating or listing subvolume snapshots") - def test_subvolume_group_snapshot_create_and_rm(self): - subvolume = self._generate_random_subvolume_name() + # remove snapshot + for snapshot in snapshots: + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_group_snapshot_unsupported_status(self): group = self._generate_random_group_name() snapshot = self._generate_random_snapshot_name() # create group self._fs_cmd("subvolumegroup", "create", self.volname, group) + # snapshot group + try: + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOSYS, "invalid error code on subvolumegroup snapshot create") + else: + self.fail("expected subvolumegroup snapshot create command to fail") + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_subvolume_inherited_snapshot_ls(self): + # tests the scenario where 'fs subvolume snapshot ls' command + # should not list inherited snapshots created as part of snapshot + # at ancestral level + + snapshots = [] + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + snap_count = 3 + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + # create subvolume in group self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) - # snapshot group - self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + # create subvolume snapshots + snapshots = self._generate_random_snapshot_name(snap_count) + for snapshot in snapshots: + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot, group) + + # Create snapshot at ancestral level + ancestral_snappath1 = os.path.join(".", "volumes", group, ".snap", "ancestral_snap_1") + ancestral_snappath2 = os.path.join(".", "volumes", group, ".snap", "ancestral_snap_2") + self.mount_a.run_shell(['mkdir', '-p', ancestral_snappath1, ancestral_snappath2]) + + subvolsnapshotls = json.loads(self._fs_cmd('subvolume', 'snapshot', 'ls', self.volname, subvolume, group)) + self.assertEqual(len(subvolsnapshotls), snap_count) + + # remove ancestral snapshots + self.mount_a.run_shell(['rmdir', ancestral_snappath1, ancestral_snappath2]) # remove snapshot - self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + for snapshot in snapshots: + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot, group) # remove subvolume self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) @@ -1451,10 +2527,15 @@ # remove group self._fs_cmd("subvolumegroup", "rm", self.volname, group) - def test_subvolume_group_snapshot_idempotence(self): + def test_subvolume_inherited_snapshot_info(self): + """ + tests the scenario where 'fs subvolume snapshot info' command + should fail for inherited snapshots created as part of snapshot + at ancestral level + """ + subvolume = self._generate_random_subvolume_name() group = self._generate_random_group_name() - snapshot = self._generate_random_snapshot_name() # create group self._fs_cmd("subvolumegroup", "create", self.volname, group) @@ -1462,17 +2543,31 @@ # create subvolume in group self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) - # snapshot group - self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + # Create snapshot at ancestral level + ancestral_snap_name = "ancestral_snap_1" + ancestral_snappath1 = os.path.join(".", "volumes", group, ".snap", ancestral_snap_name) + self.mount_a.run_shell(['mkdir', '-p', ancestral_snappath1]) + + # Validate existence of inherited snapshot + group_path = os.path.join(".", "volumes", group) + inode_number_group_dir = int(self.mount_a.run_shell(['stat', '-c' '%i', group_path]).stdout.getvalue().strip()) + inherited_snap = "_{0}_{1}".format(ancestral_snap_name, inode_number_group_dir) + inherited_snappath = os.path.join(".", "volumes", group, subvolume,".snap", inherited_snap) + self.mount_a.run_shell(['ls', inherited_snappath]) - # try creating snapshot w/ same snapshot name -- shoule be idempotent - self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + # snapshot info on inherited snapshot + try: + self._get_subvolume_snapshot_info(self.volname, subvolume, inherited_snap, group) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on snapshot info of inherited snapshot") + else: + self.fail("expected snapshot info of inherited snapshot to fail") - # remove snapshot - self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + # remove ancestral snapshots + self.mount_a.run_shell(['rmdir', ancestral_snappath1]) # remove subvolume - self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group) # verify trash dir is clean self._wait_for_trash_empty() @@ -1480,174 +2575,1078 @@ # remove group self._fs_cmd("subvolumegroup", "rm", self.volname, group) - def test_nonexistent_subvolume_group_snapshot_rm(self): - subvolume = self._generate_random_subvolume_name() - group = self._generate_random_group_name() - snapshot = self._generate_random_snapshot_name() + def test_subvolume_inherited_snapshot_rm(self): + """ + tests the scenario where 'fs subvolume snapshot rm' command + should fail for inherited snapshots created as part of snapshot + at ancestral level + """ + + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # Create snapshot at ancestral level + ancestral_snap_name = "ancestral_snap_1" + ancestral_snappath1 = os.path.join(".", "volumes", group, ".snap", ancestral_snap_name) + self.mount_a.run_shell(['mkdir', '-p', ancestral_snappath1]) + + # Validate existence of inherited snap + group_path = os.path.join(".", "volumes", group) + inode_number_group_dir = int(self.mount_a.run_shell(['stat', '-c' '%i', group_path]).stdout.getvalue().strip()) + inherited_snap = "_{0}_{1}".format(ancestral_snap_name, inode_number_group_dir) + inherited_snappath = os.path.join(".", "volumes", group, subvolume,".snap", inherited_snap) + self.mount_a.run_shell(['ls', inherited_snappath]) + + # inherited snapshot should not be deletable + try: + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, inherited_snap, "--group_name", group) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EINVAL, msg="invalid error code when removing inherited snapshot") + else: + self.fail("expected removing inheirted snapshot to fail") + + # remove ancestral snapshots + self.mount_a.run_shell(['rmdir', ancestral_snappath1]) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_subvolume_subvolumegroup_snapshot_name_conflict(self): + """ + tests the scenario where creation of subvolume snapshot name + with same name as it's subvolumegroup snapshot name. This should + fail. + """ + + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + group_snapshot = self._generate_random_snapshot_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # Create subvolumegroup snapshot + group_snapshot_path = os.path.join(".", "volumes", group, ".snap", group_snapshot) + self.mount_a.run_shell(['mkdir', '-p', group_snapshot_path]) + + # Validate existence of subvolumegroup snapshot + self.mount_a.run_shell(['ls', group_snapshot_path]) + + # Creation of subvolume snapshot with it's subvolumegroup snapshot name should fail + try: + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, group_snapshot, "--group_name", group) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EINVAL, msg="invalid error code when creating subvolume snapshot with same name as subvolume group snapshot") + else: + self.fail("expected subvolume snapshot creation with same name as subvolumegroup snapshot to fail") + + # remove subvolumegroup snapshot + self.mount_a.run_shell(['rmdir', group_snapshot_path]) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + @unittest.skip("skipping subvolumegroup snapshot tests") + def test_subvolume_group_snapshot_create_and_rm(self): + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + snapshot = self._generate_random_snapshot_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # snapshot group + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + + # remove snapshot + self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + @unittest.skip("skipping subvolumegroup snapshot tests") + def test_subvolume_group_snapshot_idempotence(self): + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + snapshot = self._generate_random_snapshot_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # snapshot group + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + + # try creating snapshot w/ same snapshot name -- shoule be idempotent + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + + # remove snapshot + self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + @unittest.skip("skipping subvolumegroup snapshot tests") + def test_nonexistent_subvolume_group_snapshot_rm(self): + subvolume = self._generate_random_subvolume_name() + group = self._generate_random_group_name() + snapshot = self._generate_random_snapshot_name() + + # create group + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolume in group + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + + # snapshot group + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + + # remove snapshot + self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + + # remove snapshot + try: + self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + except CommandFailedError as ce: + if ce.exitstatus != errno.ENOENT: + raise + else: + raise RuntimeError("expected the 'fs subvolumegroup snapshot rm' command to fail") + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + @unittest.skip("skipping subvolumegroup snapshot tests") + def test_subvolume_group_snapshot_rm_force(self): + # test removing non-existing subvolume group snapshot with --force + group = self._generate_random_group_name() + snapshot = self._generate_random_snapshot_name() + # remove snapshot + try: + self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot, "--force") + except CommandFailedError: + raise RuntimeError("expected the 'fs subvolumegroup snapshot rm --force' command to succeed") + + @unittest.skip("skipping subvolumegroup snapshot tests") + def test_subvolume_group_snapshot_ls(self): + # tests the 'fs subvolumegroup snapshot ls' command + + snapshots = [] + + # create group + group = self._generate_random_group_name() + self._fs_cmd("subvolumegroup", "create", self.volname, group) + + # create subvolumegroup snapshots + snapshots = self._generate_random_snapshot_name(3) + for snapshot in snapshots: + self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + + subvolgrpsnapshotls = json.loads(self._fs_cmd('subvolumegroup', 'snapshot', 'ls', self.volname, group)) + if len(subvolgrpsnapshotls) == 0: + raise RuntimeError("Expected the 'fs subvolumegroup snapshot ls' command to list the created subvolume group snapshots") + else: + snapshotnames = [snapshot['name'] for snapshot in subvolgrpsnapshotls] + if collections.Counter(snapshotnames) != collections.Counter(snapshots): + raise RuntimeError("Error creating or listing subvolume group snapshots") + + def test_async_subvolume_rm(self): + subvolumes = self._generate_random_subvolume_name(100) + + # create subvolumes + for subvolume in subvolumes: + self._fs_cmd("subvolume", "create", self.volname, subvolume) + self._do_subvolume_io(subvolume, number_of_files=10) + + self.mount_a.umount_wait() + + # remove subvolumes + for subvolume in subvolumes: + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + self.mount_a.mount_wait() + + # verify trash dir is clean + self._wait_for_trash_empty(timeout=300) + + def test_mgr_eviction(self): + # unmount any cephfs mounts + for i in range(0, self.CLIENTS_REQUIRED): + self.mounts[i].umount_wait() + sessions = self._session_list() + self.assertLessEqual(len(sessions), 1) # maybe mgr is already mounted + + # Get the mgr to definitely mount cephfs + subvolume = self._generate_random_subvolume_name() + self._fs_cmd("subvolume", "create", self.volname, subvolume) + sessions = self._session_list() + self.assertEqual(len(sessions), 1) + + # Now fail the mgr, check the session was evicted + mgr = self.mgr_cluster.get_active_id() + self.mgr_cluster.mgr_fail(mgr) + self.wait_until_evicted(sessions[0]['id']) + + def test_subvolume_upgrade_legacy_to_v1(self): + """ + poor man's upgrade test -- rather than going through a full upgrade cycle, + emulate subvolumes by going through the wormhole and verify if they are + accessible. + further ensure that a legacy volume is not updated to v2. + """ + subvolume1, subvolume2 = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + # emulate a old-fashioned subvolume -- one in the default group and + # the other in a custom group + createpath1 = os.path.join(".", "volumes", "_nogroup", subvolume1) + self.mount_a.run_shell(['mkdir', '-p', createpath1]) + + # create group + createpath2 = os.path.join(".", "volumes", group, subvolume2) + self.mount_a.run_shell(['mkdir', '-p', createpath2]) + + # this would auto-upgrade on access without anyone noticing + subvolpath1 = self._fs_cmd("subvolume", "getpath", self.volname, subvolume1) + self.assertNotEqual(subvolpath1, None) + subvolpath1 = subvolpath1.rstrip() # remove "/" prefix and any trailing newline + + subvolpath2 = self._fs_cmd("subvolume", "getpath", self.volname, subvolume2, group) + self.assertNotEqual(subvolpath2, None) + subvolpath2 = subvolpath2.rstrip() # remove "/" prefix and any trailing newline + + # and... the subvolume path returned should be what we created behind the scene + self.assertEqual(createpath1[1:], subvolpath1) + self.assertEqual(createpath2[1:], subvolpath2) + + # ensure metadata file is in legacy location, with required version v1 + self._assert_meta_location_and_version(self.volname, subvolume1, version=1, legacy=True) + self._assert_meta_location_and_version(self.volname, subvolume2, subvol_group=group, version=1, legacy=True) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume1) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + # remove group + self._fs_cmd("subvolumegroup", "rm", self.volname, group) + + def test_subvolume_no_upgrade_v1_sanity(self): + """ + poor man's upgrade test -- theme continues... + + This test is to ensure v1 subvolumes are retained as is, due to a snapshot being present, and runs through + a series of operations on the v1 subvolume to ensure they work as expected. + """ + subvol_md = ["atime", "bytes_pcent", "bytes_quota", "bytes_used", "created_at", "ctime", + "data_pool", "gid", "mode", "mon_addrs", "mtime", "path", "pool_namespace", + "type", "uid", "features", "state"] + snap_md = ["created_at", "data_pool", "has_pending_clones", "size"] + + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + clone1, clone2 = self._generate_random_clone_name(2) + mode = "777" + uid = "1000" + gid = "1000" + + # emulate a v1 subvolume -- in the default group + subvolume_path = self._create_v1_subvolume(subvolume) + + # getpath + subvolpath = self._get_subvolume_path(self.volname, subvolume) + self.assertEqual(subvolpath, subvolume_path) + + # ls + subvolumes = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumes), 1, "subvolume ls count mismatch, expected '1', found {0}".format(len(subvolumes))) + self.assertEqual(subvolumes[0]['name'], subvolume, + "subvolume name mismatch in ls output, expected '{0}', found '{1}'".format(subvolume, subvolumes[0]['name'])) + + # info + subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) + for md in subvol_md: + self.assertIn(md, subvol_info, "'{0}' key not present in metadata of subvolume".format(md)) + + self.assertEqual(subvol_info["state"], "complete", + msg="expected state to be 'complete', found '{0}".format(subvol_info["state"])) + self.assertEqual(len(subvol_info["features"]), 2, + msg="expected 1 feature, found '{0}' ({1})".format(len(subvol_info["features"]), subvol_info["features"])) + for feature in ['snapshot-clone', 'snapshot-autoprotect']: + self.assertIn(feature, subvol_info["features"], msg="expected feature '{0}' in subvolume".format(feature)) + + # resize + nsize = self.DEFAULT_FILE_SIZE*1024*1024*10 + self._fs_cmd("subvolume", "resize", self.volname, subvolume, str(nsize)) + subvol_info = json.loads(self._get_subvolume_info(self.volname, subvolume)) + for md in subvol_md: + self.assertIn(md, subvol_info, "'{0}' key not present in metadata of subvolume".format(md)) + self.assertEqual(subvol_info["bytes_quota"], nsize, "bytes_quota should be set to '{0}'".format(nsize)) + + # create (idempotent) (change some attrs, to ensure attrs are preserved from the snapshot on clone) + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--mode", mode, "--uid", uid, "--gid", gid) + + # do some IO + self._do_subvolume_io(subvolume, number_of_files=8) + + # snap-create + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # clone + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone1) + + # check clone status + self._wait_for_clone_to_complete(clone1) + + # ensure clone is v2 + self._assert_meta_location_and_version(self.volname, clone1, version=2) + + # verify clone + self._verify_clone(subvolume, snapshot, clone1, source_version=1) + + # clone (older snapshot) + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, 'fake', clone2) + + # check clone status + self._wait_for_clone_to_complete(clone2) + + # ensure clone is v2 + self._assert_meta_location_and_version(self.volname, clone2, version=2) + + # verify clone + # TODO: rentries will mismatch till this is fixed https://tracker.ceph.com/issues/46747 + #self._verify_clone(subvolume, 'fake', clone2, source_version=1) + + # snap-info + snap_info = json.loads(self._get_subvolume_snapshot_info(self.volname, subvolume, snapshot)) + for md in snap_md: + self.assertIn(md, snap_info, "'{0}' key not present in metadata of snapshot".format(md)) + self.assertEqual(snap_info["has_pending_clones"], "no") + + # snap-ls + subvol_snapshots = json.loads(self._fs_cmd('subvolume', 'snapshot', 'ls', self.volname, subvolume)) + self.assertEqual(len(subvol_snapshots), 2, "subvolume ls count mismatch, expected 2', found {0}".format(len(subvol_snapshots))) + snapshotnames = [snapshot['name'] for snapshot in subvol_snapshots] + for name in [snapshot, 'fake']: + self.assertIn(name, snapshotnames, msg="expected snapshot '{0}' in subvolume snapshot ls".format(name)) + + # snap-rm + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, "fake") + + # ensure volume is still at version 1 + self._assert_meta_location_and_version(self.volname, subvolume, version=1) + + # rm + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + self._fs_cmd("subvolume", "rm", self.volname, clone1) + self._fs_cmd("subvolume", "rm", self.volname, clone2) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_no_upgrade_v1_to_v2(self): + """ + poor man's upgrade test -- theme continues... + ensure v1 to v2 upgrades are not done automatically due to various states of v1 + """ + subvolume1, subvolume2, subvolume3 = self._generate_random_subvolume_name(3) + group = self._generate_random_group_name() + + # emulate a v1 subvolume -- in the default group + subvol1_path = self._create_v1_subvolume(subvolume1) + + # emulate a v1 subvolume -- in a custom group + subvol2_path = self._create_v1_subvolume(subvolume2, subvol_group=group) + + # emulate a v1 subvolume -- in a clone pending state + self._create_v1_subvolume(subvolume3, subvol_type='clone', has_snapshot=False, state='pending') + + # this would attempt auto-upgrade on access, but fail to do so as snapshots exist + subvolpath1 = self._get_subvolume_path(self.volname, subvolume1) + self.assertEqual(subvolpath1, subvol1_path) + + subvolpath2 = self._get_subvolume_path(self.volname, subvolume2, group_name=group) + self.assertEqual(subvolpath2, subvol2_path) + + # this would attempt auto-upgrade on access, but fail to do so as volume is not complete + # use clone status, as only certain operations are allowed in pending state + status = json.loads(self._fs_cmd("clone", "status", self.volname, subvolume3)) + self.assertEqual(status["status"]["state"], "pending") + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume1, "fake") + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume2, "fake", group) + + # ensure metadata file is in v1 location, with version retained as v1 + self._assert_meta_location_and_version(self.volname, subvolume1, version=1) + self._assert_meta_location_and_version(self.volname, subvolume2, subvol_group=group, version=1) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume1) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, group) + try: + self._fs_cmd("subvolume", "rm", self.volname, subvolume3) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EAGAIN, "invalid error code on rm of subvolume undergoing clone") + else: + self.fail("expected rm of subvolume undergoing clone to fail") + + # ensure metadata file is in v1 location, with version retained as v1 + self._assert_meta_location_and_version(self.volname, subvolume3, version=1) + self._fs_cmd("subvolume", "rm", self.volname, subvolume3, "--force") + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_upgrade_v1_to_v2(self): + """ + poor man's upgrade test -- theme continues... + ensure v1 to v2 upgrades work + """ + subvolume1, subvolume2 = self._generate_random_subvolume_name(2) + group = self._generate_random_group_name() + + # emulate a v1 subvolume -- in the default group + subvol1_path = self._create_v1_subvolume(subvolume1, has_snapshot=False) + + # emulate a v1 subvolume -- in a custom group + subvol2_path = self._create_v1_subvolume(subvolume2, subvol_group=group, has_snapshot=False) + + # this would attempt auto-upgrade on access + subvolpath1 = self._get_subvolume_path(self.volname, subvolume1) + self.assertEqual(subvolpath1, subvol1_path) + + subvolpath2 = self._get_subvolume_path(self.volname, subvolume2, group_name=group) + self.assertEqual(subvolpath2, subvol2_path) + + # ensure metadata file is in v2 location, with version retained as v2 + self._assert_meta_location_and_version(self.volname, subvolume1, version=2) + self._assert_meta_location_and_version(self.volname, subvolume2, subvol_group=group, version=2) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume1) + self._fs_cmd("subvolume", "rm", self.volname, subvolume2, group) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_rm_with_snapshots(self): + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # remove subvolume -- should fail with ENOTEMPTY since it has snapshots + try: + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + except CommandFailedError as ce: + if ce.exitstatus != errno.ENOTEMPTY: + raise RuntimeError("invalid error code returned when deleting subvolume with snapshots") + else: + raise RuntimeError("expected subvolume deletion to fail") + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_without_snapshots(self): + """ + ensure retain snapshots based delete of a subvolume with no snapshots, deletes the subbvolume + """ + subvolume = self._generate_random_subvolume_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # remove with snapshot retention (should remove volume, no snapshots to retain) + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_with_snapshots(self): + """ + ensure retain snapshots based delete of a subvolume with snapshots retains the subvolume + also test allowed and dis-allowed operations on a retained subvolume + """ + snap_md = ["created_at", "data_pool", "has_pending_clones", "size"] + + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # remove subvolume -- should fail with ENOTEMPTY since it has snapshots + try: + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOTEMPTY, "invalid error code on rm of retained subvolume with snapshots") + else: + self.fail("expected rm of subvolume with retained snapshots to fail") + + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # fetch info + subvol_info = json.loads(self._fs_cmd("subvolume", "info", self.volname, subvolume)) + self.assertEqual(subvol_info["state"], "snapshot-retained", + msg="expected state to be 'snapshot-retained', found '{0}".format(subvol_info["state"])) + + ## test allowed ops in retained state + # ls + subvolumes = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumes), 1, "subvolume ls count mismatch, expected '1', found {0}".format(len(subvolumes))) + self.assertEqual(subvolumes[0]['name'], subvolume, + "subvolume name mismatch in ls output, expected '{0}', found '{1}'".format(subvolume, subvolumes[0]['name'])) + + # snapshot info + snap_info = json.loads(self._get_subvolume_snapshot_info(self.volname, subvolume, snapshot)) + for md in snap_md: + self.assertIn(md, snap_info, "'{0}' key not present in metadata of snapshot".format(md)) + self.assertEqual(snap_info["has_pending_clones"], "no") + + # rm --force (allowed but should fail) + try: + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--force") + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOTEMPTY, "invalid error code on rm of subvolume with retained snapshots") + else: + self.fail("expected rm of subvolume with retained snapshots to fail") + + # rm (allowed but should fail) + try: + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOTEMPTY, "invalid error code on rm of subvolume with retained snapshots") + else: + self.fail("expected rm of subvolume with retained snapshots to fail") + + ## test disallowed ops + # getpath + try: + self._fs_cmd("subvolume", "getpath", self.volname, subvolume) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on getpath of subvolume with retained snapshots") + else: + self.fail("expected getpath of subvolume with retained snapshots to fail") + + # resize + nsize = self.DEFAULT_FILE_SIZE*1024*1024 + try: + self._fs_cmd("subvolume", "resize", self.volname, subvolume, str(nsize)) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on resize of subvolume with retained snapshots") + else: + self.fail("expected resize of subvolume with retained snapshots to fail") + + # snap-create + try: + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, "fail") + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on snapshot create of subvolume with retained snapshots") + else: + self.fail("expected snapshot create of subvolume with retained snapshots to fail") + + # remove snapshot (should remove volume) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_invalid_recreate(self): + """ + ensure retained subvolume recreate does not leave any incarnations in the subvolume and trash + """ + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # recreate subvolume with an invalid pool + data_pool = "invalid_pool" + try: + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--pool_layout", data_pool) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EINVAL, "invalid error code on recreate of subvolume with invalid poolname") + else: + self.fail("expected recreate of subvolume with invalid poolname to fail") + + # fetch info + subvol_info = json.loads(self._fs_cmd("subvolume", "info", self.volname, subvolume)) + self.assertEqual(subvol_info["state"], "snapshot-retained", + msg="expected state to be 'snapshot-retained', found '{0}".format(subvol_info["state"])) + + # getpath + try: + self._fs_cmd("subvolume", "getpath", self.volname, subvolume) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on getpath of subvolume with retained snapshots") + else: + self.fail("expected getpath of subvolume with retained snapshots to fail") + + # remove snapshot (should remove volume) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_trash_busy_recreate(self): + """ + ensure retained subvolume recreate fails if its trash is not yet purged + """ + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # fake a trash entry + self._update_fake_trash(subvolume) + + # recreate subvolume + try: + self._fs_cmd("subvolume", "create", self.volname, subvolume) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EAGAIN, "invalid error code on recreate of subvolume with purge pending") + else: + self.fail("expected recreate of subvolume with purge pending to fail") + + # clear fake trash entry + self._update_fake_trash(subvolume, create=False) + + # recreate subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_trash_busy_recreate_clone(self): + """ + ensure retained clone recreate fails if its trash is not yet purged + """ + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + clone = self._generate_random_clone_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # clone subvolume snapshot + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + + # check clone status + self._wait_for_clone_to_complete(clone) + + # snapshot clone + self._fs_cmd("subvolume", "snapshot", "create", self.volname, clone, snapshot) + + # remove clone with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, clone, "--retain-snapshots") + + # fake a trash entry + self._update_fake_trash(clone) + + # clone subvolume snapshot (recreate) + try: + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.EAGAIN, "invalid error code on recreate of clone with purge pending") + else: + self.fail("expected recreate of clone with purge pending to fail") + + # clear fake trash entry + self._update_fake_trash(clone, create=False) + + # recreate subvolume + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + + # check clone status + self._wait_for_clone_to_complete(clone) + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, clone, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + self._fs_cmd("subvolume", "rm", self.volname, clone) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_recreate_subvolume(self): + """ + ensure a retained subvolume can be recreated and further snapshotted + """ + snap_md = ["created_at", "data_pool", "has_pending_clones", "size"] + + subvolume = self._generate_random_subvolume_name() + snapshot1, snapshot2 = self._generate_random_snapshot_name(2) + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot1) + + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # fetch info + subvol_info = json.loads(self._fs_cmd("subvolume", "info", self.volname, subvolume)) + self.assertEqual(subvol_info["state"], "snapshot-retained", + msg="expected state to be 'snapshot-retained', found '{0}".format(subvol_info["state"])) + + # recreate retained subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # fetch info + subvol_info = json.loads(self._fs_cmd("subvolume", "info", self.volname, subvolume)) + self.assertEqual(subvol_info["state"], "complete", + msg="expected state to be 'snapshot-retained', found '{0}".format(subvol_info["state"])) + + # snapshot info (older snapshot) + snap_info = json.loads(self._get_subvolume_snapshot_info(self.volname, subvolume, snapshot1)) + for md in snap_md: + self.assertIn(md, snap_info, "'{0}' key not present in metadata of snapshot".format(md)) + self.assertEqual(snap_info["has_pending_clones"], "no") + + # snap-create (new snapshot) + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot2) + + # remove with retain snapshots + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # list snapshots + subvolsnapshotls = json.loads(self._fs_cmd('subvolume', 'snapshot', 'ls', self.volname, subvolume)) + self.assertEqual(len(subvolsnapshotls), 2, "Expected the 'fs subvolume snapshot ls' command to list the" + " created subvolume snapshots") + snapshotnames = [snapshot['name'] for snapshot in subvolsnapshotls] + for snap in [snapshot1, snapshot2]: + self.assertIn(snap, snapshotnames, "Missing snapshot '{0}' in snapshot list".format(snap)) + + # remove snapshots (should remove volume) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot1) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot2) + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_clone(self): + """ + clone a snapshot from a snapshot retained subvolume + """ + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + clone = self._generate_random_clone_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # store path for clone verification + subvol_path = self._get_subvolume_path(self.volname, subvolume) + + # do some IO + self._do_subvolume_io(subvolume, number_of_files=16) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") + + # clone retained subvolume snapshot + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + + # check clone status + self._wait_for_clone_to_complete(clone) + + # verify clone + self._verify_clone(subvolume, snapshot, clone, subvol_path=subvol_path) + + # remove snapshots (removes retained volume) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + + # remove subvolume + self._fs_cmd("subvolume", "rm", self.volname, clone) + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_retain_snapshot_recreate(self): + """ + recreate a subvolume from one of its retained snapshots + """ + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) + + # store path for clone verification + subvol_path = self._get_subvolume_path(self.volname, subvolume) + + # do some IO + self._do_subvolume_io(subvolume, number_of_files=16) - # create group - self._fs_cmd("subvolumegroup", "create", self.volname, group) + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) - # create subvolume in group - self._fs_cmd("subvolume", "create", self.volname, subvolume, "--group_name", group) + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") - # snapshot group - self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + # recreate retained subvolume using its own snapshot to clone + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, subvolume) - # remove snapshot - self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) + # check clone status + self._wait_for_clone_to_complete(subvolume) + + # verify clone + self._verify_clone(subvolume, snapshot, subvolume, subvol_path=subvol_path) # remove snapshot - try: - self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot) - except CommandFailedError as ce: - if ce.exitstatus != errno.ENOENT: - raise - else: - raise RuntimeError("expected the 'fs subvolumegroup snapshot rm' command to fail") + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) # remove subvolume - self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) # verify trash dir is clean self._wait_for_trash_empty() - # remove group - self._fs_cmd("subvolumegroup", "rm", self.volname, group) + def test_subvolume_clone_retain_snapshot_with_snapshots(self): + """ + retain snapshots of a cloned subvolume and check disallowed operations + """ + subvolume = self._generate_random_subvolume_name() + snapshot1, snapshot2 = self._generate_random_snapshot_name(2) + clone = self._generate_random_clone_name() - def test_subvolume_group_snapshot_rm_force(self): - # test removing non-existing subvolume group snapshot with --force - group = self._generate_random_group_name() - snapshot = self._generate_random_snapshot_name() - # remove snapshot - try: - self._fs_cmd("subvolumegroup", "snapshot", "rm", self.volname, group, snapshot, "--force") - except CommandFailedError: - raise RuntimeError("expected the 'fs subvolumegroup snapshot rm --force' command to succeed") + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) - def test_subvolume_group_snapshot_ls(self): - # tests the 'fs subvolumegroup snapshot ls' command + # store path for clone verification + subvol1_path = self._get_subvolume_path(self.volname, subvolume) - snapshots = [] + # do some IO + self._do_subvolume_io(subvolume, number_of_files=16) - # create group - group = self._generate_random_group_name() - self._fs_cmd("subvolumegroup", "create", self.volname, group) + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot1) - # create subvolumegroup snapshots - snapshots = self._generate_random_snapshot_name(3) - for snapshot in snapshots: - self._fs_cmd("subvolumegroup", "snapshot", "create", self.volname, group, snapshot) + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") - subvolgrpsnapshotls = json.loads(self._fs_cmd('subvolumegroup', 'snapshot', 'ls', self.volname, group)) - if len(subvolgrpsnapshotls) == 0: - raise RuntimeError("Expected the 'fs subvolumegroup snapshot ls' command to list the created subvolume group snapshots") - else: - snapshotnames = [snapshot['name'] for snapshot in subvolgrpsnapshotls] - if collections.Counter(snapshotnames) != collections.Counter(snapshots): - raise RuntimeError("Error creating or listing subvolume group snapshots") + # clone retained subvolume snapshot + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot1, clone) - def test_async_subvolume_rm(self): - subvolumes = self._generate_random_subvolume_name(100) + # check clone status + self._wait_for_clone_to_complete(clone) - # create subvolumes - for subvolume in subvolumes: - self._fs_cmd("subvolume", "create", self.volname, subvolume) - self._do_subvolume_io(subvolume, number_of_files=10) + # verify clone + self._verify_clone(subvolume, snapshot1, clone, subvol_path=subvol1_path) - self.mount_a.umount_wait() + # create a snapshot on the clone + self._fs_cmd("subvolume", "snapshot", "create", self.volname, clone, snapshot2) - # remove subvolumes - for subvolume in subvolumes: - self._fs_cmd("subvolume", "rm", self.volname, subvolume) + # retain a clone + self._fs_cmd("subvolume", "rm", self.volname, clone, "--retain-snapshots") - self.mount_a.mount_wait() + # list snapshots + clonesnapshotls = json.loads(self._fs_cmd('subvolume', 'snapshot', 'ls', self.volname, clone)) + self.assertEqual(len(clonesnapshotls), 1, "Expected the 'fs subvolume snapshot ls' command to list the" + " created subvolume snapshots") + snapshotnames = [snapshot['name'] for snapshot in clonesnapshotls] + for snap in [snapshot2]: + self.assertIn(snap, snapshotnames, "Missing snapshot '{0}' in snapshot list".format(snap)) - # verify trash dir is clean - self._wait_for_trash_empty(timeout=300) + ## check disallowed operations on retained clone + # clone-status + try: + self._fs_cmd("clone", "status", self.volname, clone) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on clone status of clone with retained snapshots") + else: + self.fail("expected clone status of clone with retained snapshots to fail") - def test_mgr_eviction(self): - # unmount any cephfs mounts - self.mount_a.umount_wait() - sessions = self._session_list() - self.assertLessEqual(len(sessions), 1) # maybe mgr is already mounted + # clone-cancel + try: + self._fs_cmd("clone", "cancel", self.volname, clone) + except CommandFailedError as ce: + self.assertEqual(ce.exitstatus, errno.ENOENT, "invalid error code on clone cancel of clone with retained snapshots") + else: + self.fail("expected clone cancel of clone with retained snapshots to fail") - # Get the mgr to definitely mount cephfs - subvolume = self._generate_random_subvolume_name() - self._fs_cmd("subvolume", "create", self.volname, subvolume) - sessions = self._session_list() - self.assertEqual(len(sessions), 1) + # remove snapshots (removes subvolumes as all are in retained state) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot1) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, clone, snapshot2) - # Now fail the mgr, check the session was evicted - mgr = self.mgr_cluster.get_active_id() - self.mgr_cluster.mgr_fail(mgr) - self.wait_until_evicted(sessions[0]['id']) + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) + + # verify trash dir is clean + self._wait_for_trash_empty() - def test_subvolume_upgrade(self): + def test_subvolume_retain_snapshot_clone_from_newer_snapshot(self): """ - poor man's upgrade test -- rather than going through a full upgrade cycle, - emulate subvolumes by going through the wormhole and verify if they are - accessible. + clone a subvolume from recreated subvolume's latest snapshot """ - subvolume1, subvolume2 = self._generate_random_subvolume_name(2) - group = self._generate_random_group_name() + subvolume = self._generate_random_subvolume_name() + snapshot1, snapshot2 = self._generate_random_snapshot_name(2) + clone = self._generate_random_clone_name(1) - # emulate a old-fashioned subvolume -- one in the default group and - # the other in a custom group - createpath1 = os.path.join(".", "volumes", "_nogroup", subvolume1) - self.mount_a.run_shell(['mkdir', '-p', createpath1]) + # create subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) - # create group - createpath2 = os.path.join(".", "volumes", group, subvolume2) - self.mount_a.run_shell(['mkdir', '-p', createpath2]) + # do some IO + self._do_subvolume_io(subvolume, number_of_files=16) - # this would auto-upgrade on access without anyone noticing - subvolpath1 = self._fs_cmd("subvolume", "getpath", self.volname, subvolume1) - self.assertNotEqual(subvolpath1, None) - subvolpath1 = subvolpath1.rstrip() # remove "/" prefix and any trailing newline + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot1) - subvolpath2 = self._fs_cmd("subvolume", "getpath", self.volname, subvolume2, group) - self.assertNotEqual(subvolpath2, None) - subvolpath2 = subvolpath2.rstrip() # remove "/" prefix and any trailing newline + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") - # and... the subvolume path returned should be what we created behind the scene - self.assertEqual(createpath1[1:], subvolpath1) - self.assertEqual(createpath2[1:], subvolpath2) + # recreate subvolume + self._fs_cmd("subvolume", "create", self.volname, subvolume) - # remove subvolume - self._fs_cmd("subvolume", "rm", self.volname, subvolume1) - self._fs_cmd("subvolume", "rm", self.volname, subvolume2, group) + # get and store path for clone verification + subvol2_path = self._get_subvolume_path(self.volname, subvolume) - # verify trash dir is clean - self._wait_for_trash_empty() + # do some IO + self._do_subvolume_io(subvolume, number_of_files=16) - # remove group - self._fs_cmd("subvolumegroup", "rm", self.volname, group) + # snapshot newer subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot2) - def test_subvolume_rm_with_snapshots(self): - subvolume = self._generate_random_subvolume_name() - snapshot = self._generate_random_snapshot_name() + # remove with snapshot retention + self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--retain-snapshots") - # create subvolume - self._fs_cmd("subvolume", "create", self.volname, subvolume) + # clone retained subvolume's newer snapshot + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot2, clone) - # snapshot subvolume - self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + # check clone status + self._wait_for_clone_to_complete(clone) - # remove subvolume -- should fail with ENOTEMPTY since it has snapshots - try: - self._fs_cmd("subvolume", "rm", self.volname, subvolume) - except CommandFailedError as ce: - if ce.exitstatus != errno.ENOTEMPTY: - raise RuntimeError("invalid error code returned when deleting subvolume with snapshots") - else: - raise RuntimeError("expected subvolume deletion to fail") + # verify clone + self._verify_clone(subvolume, snapshot2, clone, subvol_path=subvol2_path) # remove snapshot - self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot1) + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot2) # remove subvolume - self._fs_cmd("subvolume", "rm", self.volname, subvolume) + self._fs_cmd("subvolume", "rm", self.volname, clone) + + # verify list subvolumes returns an empty list + subvolumels = json.loads(self._fs_cmd('subvolume', 'ls', self.volname)) + self.assertEqual(len(subvolumels), 0) # verify trash dir is clean self._wait_for_trash_empty() @@ -1682,12 +3681,12 @@ # now, unprotect snapshot self._fs_cmd("subvolume", "snapshot", "unprotect", self.volname, subvolume, snapshot) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -1715,12 +3714,12 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -1771,12 +3770,12 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone, clone_pool=new_pool) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - subvol_path = self._get_subvolume_path(self.volname, clone) desired_pool = self.mount_a.getfattr(subvol_path, "ceph.dir.layout.pool") self.assertEqual(desired_pool, new_pool) @@ -1796,6 +3795,9 @@ mode = "777" uid = "1000" gid = "1000" + new_uid = "1001" + new_gid = "1001" + new_mode = "700" # create subvolume self._fs_cmd("subvolume", "create", self.volname, subvolume, "--mode", mode, "--uid", uid, "--gid", gid) @@ -1806,17 +3808,64 @@ # snapshot subvolume self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + # change subvolume attrs (to ensure clone picks up snapshot attrs) + self._do_subvolume_attr_update(subvolume, new_uid, new_gid, new_mode) + # schedule a clone self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) + # remove subvolumes + self._fs_cmd("subvolume", "rm", self.volname, subvolume) + self._fs_cmd("subvolume", "rm", self.volname, clone) + + # verify trash dir is clean + self._wait_for_trash_empty() + + def test_subvolume_clone_inherit_snapshot_namespace_and_size(self): + subvolume = self._generate_random_subvolume_name() + snapshot = self._generate_random_snapshot_name() + clone = self._generate_random_clone_name() + osize = self.DEFAULT_FILE_SIZE*1024*1024*12 + + # create subvolume, in an isolated namespace with a specified size + self._fs_cmd("subvolume", "create", self.volname, subvolume, "--namespace-isolated", "--size", str(osize)) + + # do some IO + self._do_subvolume_io(subvolume, number_of_files=8) + + # snapshot subvolume + self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + + # create a pool different from current subvolume pool + subvol_path = self._get_subvolume_path(self.volname, subvolume) + default_pool = self.mount_a.getfattr(subvol_path, "ceph.dir.layout.pool") + new_pool = "new_pool" + self.assertNotEqual(default_pool, new_pool) + self.fs.add_data_pool(new_pool) + + # update source subvolume pool + self._do_subvolume_pool_and_namespace_update(subvolume, pool=new_pool, pool_namespace="") + + # schedule a clone, with NO --pool specification + self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) + + # check clone status + self._wait_for_clone_to_complete(clone) + # verify clone - self._verify_clone(subvolume, clone) + self._verify_clone(subvolume, snapshot, clone) + + # remove snapshot + self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) @@ -1845,12 +3894,12 @@ # check clone status self._wait_for_clone_to_complete(clone1) + # verify clone + self._verify_clone(subvolume, snapshot, clone1) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone1) - # now the clone is just like a normal subvolume -- snapshot the clone and fork # another clone. before that do some IO so it's can be differentiated. self._do_subvolume_io(clone1, create_dir="data", number_of_files=32) @@ -1864,12 +3913,12 @@ # check clone status self._wait_for_clone_to_complete(clone2) + # verify clone + self._verify_clone(clone1, snapshot, clone2) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, clone1, snapshot) - # verify clone - self._verify_clone(clone1, clone2) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone1) @@ -1902,12 +3951,12 @@ # check clone status self._wait_for_clone_to_complete(clone, clone_group=group) + # verify clone + self._verify_clone(subvolume, snapshot, clone, clone_group=group) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone, clone_group=group) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone, group) @@ -1942,12 +3991,12 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone, source_group=group) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot, group) - # verify clone - self._verify_clone(subvolume, clone, source_group=group) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume, group) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -1984,12 +4033,12 @@ # check clone status self._wait_for_clone_to_complete(clone, clone_group=c_group) + # verify clone + self._verify_clone(subvolume, snapshot, clone, source_group=s_group, clone_group=c_group) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot, s_group) - # verify clone - self._verify_clone(subvolume, clone, source_group=s_group, clone_group=c_group) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume, s_group) self._fs_cmd("subvolume", "rm", self.volname, clone, c_group) @@ -2006,6 +4055,7 @@ yet another poor man's upgrade test -- rather than going through a full upgrade cycle, emulate old types subvolumes by going through the wormhole and verify clone operation. + further ensure that a legacy volume is not updated to v2, but clone is. """ subvolume = self._generate_random_subvolume_name() snapshot = self._generate_random_snapshot_name() @@ -2015,12 +4065,19 @@ createpath = os.path.join(".", "volumes", "_nogroup", subvolume) self.mount_a.run_shell(['mkdir', '-p', createpath]) + # add required xattrs to subvolume + default_pool = self.mount_a.getfattr(".", "ceph.dir.layout.pool") + self.mount_a.setfattr(createpath, 'ceph.dir.layout.pool', default_pool) + # do some IO self._do_subvolume_io(subvolume, number_of_files=64) # snapshot subvolume self._fs_cmd("subvolume", "snapshot", "create", self.volname, subvolume, snapshot) + # ensure metadata file is in legacy location, with required version v1 + self._assert_meta_location_and_version(self.volname, subvolume, version=1, legacy=True) + # schedule a clone self._fs_cmd("subvolume", "snapshot", "clone", self.volname, subvolume, snapshot, clone) @@ -2035,11 +4092,14 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone, source_version=1) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) + # ensure metadata file is in v2 location, with required version v2 + self._assert_meta_location_and_version(self.volname, clone) # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) @@ -2081,12 +4141,12 @@ subvolpath = self._get_subvolume_path(self.volname, clone) self.assertNotEqual(subvolpath, None) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -2126,12 +4186,12 @@ subvolpath = self._get_subvolume_path(self.volname, clone) self.assertNotEqual(subvolpath, None) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -2171,12 +4231,12 @@ subvolpath = self._get_subvolume_path(self.volname, clone) self.assertNotEqual(subvolpath, None) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) @@ -2242,12 +4302,12 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume1, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume1, snapshot) - # verify clone - self._verify_clone(subvolume1, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume1) self._fs_cmd("subvolume", "rm", self.volname, subvolume2) @@ -2288,7 +4348,7 @@ self._wait_for_clone_to_complete(clone1) # verify clone - self._verify_clone(subvolume, clone1) + self._verify_clone(subvolume, snapshot, clone1, clone_pool=new_pool) # wait a bit so that subsequent I/O will give pool full error time.sleep(120) @@ -2339,12 +4399,12 @@ # check clone status self._wait_for_clone_to_complete(clone) + # verify clone + self._verify_clone(subvolume, snapshot, clone) + # remove snapshot self._fs_cmd("subvolume", "snapshot", "rm", self.volname, subvolume, snapshot) - # verify clone - self._verify_clone(subvolume, clone) - # remove subvolumes self._fs_cmd("subvolume", "rm", self.volname, subvolume) self._fs_cmd("subvolume", "rm", self.volname, clone) diff -Nru ceph-15.2.8/qa/tasks/ceph.py ceph-15.2.11/qa/tasks/ceph.py --- ceph-15.2.8/qa/tasks/ceph.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/ceph.py 2021-04-19 13:47:30.000000000 +0000 @@ -155,13 +155,12 @@ while not self.stop_event.is_set(): self.stop_event.wait(timeout=30) try: - run.wait( - ctx.cluster.run( - args=['sudo', 'logrotate', '/etc/logrotate.d/ceph-test.conf' - ], - wait=False, - ) + procs = ctx.cluster.run( + args=['sudo', 'logrotate', '/etc/logrotate.d/ceph-test.conf'], + wait=False, + stderr=StringIO() ) + run.wait(procs) except exceptions.ConnectionLostError as e: # Some tests may power off nodes during test, in which # case we will see connection errors that we should ignore. @@ -175,6 +174,14 @@ log.debug("Missed logrotate, EOFError") except SSHException: log.debug("Missed logrotate, SSHException") + except run.CommandFailedError as e: + for p in procs: + if p.finished and p.exitstatus != 0: + err = p.stderr.getvalue() + if 'error: error renaming temp state file' in err: + log.info('ignoring transient state error: %s', e) + else: + raise except socket.error as e: if e.errno in (errno.EHOSTUNREACH, errno.ECONNRESET): log.debug("Missed logrotate, host unreachable") @@ -1078,13 +1085,13 @@ return stdout or None if first_in_ceph_log('\[ERR\]|\[WRN\]|\[SEC\]', - config['log_whitelist']) is not None: + config['log_ignorelist']) is not None: log.warning('Found errors (ERR|WRN|SEC) in cluster log') ctx.summary['success'] = False # use the most severe problem as the failure reason if 'failure_reason' not in ctx.summary: for pattern in ['\[SEC\]', '\[ERR\]', '\[WRN\]']: - match = first_in_ceph_log(pattern, config['log_whitelist']) + match = first_in_ceph_log(pattern, config['log_ignorelist']) if match is not None: ctx.summary['failure_reason'] = \ '"{match}" in cluster log'.format( @@ -1725,7 +1732,7 @@ tasks: - ceph: - log-whitelist: ['foo.*bar', 'bad message'] + log-ignorelist: ['foo.*bar', 'bad message'] To run multiple ceph clusters, use multiple ceph tasks, and roles with a cluster name prefix, e.g. cluster1.client.0. Roles with no @@ -1797,7 +1804,7 @@ mkfs_options=config.get('mkfs_options', None), mount_options=config.get('mount_options', None), skip_mgr_daemons=config.get('skip_mgr_daemons', False), - log_whitelist=config.get('log-whitelist', []), + log_ignorelist=config.get('log-ignorelist', []), cpu_profile=set(config.get('cpu_profile', []),), cluster=config['cluster'], mon_bind_msgr2=config.get('mon_bind_msgr2', True), diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/helper.py ceph-15.2.11/qa/tasks/mgr/dashboard/helper.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/helper.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/helper.py 2021-04-19 13:47:30.000000000 +0000 @@ -4,8 +4,12 @@ import json import logging -from collections import namedtuple +import random +import re +import string import time +from collections import namedtuple +from typing import List import requests import six @@ -65,14 +69,13 @@ raise ex user_create_args = [ - 'dashboard', 'ac-user-create', username, password + 'dashboard', 'ac-user-create', username ] if force_password: user_create_args.append('--force-password') if cmd_args: user_create_args.extend(cmd_args) - cls._ceph_cmd(user_create_args) - + cls._ceph_cmd_with_secret(user_create_args, password) if roles: set_roles_args = ['dashboard', 'ac-user-set-roles', username] for idx, role in enumerate(roles): @@ -96,18 +99,19 @@ cls._ceph_cmd(set_roles_args) @classmethod - def login(cls, username, password): + def login(cls, username, password, set_cookies=False): if cls._loggedin: cls.logout() - cls._post('/api/auth', {'username': username, 'password': password}) + cls._post('/api/auth', {'username': username, + 'password': password}, set_cookies=set_cookies) cls._assertEq(cls._resp.status_code, 201) cls._token = cls.jsonBody()['token'] cls._loggedin = True @classmethod - def logout(cls): + def logout(cls, set_cookies=False): if cls._loggedin: - cls._post('/api/auth/logout') + cls._post('/api/auth/logout', set_cookies=set_cookies) cls._assertEq(cls._resp.status_code, 200) cls._token = None cls._loggedin = False @@ -195,29 +199,49 @@ def tearDownClass(cls): super(DashboardTestCase, cls).tearDownClass() - # pylint: disable=inconsistent-return-statements + # pylint: disable=inconsistent-return-statements, too-many-branches @classmethod - def _request(cls, url, method, data=None, params=None): + def _request(cls, url, method, data=None, params=None, set_cookies=False): url = "{}{}".format(cls._base_uri, url) - log.info("Request %s to %s", method, url) + log.debug("Request %s to %s", method, url) headers = {} + cookies = {} if cls._token: - headers['Authorization'] = "Bearer {}".format(cls._token) + if set_cookies: + cookies['token'] = cls._token + else: + headers['Authorization'] = "Bearer {}".format(cls._token) - if method == 'GET': - cls._resp = cls._session.get(url, params=params, verify=False, - headers=headers) - elif method == 'POST': - cls._resp = cls._session.post(url, json=data, params=params, - verify=False, headers=headers) - elif method == 'DELETE': - cls._resp = cls._session.delete(url, json=data, params=params, - verify=False, headers=headers) - elif method == 'PUT': - cls._resp = cls._session.put(url, json=data, params=params, - verify=False, headers=headers) + if set_cookies: + if method == 'GET': + cls._resp = cls._session.get(url, params=params, verify=False, + headers=headers, cookies=cookies) + elif method == 'POST': + cls._resp = cls._session.post(url, json=data, params=params, + verify=False, headers=headers, cookies=cookies) + elif method == 'DELETE': + cls._resp = cls._session.delete(url, json=data, params=params, + verify=False, headers=headers, cookies=cookies) + elif method == 'PUT': + cls._resp = cls._session.put(url, json=data, params=params, + verify=False, headers=headers, cookies=cookies) + else: + assert False else: - assert False + if method == 'GET': + cls._resp = cls._session.get(url, params=params, verify=False, + headers=headers) + elif method == 'POST': + cls._resp = cls._session.post(url, json=data, params=params, + verify=False, headers=headers) + elif method == 'DELETE': + cls._resp = cls._session.delete(url, json=data, params=params, + verify=False, headers=headers) + elif method == 'PUT': + cls._resp = cls._session.put(url, json=data, params=params, + verify=False, headers=headers) + else: + assert False try: if not cls._resp.ok: # Output response for easier debugging. @@ -231,8 +255,8 @@ raise ex @classmethod - def _get(cls, url, params=None): - return cls._request(url, 'GET', params=params) + def _get(cls, url, params=None, set_cookies=False): + return cls._request(url, 'GET', params=params, set_cookies=set_cookies) @classmethod def _view_cache_get(cls, url, retries=5): @@ -253,16 +277,16 @@ return res @classmethod - def _post(cls, url, data=None, params=None): - cls._request(url, 'POST', data, params) + def _post(cls, url, data=None, params=None, set_cookies=False): + cls._request(url, 'POST', data, params, set_cookies=set_cookies) @classmethod - def _delete(cls, url, data=None, params=None): - cls._request(url, 'DELETE', data, params) + def _delete(cls, url, data=None, params=None, set_cookies=False): + cls._request(url, 'DELETE', data, params, set_cookies=set_cookies) @classmethod - def _put(cls, url, data=None, params=None): - cls._request(url, 'PUT', data, params) + def _put(cls, url, data=None, params=None, set_cookies=False): + cls._request(url, 'PUT', data, params, set_cookies=set_cookies) @classmethod def _assertEq(cls, v1, v2): @@ -281,15 +305,15 @@ # pylint: disable=too-many-arguments @classmethod - def _task_request(cls, method, url, data, timeout): - res = cls._request(url, method, data) + def _task_request(cls, method, url, data, timeout, set_cookies=False): + res = cls._request(url, method, data, set_cookies=set_cookies) cls._assertIn(cls._resp.status_code, [200, 201, 202, 204, 400, 403, 404]) if cls._resp.status_code == 403: return None if cls._resp.status_code != 202: - log.info("task finished immediately") + log.debug("task finished immediately") return res cls._assertIn('name', res) @@ -301,8 +325,7 @@ res_task = None while retries > 0 and not res_task: retries -= 1 - log.info("task (%s, %s) is still executing", task_name, - task_metadata) + log.debug("task (%s, %s) is still executing", task_name, task_metadata) time.sleep(1) _res = cls._get('/api/task?name={}'.format(task_name)) cls._assertEq(cls._resp.status_code, 200) @@ -317,7 +340,7 @@ raise Exception("Waiting for task ({}, {}) to finish timed out. {}" .format(task_name, task_metadata, _res)) - log.info("task (%s, %s) finished", task_name, task_metadata) + log.debug("task (%s, %s) finished", task_name, task_metadata) if res_task['success']: if method == 'POST': cls._resp.status_code = 201 @@ -334,16 +357,16 @@ return res_task['exception'] @classmethod - def _task_post(cls, url, data=None, timeout=60): - return cls._task_request('POST', url, data, timeout) + def _task_post(cls, url, data=None, timeout=60, set_cookies=False): + return cls._task_request('POST', url, data, timeout, set_cookies=set_cookies) @classmethod - def _task_delete(cls, url, timeout=60): - return cls._task_request('DELETE', url, None, timeout) + def _task_delete(cls, url, timeout=60, set_cookies=False): + return cls._task_request('DELETE', url, None, timeout, set_cookies=set_cookies) @classmethod - def _task_put(cls, url, data=None, timeout=60): - return cls._task_request('PUT', url, data, timeout) + def _task_put(cls, url, data=None, timeout=60, set_cookies=False): + return cls._task_request('PUT', url, data, timeout, set_cookies=set_cookies) @classmethod def cookies(cls): @@ -403,15 +426,31 @@ @classmethod def _ceph_cmd(cls, cmd): res = cls.mgr_cluster.mon_manager.raw_cluster_cmd(*cmd) - log.info("command result: %s", res) + log.debug("command result: %s", res) return res @classmethod def _ceph_cmd_result(cls, cmd): exitstatus = cls.mgr_cluster.mon_manager.raw_cluster_cmd_result(*cmd) - log.info("command exit status: %d", exitstatus) + log.debug("command exit status: %d", exitstatus) return exitstatus + @classmethod + def _ceph_cmd_with_secret(cls, cmd: List[str], secret: str, return_exit_code: bool = False): + cmd.append('-i') + cmd.append('{}'.format(cls._ceph_create_tmp_file(secret))) + if return_exit_code: + return cls._ceph_cmd_result(cmd) + return cls._ceph_cmd(cmd) + + @classmethod + def _ceph_create_tmp_file(cls, content: str) -> str: + """Create a temporary file in the remote cluster""" + file_name = ''.join(random.choices(string.ascii_letters + string.digits, k=20)) + file_path = '/tmp/{}'.format(file_name) + cls._cmd(['sh', '-c', 'echo -n {} > {}'.format(content, file_path)]) + return file_path + def set_config_key(self, key, value): self._ceph_cmd(['config-key', 'set', key, value]) diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_auth.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_auth.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_auth.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_auth.py 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,8 @@ import time import jwt +from teuthology.orchestra.run import \ + CommandFailedError # pylint: disable=import-error from .helper import DashboardTestCase, JObj, JLeaf @@ -18,7 +20,7 @@ self.reset_session() def _validate_jwt_token(self, token, username, permissions): - payload = jwt.decode(token, verify=False) + payload = jwt.decode(token, options={'verify_signature': False}) self.assertIn('username', payload) self.assertEqual(payload['username'], username) @@ -29,7 +31,12 @@ self.assertIn('create', perms) self.assertIn('delete', perms) + def test_login_without_password(self): + with self.assertRaises(CommandFailedError): + self.create_user('admin2', '', ['administrator'], force_password=True) + def test_a_set_login_credentials(self): + # test with Authorization header self.create_user('admin2', 'admin2', ['administrator']) self._post("/api/auth", {'username': 'admin2', 'password': 'admin2'}) self.assertStatus(201) @@ -37,7 +44,16 @@ self._validate_jwt_token(data['token'], "admin2", data['permissions']) self.delete_user('admin2') + # test with Cookies set + self.create_user('admin2', 'admin2', ['administrator']) + self._post("/api/auth", {'username': 'admin2', 'password': 'admin2'}, set_cookies=True) + self.assertStatus(201) + data = self.jsonBody() + self._validate_jwt_token(data['token'], "admin2", data['permissions']) + self.delete_user('admin2') + def test_login_valid(self): + # test with Authorization header self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) self.assertStatus(201) data = self.jsonBody() @@ -51,7 +67,22 @@ }, allow_unknown=False)) self._validate_jwt_token(data['token'], "admin", data['permissions']) + # test with Cookies set + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + data = self.jsonBody() + self.assertSchema(data, JObj(sub_elems={ + 'token': JLeaf(str), + 'username': JLeaf(str), + 'permissions': JObj(sub_elems={}, allow_unknown=True), + 'sso': JLeaf(bool), + 'pwdExpirationDate': JLeaf(int, none=True), + 'pwdUpdateRequired': JLeaf(bool) + }, allow_unknown=False)) + self._validate_jwt_token(data['token'], "admin", data['permissions']) + def test_login_invalid(self): + # test with Authorization header self._post("/api/auth", {'username': 'admin', 'password': 'inval'}) self.assertStatus(400) self.assertJsonBody({ @@ -60,18 +91,68 @@ "detail": "Invalid credentials" }) - def test_login_without_password(self): - self.create_user('admin2', '', ['administrator']) - self._post("/api/auth", {'username': 'admin2', 'password': ''}) + # test with Cookies set + self._post("/api/auth", {'username': 'admin', 'password': 'inval'}, set_cookies=True) self.assertStatus(400) self.assertJsonBody({ "component": "auth", "code": "invalid_credentials", "detail": "Invalid credentials" }) - self.delete_user('admin2') + + def test_lockout_user(self): + # test with Authorization header + self._ceph_cmd(['dashboard', 'set-account-lockout-attempts', '3']) + for _ in range(3): + self._post("/api/auth", {'username': 'admin', 'password': 'inval'}) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) + self.assertStatus(400) + self.assertJsonBody({ + "component": "auth", + "code": "invalid_credentials", + "detail": "Invalid credentials" + }) + self._ceph_cmd(['dashboard', 'ac-user-enable', 'admin']) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) + self.assertStatus(201) + data = self.jsonBody() + self.assertSchema(data, JObj(sub_elems={ + 'token': JLeaf(str), + 'username': JLeaf(str), + 'permissions': JObj(sub_elems={}, allow_unknown=True), + 'sso': JLeaf(bool), + 'pwdExpirationDate': JLeaf(int, none=True), + 'pwdUpdateRequired': JLeaf(bool) + }, allow_unknown=False)) + self._validate_jwt_token(data['token'], "admin", data['permissions']) + + # test with Cookies set + self._ceph_cmd(['dashboard', 'set-account-lockout-attempts', '3']) + for _ in range(3): + self._post("/api/auth", {'username': 'admin', 'password': 'inval'}, set_cookies=True) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(400) + self.assertJsonBody({ + "component": "auth", + "code": "invalid_credentials", + "detail": "Invalid credentials" + }) + self._ceph_cmd(['dashboard', 'ac-user-enable', 'admin']) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + data = self.jsonBody() + self.assertSchema(data, JObj(sub_elems={ + 'token': JLeaf(str), + 'username': JLeaf(str), + 'permissions': JObj(sub_elems={}, allow_unknown=True), + 'sso': JLeaf(bool), + 'pwdExpirationDate': JLeaf(int, none=True), + 'pwdUpdateRequired': JLeaf(bool) + }, allow_unknown=False)) + self._validate_jwt_token(data['token'], "admin", data['permissions']) def test_logout(self): + # test with Authorization header self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) self.assertStatus(201) data = self.jsonBody() @@ -86,7 +167,23 @@ self.assertStatus(401) self.set_jwt_token(None) + # test with Cookies set + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + data = self.jsonBody() + self._validate_jwt_token(data['token'], "admin", data['permissions']) + self.set_jwt_token(data['token']) + self._post("/api/auth/logout", set_cookies=True) + self.assertStatus(200) + self.assertJsonBody({ + "redirect_url": "#/login" + }) + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + self.set_jwt_token(None) + def test_token_ttl(self): + # test with Authorization header self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '5']) self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) self.assertStatus(201) @@ -99,7 +196,21 @@ self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '28800']) self.set_jwt_token(None) + # test with Cookies set + self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '5']) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + self.set_jwt_token(self.jsonBody()['token']) + self._get("/api/host", set_cookies=True) + self.assertStatus(200) + time.sleep(6) + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '28800']) + self.set_jwt_token(None) + def test_remove_from_blacklist(self): + # test with Authorization header self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '5']) self._post("/api/auth", {'username': 'admin', 'password': 'admin'}) self.assertStatus(201) @@ -119,11 +230,37 @@ self._post("/api/auth/logout") self.assertStatus(200) + # test with Cookies set + self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '5']) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + self.set_jwt_token(self.jsonBody()['token']) + # the following call adds the token to the blocklist + self._post("/api/auth/logout", set_cookies=True) + self.assertStatus(200) + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + time.sleep(6) + self._ceph_cmd(['dashboard', 'set-jwt-token-ttl', '28800']) + self.set_jwt_token(None) + self._post("/api/auth", {'username': 'admin', 'password': 'admin'}, set_cookies=True) + self.assertStatus(201) + self.set_jwt_token(self.jsonBody()['token']) + # the following call removes expired tokens from the blocklist + self._post("/api/auth/logout", set_cookies=True) + self.assertStatus(200) + def test_unauthorized(self): + # test with Authorization header self._get("/api/host") self.assertStatus(401) + # test with Cookies set + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + def test_invalidate_token_by_admin(self): + # test with Authorization header self._get("/api/host") self.assertStatus(401) self.create_user('user', 'user', ['read-only']) @@ -134,8 +271,9 @@ self._get("/api/host") self.assertStatus(200) time.sleep(1) - self._ceph_cmd(['dashboard', 'ac-user-set-password', '--force-password', - 'user', 'user2']) + self._ceph_cmd_with_secret(['dashboard', 'ac-user-set-password', '--force-password', + 'user'], + 'user2') time.sleep(1) self._get("/api/host") self.assertStatus(401) @@ -147,7 +285,33 @@ self.assertStatus(200) self.delete_user("user") + # test with Cookies set + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + self.create_user('user', 'user', ['read-only']) + time.sleep(1) + self._post("/api/auth", {'username': 'user', 'password': 'user'}, set_cookies=True) + self.assertStatus(201) + self.set_jwt_token(self.jsonBody()['token']) + self._get("/api/host", set_cookies=True) + self.assertStatus(200) + time.sleep(1) + self._ceph_cmd_with_secret(['dashboard', 'ac-user-set-password', '--force-password', + 'user'], + 'user2') + time.sleep(1) + self._get("/api/host", set_cookies=True) + self.assertStatus(401) + self.set_jwt_token(None) + self._post("/api/auth", {'username': 'user', 'password': 'user2'}, set_cookies=True) + self.assertStatus(201) + self.set_jwt_token(self.jsonBody()['token']) + self._get("/api/host", set_cookies=True) + self.assertStatus(200) + self.delete_user("user") + def test_check_token(self): + # test with Authorization header self.login("admin", "admin") self._post("/api/auth/check", {"token": self.jsonBody()["token"]}) self.assertStatus(200) @@ -160,7 +324,21 @@ }, allow_unknown=False)) self.logout() + # test with Cookies set + self.login("admin", "admin", set_cookies=True) + self._post("/api/auth/check", {"token": self.jsonBody()["token"]}, set_cookies=True) + self.assertStatus(200) + data = self.jsonBody() + self.assertSchema(data, JObj(sub_elems={ + "username": JLeaf(str), + "permissions": JObj(sub_elems={}, allow_unknown=True), + "sso": JLeaf(bool), + "pwdUpdateRequired": JLeaf(bool) + }, allow_unknown=False)) + self.logout(set_cookies=True) + def test_check_wo_token(self): + # test with Authorization header self.login("admin", "admin") self._post("/api/auth/check", {"token": ""}) self.assertStatus(200) @@ -169,3 +347,13 @@ "login_url": JLeaf(str) }, allow_unknown=False)) self.logout() + + # test with Cookies set + self.login("admin", "admin", set_cookies=True) + self._post("/api/auth/check", {"token": ""}, set_cookies=True) + self.assertStatus(200) + data = self.jsonBody() + self.assertSchema(data, JObj(sub_elems={ + "login_url": JLeaf(str) + }, allow_unknown=False)) + self.logout(set_cookies=True) diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_ganesha.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_ganesha.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_ganesha.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_ganesha.py 2021-04-19 13:47:30.000000000 +0000 @@ -40,8 +40,8 @@ 'user', 'create', '--uid', 'admin', '--display-name', 'admin', '--system', '--access-key', 'admin', '--secret', 'admin' ]) - cls._ceph_cmd(['dashboard', 'set-rgw-api-secret-key', 'admin']) - cls._ceph_cmd(['dashboard', 'set-rgw-api-access-key', 'admin']) + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-secret-key'], 'admin') + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-access-key'], 'admin') @classmethod def tearDownClass(cls): diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_osd.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_osd.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_osd.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_osd.py 2021-04-19 13:47:30.000000000 +0000 @@ -237,36 +237,139 @@ class OsdFlagsTest(DashboardTestCase): def __init__(self, *args, **kwargs): super(OsdFlagsTest, self).__init__(*args, **kwargs) - self._initial_flags = sorted( # These flags cannot be unset - ['sortbitwise', 'recovery_deletes', 'purged_snapdirs', - 'pglog_hardlimit']) + self._initial_flags = ['sortbitwise', 'recovery_deletes', 'purged_snapdirs', + 'pglog_hardlimit'] # These flags cannot be unset @classmethod - def _get_cluster_osd_flags(cls): - return sorted( - json.loads(cls._ceph_cmd(['osd', 'dump', - '--format=json']))['flags_set']) + def _put_flags(cls, flags, ids=None): + url = '/api/osd/flags' + data = {'flags': flags} - @classmethod - def _put_flags(cls, flags): - cls._put('/api/osd/flags', data={'flags': flags}) - return sorted(cls._resp.json()) + if ids: + url = url + '/individual' + data['ids'] = ids + + cls._put(url, data=data) + return cls._resp.json() def test_list_osd_flags(self): flags = self._get('/api/osd/flags') self.assertStatus(200) self.assertEqual(len(flags), 4) - self.assertEqual(sorted(flags), self._initial_flags) + self.assertCountEqual(flags, self._initial_flags) def test_add_osd_flag(self): flags = self._put_flags([ 'sortbitwise', 'recovery_deletes', 'purged_snapdirs', 'noout', 'pause', 'pglog_hardlimit' ]) - self.assertEqual(flags, sorted([ + self.assertCountEqual(flags, [ 'sortbitwise', 'recovery_deletes', 'purged_snapdirs', 'noout', 'pause', 'pglog_hardlimit' - ])) + ]) # Restore flags self._put_flags(self._initial_flags) + + def test_get_indiv_flag(self): + initial = self._get('/api/osd/flags/individual') + self.assertStatus(200) + self.assertSchema(initial, JList(JObj({ + 'osd': int, + 'flags': JList(str) + }))) + + self._ceph_cmd(['osd', 'set-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2']) + flags_added = self._get('/api/osd/flags/individual') + self.assertStatus(200) + for osd in flags_added: + if osd['osd'] in [0, 1, 2]: + self.assertIn('noout', osd['flags']) + self.assertIn('noin', osd['flags']) + for osd_initial in initial: + if osd['osd'] == osd_initial['osd']: + self.assertGreater(len(osd['flags']), len(osd_initial['flags'])) + + self._ceph_cmd(['osd', 'unset-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2']) + flags_removed = self._get('/api/osd/flags/individual') + self.assertStatus(200) + for osd in flags_removed: + if osd['osd'] in [0, 1, 2]: + self.assertNotIn('noout', osd['flags']) + self.assertNotIn('noin', osd['flags']) + + def test_add_indiv_flag(self): + flags_update = {'noup': None, 'nodown': None, 'noin': None, 'noout': True} + svc_id = 0 + + resp = self._put_flags(flags_update, [svc_id]) + self._check_indiv_flags_resp(resp, [svc_id], ['noout'], [], ['noup', 'nodown', 'noin']) + self._check_indiv_flags_osd([svc_id], ['noout'], ['noup', 'nodown', 'noin']) + + self._ceph_cmd(['osd', 'unset-group', 'noout', 'osd.{}'.format(svc_id)]) + + def test_add_multiple_indiv_flags(self): + flags_update = {'noup': None, 'nodown': None, 'noin': True, 'noout': True} + svc_id = 0 + + resp = self._put_flags(flags_update, [svc_id]) + self._check_indiv_flags_resp(resp, [svc_id], ['noout', 'noin'], [], ['noup', 'nodown']) + self._check_indiv_flags_osd([svc_id], ['noout', 'noin'], ['noup', 'nodown']) + + self._ceph_cmd(['osd', 'unset-group', 'noout,noin', 'osd.{}'.format(svc_id)]) + + def test_add_multiple_indiv_flags_multiple_osds(self): + flags_update = {'noup': None, 'nodown': None, 'noin': True, 'noout': True} + svc_id = [0, 1, 2] + + resp = self._put_flags(flags_update, svc_id) + self._check_indiv_flags_resp(resp, svc_id, ['noout', 'noin'], [], ['noup', 'nodown']) + self._check_indiv_flags_osd([svc_id], ['noout', 'noin'], ['noup', 'nodown']) + + self._ceph_cmd(['osd', 'unset-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2']) + + def test_remove_indiv_flag(self): + flags_update = {'noup': None, 'nodown': None, 'noin': None, 'noout': False} + svc_id = 0 + self._ceph_cmd(['osd', 'set-group', 'noout', 'osd.{}'.format(svc_id)]) + + resp = self._put_flags(flags_update, [svc_id]) + self._check_indiv_flags_resp(resp, [svc_id], [], ['noout'], ['noup', 'nodown', 'noin']) + self._check_indiv_flags_osd([svc_id], [], ['noup', 'nodown', 'noin', 'noout']) + + def test_remove_multiple_indiv_flags(self): + flags_update = {'noup': None, 'nodown': None, 'noin': False, 'noout': False} + svc_id = 0 + self._ceph_cmd(['osd', 'set-group', 'noout,noin', 'osd.{}'.format(svc_id)]) + + resp = self._put_flags(flags_update, [svc_id]) + self._check_indiv_flags_resp(resp, [svc_id], [], ['noout', 'noin'], ['noup', 'nodown']) + self._check_indiv_flags_osd([svc_id], [], ['noout', 'noin', 'noup', 'nodown']) + + def test_remove_multiple_indiv_flags_multiple_osds(self): + flags_update = {'noup': None, 'nodown': None, 'noin': False, 'noout': False} + svc_id = [0, 1, 2] + self._ceph_cmd(['osd', 'unset-group', 'noout,noin', 'osd.0', 'osd.1', 'osd.2']) + + resp = self._put_flags(flags_update, svc_id) + self._check_indiv_flags_resp(resp, svc_id, [], ['noout', 'noin'], ['noup', 'nodown']) + self._check_indiv_flags_osd([svc_id], [], ['noout', 'noin', 'noup', 'nodown']) + + def _check_indiv_flags_resp(self, resp, ids, added, removed, ignored): + self.assertStatus(200) + self.assertCountEqual(resp['ids'], ids) + self.assertCountEqual(resp['added'], added) + self.assertCountEqual(resp['removed'], removed) + + for flag in ignored: + self.assertNotIn(flag, resp['added']) + self.assertNotIn(flag, resp['removed']) + + def _check_indiv_flags_osd(self, ids, activated_flags, deactivated_flags): + osds = json.loads(self._ceph_cmd(['osd', 'dump', '--format=json']))['osds'] + for osd in osds: + if osd['osd'] in ids: + for flag in activated_flags: + self.assertIn(flag, osd['state']) + for flag in deactivated_flags: + self.assertNotIn(flag, osd['state']) diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_requests.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_requests.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_requests.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_requests.py 2021-04-19 13:47:30.000000000 +0000 @@ -20,4 +20,8 @@ self.assertNotIn('Content-Encoding', self._resp.headers) self.assertHeaders({ 'Content-Type': 'application/json', + 'server': 'Ceph-Dashboard', + 'Content-Security-Policy': "frame-ancestors 'self';", + 'X-Content-Type-Options': 'nosniff', + 'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload' }) diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_rgw.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_rgw.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_rgw.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_rgw.py 2021-04-19 13:47:30.000000000 +0000 @@ -32,8 +32,8 @@ ]) # Update the dashboard configuration. cls._ceph_cmd(['dashboard', 'set-rgw-api-user-id', 'admin']) - cls._ceph_cmd(['dashboard', 'set-rgw-api-secret-key', 'admin']) - cls._ceph_cmd(['dashboard', 'set-rgw-api-access-key', 'admin']) + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-secret-key'], 'admin') + cls._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-access-key'], 'admin') # Create a test user? if cls.create_test_user: cls._radosgw_admin_cmd([ @@ -80,13 +80,13 @@ self._ceph_cmd(['mgr', 'module', 'enable', 'dashboard', '--force']) # Set the default credentials. self._ceph_cmd(['dashboard', 'set-rgw-api-user-id', '']) - self._ceph_cmd(['dashboard', 'set-rgw-api-secret-key', 'admin']) - self._ceph_cmd(['dashboard', 'set-rgw-api-access-key', 'admin']) + self._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-secret-key'], 'admin') + self._ceph_cmd_with_secret(['dashboard', 'set-rgw-api-access-key'], 'admin') super(RgwApiCredentialsTest, self).setUp() def test_no_access_secret_key(self): - self._ceph_cmd(['dashboard', 'set-rgw-api-secret-key', '']) - self._ceph_cmd(['dashboard', 'set-rgw-api-access-key', '']) + self._ceph_cmd(['dashboard', 'reset-rgw-api-secret-key']) + self._ceph_cmd(['dashboard', 'reset-rgw-api-access-key']) resp = self._get('/api/rgw/user') self.assertStatus(500) self.assertIn('detail', resp) diff -Nru ceph-15.2.8/qa/tasks/mgr/dashboard/test_user.py ceph-15.2.11/qa/tasks/mgr/dashboard/test_user.py --- ceph-15.2.8/qa/tasks/mgr/dashboard/test_user.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/dashboard/test_user.py 2021-04-19 13:47:30.000000000 +0000 @@ -286,39 +286,50 @@ self.assertError(code='invalid_credentials', component='auth') def test_create_user_password_cli(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-create', - 'test1', 'mypassword10#']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-create', + 'test1'], + 'mypassword10#', + return_exit_code=True) self.assertEqual(exitcode, 0) self.delete_user('test1') @DashboardTestCase.RunAs('test2', 'foo_bar_10#', force_password=False, login=False) def test_change_user_password_cli(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-set-password', - 'test2', 'foo_new-password01#']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-set-password', + 'test2'], + 'foo_new-password01#', + return_exit_code=True) self.assertEqual(exitcode, 0) def test_create_user_password_force_cli(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-create', - '--force-password', 'test11', - 'bar']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-create', + '--force-password', 'test11'], + 'bar', + return_exit_code=True) self.assertEqual(exitcode, 0) self.delete_user('test11') @DashboardTestCase.RunAs('test22', 'foo_bar_10#', force_password=False, login=False) def test_change_user_password_force_cli(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-set-password', - '--force-password', 'test22', - 'bar']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-set-password', + '--force-password', 'test22'], + 'bar', + return_exit_code=True) self.assertEqual(exitcode, 0) def test_create_user_password_cli_fail(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-create', 'test3', 'foo']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-create', + 'test3'], + 'foo', + return_exit_code=True) self.assertNotEqual(exitcode, 0) @DashboardTestCase.RunAs('test4', 'x1z_tst+_10#', force_password=False, login=False) def test_change_user_password_cli_fail(self): - exitcode = self._ceph_cmd_result(['dashboard', 'ac-user-set-password', - 'test4', 'bar']) + exitcode = self._ceph_cmd_with_secret(['dashboard', 'ac-user-set-password', + 'test4'], + 'bar', + return_exit_code=True) self.assertNotEqual(exitcode, 0) def test_create_user_with_pwd_expiration_date(self): diff -Nru ceph-15.2.8/qa/tasks/mgr/mgr_test_case.py ceph-15.2.11/qa/tasks/mgr/mgr_test_case.py --- ceph-15.2.8/qa/tasks/mgr/mgr_test_case.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/mgr_test_case.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,8 @@ import json import logging +from unittest import SkipTest + from teuthology import misc from tasks.ceph_test_case import CephTestCase @@ -99,7 +101,7 @@ assert cls.mgr_cluster is not None if len(cls.mgr_cluster.mgr_ids) < cls.MGRS_REQUIRED: - cls.skipTest( + raise SkipTest( "Only have {0} manager daemons, {1} are required".format( len(cls.mgr_cluster.mgr_ids), cls.MGRS_REQUIRED)) @@ -115,7 +117,7 @@ if is_disabled(): return - log.info("Unloading Mgr module %s ...", module_name) + log.debug("Unloading Mgr module %s ...", module_name) cls.mgr_cluster.mon_manager.raw_cluster_cmd('mgr', 'module', 'disable', module_name) cls.wait_until_true(is_disabled, timeout=30) @@ -141,7 +143,7 @@ if module_name in always_on: return - log.info("Loading Mgr module %s ...", module_name) + log.debug("Loading Mgr module %s ...", module_name) initial_gid = initial_mgr_map['active_gid'] cls.mgr_cluster.mon_manager.raw_cluster_cmd( "mgr", "module", "enable", module_name, "--force") @@ -151,7 +153,7 @@ mgr_map = cls.mgr_cluster.get_mgr_map() done = mgr_map['active_gid'] != initial_gid and mgr_map['available'] if done: - log.info("Restarted after module load (new active {0}/{1})".format( + log.debug("Restarted after module load (new active {0}/{1})".format( mgr_map['active_name'], mgr_map['active_gid'])) return done cls.wait_until_true(has_restarted, timeout=30) @@ -172,7 +174,7 @@ uri = mgr_map['x']['services'][service_name] - log.info("Found {0} at {1} (daemon {2}/{3})".format( + log.debug("Found {0} at {1} (daemon {2}/{3})".format( service_name, uri, mgr_map['x']['active_name'], mgr_map['x']['active_gid'])) @@ -196,7 +198,7 @@ cls.mgr_cluster.mgr_fail(mgr_id) for mgr_id in cls.mgr_cluster.mgr_ids: - log.info("Using port {0} for {1} on mgr.{2}".format( + log.debug("Using port {0} for {1} on mgr.{2}".format( assign_port, module_name, mgr_id )) cls.mgr_cluster.set_module_localized_conf(module_name, mgr_id, @@ -212,7 +214,7 @@ mgr_map = cls.mgr_cluster.get_mgr_map() done = mgr_map['available'] if done: - log.info("Available after assign ports (new active {0}/{1})".format( + log.debug("Available after assign ports (new active {0}/{1})".format( mgr_map['active_name'], mgr_map['active_gid'])) return done cls.wait_until_true(is_available, timeout=30) diff -Nru ceph-15.2.8/qa/tasks/mgr/test_dashboard.py ceph-15.2.11/qa/tasks/mgr/test_dashboard.py --- ceph-15.2.8/qa/tasks/mgr/test_dashboard.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/test_dashboard.py 2021-04-19 13:47:30.000000000 +0000 @@ -28,6 +28,16 @@ "mgr/dashboard/standby_error_status_code", "500") + def wait_until_webserver_available(self, url): + def _check_connection(): + try: + requests.get(url, allow_redirects=False, verify=False) + return True + except requests.ConnectionError: + pass + return False + self.wait_until_true(_check_connection, timeout=30) + def test_standby(self): original_active_id = self.mgr_cluster.get_active_id() original_uri = self._get_uri("dashboard") @@ -48,6 +58,9 @@ self.assertNotEqual(original_uri, failed_over_uri) + # Wait until web server of the standby node is settled. + self.wait_until_webserver_available(original_uri) + # The original active daemon should have come back up as a standby # and be doing redirects to the new active daemon. r = requests.get(original_uri, allow_redirects=False, verify=False) @@ -55,7 +68,7 @@ self.assertEqual(r.headers['Location'], failed_over_uri) # Ensure that every URL redirects to the active daemon. - r = requests.get("{}/runtime.js".format(original_uri), + r = requests.get("{}/runtime.js".format(original_uri.strip('/')), allow_redirects=False, verify=False) self.assertEqual(r.status_code, 303) @@ -85,6 +98,9 @@ self.assertNotEqual(original_uri, failed_over_uri) + # Wait until web server of the standby node is settled. + self.wait_until_webserver_available(original_uri) + # Redirection should be disabled now, instead a 500 must be returned. r = requests.get(original_uri, allow_redirects=False, verify=False) self.assertEqual(r.status_code, 500) diff -Nru ceph-15.2.8/qa/tasks/mgr/test_progress.py ceph-15.2.11/qa/tasks/mgr/test_progress.py --- ceph-15.2.8/qa/tasks/mgr/test_progress.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/test_progress.py 2021-04-19 13:47:30.000000000 +0000 @@ -44,6 +44,88 @@ log.info(json.dumps(p, indent=2)) return p['events'] + def _completed_events(self): + """ + This function returns all events that are completed + """ + p = self._get_progress() + log.info(json.dumps(p, indent=2)) + return p['completed'] + + def is_osd_marked_out(self, ev): + return ev['message'].endswith('marked out') + + def is_osd_marked_in(self, ev): + return ev['message'].endswith('marked in') + + def _get_osd_in_out_events(self, marked='both'): + """ + Return the event that deals with OSDs being + marked in, out or both + """ + + marked_in_events = [] + marked_out_events = [] + + events_in_progress = self._events_in_progress() + for ev in events_in_progress: + if self.is_osd_marked_out(ev): + marked_out_events.append(ev) + elif self.is_osd_marked_in(ev): + marked_in_events.append(ev) + + if marked == 'both': + return [marked_in_events] + [marked_out_events] + elif marked == 'in': + return marked_in_events + else: + return marked_out_events + + def _osd_in_out_events_count(self, marked='both'): + """ + Return the event that deals with OSDs being + marked in, out or both + """ + + marked_in_events = [] + marked_out_events = [] + + events_in_progress = self._events_in_progress() + for ev in events_in_progress: + if self.is_osd_marked_out(ev): + marked_out_events.append(ev) + elif self.is_osd_marked_in(ev): + marked_in_events.append(ev) + + if marked == 'both': + return [marked_in_events] + [marked_out_events] + elif marked == 'in': + return marked_in_events + else: + return marked_out_events + + def _osd_in_out_events_count(self, marked='both'): + """ + Count the number of on going recovery events that deals with + OSDs being marked in, out or both. + """ + events_in_progress = self._events_in_progress() + marked_in_count = 0 + marked_out_count = 0 + + for ev in events_in_progress: + if self.is_osd_marked_out(ev): + marked_out_count += 1 + elif self.is_osd_marked_in(ev): + marked_in_count += 1 + + if marked == 'both': + return marked_in_count + marked_out_count + elif marked == 'in': + return marked_in_count + else: + return marked_out_count + def _setup_pool(self, size=None): self.mgr_cluster.mon_manager.create_pool(self.POOL) if size is not None: @@ -105,9 +187,10 @@ 'osd', 'out', str(osd_id)) # Wait for a progress event to pop up - self.wait_until_equal(lambda: len(self._all_events()), 1, - timeout=self.EVENT_CREATION_PERIOD) - ev = self._all_events()[0] + self.wait_until_equal(lambda: self._osd_in_out_events_count('out'), 1, + timeout=self.EVENT_CREATION_PERIOD*2, + period=1) + ev = self._get_osd_in_out_events('out')[0] log.info(json.dumps(ev, indent=1)) self.assertIn("Rebalancing after osd.0 marked out", ev['message']) @@ -125,8 +208,9 @@ try: # Wait for progress event marked in to pop up - self.wait_until_equal(lambda: len(self._events_in_progress()), 1, - timeout=self.EVENT_CREATION_PERIOD) + self.wait_until_equal(lambda: self._osd_in_out_events_count('in'), 1, + timeout=self.EVENT_CREATION_PERIOD*2, + period=1) except RuntimeError as ex: if not "Timed out after" in str(ex): raise ex @@ -134,12 +218,17 @@ log.info("There was no PGs affected by osd being marked in") return None - new_event = self._events_in_progress()[0] - log.info(json.dumps(new_event, indent=1)) - self.assertIn("Rebalancing after osd.0 marked in", new_event['message']) - + new_event = self._get_osd_in_out_events('in')[0] return new_event + def _no_events_anywhere(self): + """ + Whether there are any live or completed events + """ + p = self._get_progress() + total_events = len(p['events']) + len(p['completed']) + return total_events == 0 + def _is_quiet(self): """ Whether any progress events are live. @@ -261,4 +350,53 @@ # Check that no event is created time.sleep(self.EVENT_CREATION_PERIOD) - self.assertEqual(len(self._all_events()), osd_count - pool_size) + self.assertEqual( + self._osd_in_out_completed_events_count('out'), + osd_count - pool_size) + + def test_turn_off_module(self): + """ + When the the module is turned off, there should not + be any on going events or completed events. + Also module should not accept any kind of Remote Event + coming in from other module, however, once it is turned + back, on creating an event should be working as it is. + """ + + pool_size = 3 + self._setup_pool(size=pool_size) + self._write_some_data(self.WRITE_PERIOD) + + self.mgr_cluster.mon_manager.raw_cluster_cmd("progress", "off") + + self.mgr_cluster.mon_manager.raw_cluster_cmd( + 'osd', 'out', '0') + + time.sleep(self.EVENT_CREATION_PERIOD) + + self.mgr_cluster.mon_manager.raw_cluster_cmd( + 'osd', 'in', '0') + + time.sleep(self.EVENT_CREATION_PERIOD) + + self.assertTrue(self._no_events_anywhere()) + + self.mgr_cluster.mon_manager.raw_cluster_cmd("progress", "on") + + self._write_some_data(self.WRITE_PERIOD) + + self.mgr_cluster.mon_manager.raw_cluster_cmd( + 'osd', 'out', '0') + + # Wait for a progress event to pop up + self.wait_until_equal(lambda: self._osd_in_out_events_count('out'), 1, + timeout=self.EVENT_CREATION_PERIOD*2, + period=1) + + ev1 = self._get_osd_in_out_events('out')[0] + + log.info(json.dumps(ev1, indent=1)) + + self.wait_until_true(lambda: self._is_complete(ev1['id']), + timeout=self.RECOVERY_PERIOD) + self.assertTrue(self._is_quiet()) diff -Nru ceph-15.2.8/qa/tasks/mgr/test_prometheus.py ceph-15.2.11/qa/tasks/mgr/test_prometheus.py --- ceph-15.2.8/qa/tasks/mgr/test_prometheus.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/mgr/test_prometheus.py 2021-04-19 13:47:30.000000000 +0000 @@ -49,6 +49,7 @@ r = requests.get(original_uri + "metrics", allow_redirects=False) self.assertEqual(r.status_code, 200) self.assertEqual(r.headers["content-type"], "text/plain;charset=utf-8") + self.assertEqual(r.headers["server"], "Ceph-Prometheus") def test_urls(self): self._assign_ports("prometheus", "server_port") diff -Nru ceph-15.2.8/qa/tasks/osd_failsafe_enospc.py ceph-15.2.11/qa/tasks/osd_failsafe_enospc.py --- ceph-15.2.8/qa/tasks/osd_failsafe_enospc.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/osd_failsafe_enospc.py 2021-04-19 13:47:30.000000000 +0000 @@ -17,13 +17,13 @@ Test handling of osd_failsafe_nearfull_ratio and osd_failsafe_full_ratio configuration settings - In order for test to pass must use log-whitelist as follows + In order for test to pass must use log-ignorelist as follows tasks: - chef: - install: - ceph: - log-whitelist: ['OSD near full', 'OSD full dropping all updates'] + log-ignorelist: ['OSD near full', 'OSD full dropping all updates'] - osd_failsafe_enospc: """ diff -Nru ceph-15.2.8/qa/tasks/radosgw_admin_rest.py ceph-15.2.11/qa/tasks/radosgw_admin_rest.py --- ceph-15.2.8/qa/tasks/radosgw_admin_rest.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/radosgw_admin_rest.py 2021-04-19 13:47:30.000000000 +0000 @@ -464,6 +464,11 @@ assert out['usage']['rgw.main']['num_objects'] == 1 assert out['usage']['rgw.main']['size_kb'] > 0 + # TESTCASE 'bucket-stats6', 'bucket', 'stats', 'non-existent bucket', 'fails, 'bucket not found error' + (ret, out) = rgwadmin_rest(admin_conn, ['bucket', 'info'], {'bucket' : 'doesnotexist'}) + assert ret == 404 + assert out['Code'] == 'NoSuchBucket' + # reclaim it key.delete() diff -Nru ceph-15.2.8/qa/tasks/repair_test.py ceph-15.2.11/qa/tasks/repair_test.py --- ceph-15.2.8/qa/tasks/repair_test.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/repair_test.py 2021-04-19 13:47:30.000000000 +0000 @@ -251,7 +251,7 @@ The config should be as follows: - Must include the log-whitelist below + Must include the log-ignorelist below Must enable filestore_debug_inject_read_err config example: @@ -260,7 +260,7 @@ - chef: - install: - ceph: - log-whitelist: + log-ignorelist: - 'candidate had a stat error' - 'candidate had a read error' - 'deep-scrub 0 missing, 1 inconsistent objects' diff -Nru ceph-15.2.8/qa/tasks/scrub_test.py ceph-15.2.11/qa/tasks/scrub_test.py --- ceph-15.2.8/qa/tasks/scrub_test.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/scrub_test.py 2021-04-19 13:47:30.000000000 +0000 @@ -324,7 +324,7 @@ - chef: - install: - ceph: - log-whitelist: + log-ignorelist: - '!= data_digest' - '!= omap_digest' - '!= size' diff -Nru ceph-15.2.8/qa/tasks/thrashosds-health.yaml ceph-15.2.11/qa/tasks/thrashosds-health.yaml --- ceph-15.2.8/qa/tasks/thrashosds-health.yaml 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/thrashosds-health.yaml 2021-04-19 13:47:30.000000000 +0000 @@ -3,7 +3,7 @@ conf: osd: osd max markdown count: 1000 - log-whitelist: + log-ignorelist: - overall HEALTH_ - \(OSDMAP_FLAGS\) - \(OSD_ diff -Nru ceph-15.2.8/qa/tasks/vstart_runner.py ceph-15.2.11/qa/tasks/vstart_runner.py --- ceph-15.2.8/qa/tasks/vstart_runner.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/tasks/vstart_runner.py 2021-04-19 13:47:30.000000000 +0000 @@ -53,6 +53,11 @@ from teuthology.config import config as teuth_config import six import logging +try: + import urllib3 + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) +except: + pass def init_log(): global log @@ -210,13 +215,13 @@ return False def kill(self): - log.info("kill ") + log.debug("kill ") if self.subproc.pid and not self.finished: - log.info("kill: killing pid {0} ({1})".format( + log.debug("kill: killing pid {0} ({1})".format( self.subproc.pid, self.args)) safe_kill(self.subproc.pid) else: - log.info("kill: already terminated ({0})".format(self.args)) + log.debug("kill: already terminated ({0})".format(self.args)) @property def stdin(self): @@ -360,7 +365,7 @@ args[0] )) - log.info("Running {0}".format(args)) + log.debug("Running {0}".format(args)) if shell: subproc = subprocess.Popen(quote(args), @@ -454,13 +459,13 @@ for line in lines: if line.find("ceph-{0} -i {1}".format(self.daemon_type, self.daemon_id)) != -1: - log.info("Found ps line for daemon: {0}".format(line)) + log.debug("Found ps line for daemon: {0}".format(line)) return int(line.split()[0]) if opt_log_ps_output: - log.info("No match for {0} {1}: {2}".format( + log.debug("No match for {0} {1}: {2}".format( self.daemon_type, self.daemon_id, ps_txt)) else: - log.info("No match for {0} {1}".format(self.daemon_type, + log.debug("No match for {0} {1}".format(self.daemon_type, self.daemon_id)) return None @@ -478,14 +483,14 @@ return pid = self._get_pid() - log.info("Killing PID {0} for {1}.{2}".format(pid, self.daemon_type, self.daemon_id)) + log.debug("Killing PID {0} for {1}.{2}".format(pid, self.daemon_type, self.daemon_id)) os.kill(pid, signal.SIGTERM) waited = 0 while pid is not None: new_pid = self._get_pid() if new_pid is not None and new_pid != pid: - log.info("Killing new PID {0}".format(new_pid)) + log.debug("Killing new PID {0}".format(new_pid)) pid = new_pid os.kill(pid, signal.SIGTERM) @@ -515,7 +520,7 @@ os.kill(self._get_pid(), sig) if not silent: - log.info("Sent signal {0} to {1}.{2}".format(sig, self.daemon_type, self.daemon_id)) + log.debug("Sent signal {0} to {1}.{2}".format(sig, self.daemon_type, self.daemon_id)) def safe_kill(pid): @@ -617,9 +622,9 @@ # Previous mount existed, reuse the old name name = self.fs.name self.fs = LocalFilesystem(self.ctx, name=name) - log.info('Wait for MDS to reach steady state...') + log.debug('Wait for MDS to reach steady state...') self.fs.wait_for_daemons() - log.info('Ready to start {}...'.format(type(self).__name__)) + log.debug('Ready to start {}...'.format(type(self).__name__)) @property def _prefix(self): @@ -778,9 +783,9 @@ # Previous mount existed, reuse the old name name = self.fs.name self.fs = LocalFilesystem(self.ctx, name=name) - log.info('Wait for MDS to reach steady state...') + log.debug('Wait for MDS to reach steady state...') self.fs.wait_for_daemons() - log.info('Ready to start {}...'.format(type(self).__name__)) + log.debug('Ready to start {}...'.format(type(self).__name__)) @property def _prefix(self): @@ -836,7 +841,7 @@ # Before starting ceph-fuse process, note the contents of # /sys/fs/fuse/connections pre_mount_conns = list_connections() - log.info("Pre-mount connections: {0}".format(pre_mount_conns)) + log.debug("Pre-mount connections: {0}".format(pre_mount_conns)) prefix = [os.path.join(BIN_PREFIX, "ceph-fuse")] if os.getuid() != 0: @@ -858,7 +863,7 @@ self.mountpoint ], wait=False) - log.info("Mounting client.{0} with pid {1}".format(self.client_id, self.fuse_daemon.subproc.pid)) + log.debug("Mounting client.{0} with pid {1}".format(self.client_id, self.fuse_daemon.subproc.pid)) # Wait for the connection reference to appear in /sys waited = 0 @@ -876,7 +881,7 @@ )) post_mount_conns = list_connections() - log.info("Post-mount connections: {0}".format(post_mount_conns)) + log.debug("Post-mount connections: {0}".format(post_mount_conns)) # Record our fuse connection number so that we can use it when # forcing an unmount @@ -912,7 +917,7 @@ # certain teuthology tests want to run tasks in parallel self.lock = threading.RLock() - self.log = lambda x: log.info(x) + self.log = lambda x: log.debug(x) # Don't bother constructing a map of pools: it should be empty # at test cluster start, and in any case it would be out of date @@ -1054,7 +1059,7 @@ existing_str += "\n[{0}]\n".format(subsys) for key, val in kvs.items(): # Comment out existing instance if it exists - log.info("Searching for existing instance {0}/{1}".format( + log.debug("Searching for existing instance {0}/{1}".format( key, subsys )) existing_section = re.search("^\[{0}\]$([\n]|[^\[])+".format( @@ -1066,7 +1071,7 @@ existing_val = re.search("^\s*[^#]({0}) =".format(key), section_str, re.MULTILINE) if existing_val: start = existing_section.start() + existing_val.start(1) - log.info("Found string to replace at {0}".format( + log.debug("Found string to replace at {0}".format( start )) existing_str = existing_str[0:start] + "#" + existing_str[start:] @@ -1133,7 +1138,7 @@ self.mds_ids = list(self.mds_ids) - log.info("Discovered MDS IDs: {0}".format(self.mds_ids)) + log.debug("Discovered MDS IDs: {0}".format(self.mds_ids)) self.mon_manager = LocalCephManager() @@ -1190,7 +1195,7 @@ def enumerate_methods(s): - log.info("e: {0}".format(s)) + log.debug("e: {0}".format(s)) for t in s._tests: if isinstance(t, suite.BaseTestSuite): for sub in enumerate_methods(t): @@ -1201,15 +1206,15 @@ def load_tests(modules, loader): if modules: - log.info("Executing modules: {0}".format(modules)) + log.debug("Executing modules: {0}".format(modules)) module_suites = [] for mod_name in modules: # Test names like cephfs.test_auto_repair module_suites.append(loader.loadTestsFromName(mod_name)) - log.info("Loaded: {0}".format(list(module_suites))) + log.debug("Loaded: {0}".format(list(module_suites))) return suite.TestSuite(module_suites) else: - log.info("Executing all cephfs tests") + log.debug("Executing all cephfs tests") return loader.discover( os.path.join(os.path.dirname(os.path.abspath(__file__)), "cephfs") ) @@ -1268,7 +1273,10 @@ self.daemons.daemons[prefixed_type][svc_id] = LocalDaemon(svc_type, svc_id) def __del__(self): - shutil.rmtree(self.teuthology_config['test_path']) + test_path = self.teuthology_config['test_path'] + # opt_create_cluster_only does not create the test path + if test_path: + shutil.rmtree(test_path) def teardown_cluster(): log.info('\ntearing down the cluster...') @@ -1289,7 +1297,7 @@ with open(logpath, 'w') as logfile: logfile.write('') init_log() - log.info('logging in a fresh file now...') + log.debug('logging in a fresh file now...') def exec_test(): # Parse arguments @@ -1506,7 +1514,7 @@ if not is_named: victims.append((case, method)) - log.info("Disabling {0} tests because of is_for_teuthology or needs_trimming".format(len(victims))) + log.debug("Disabling {0} tests because of is_for_teuthology or needs_trimming".format(len(victims))) for s, method in victims: s._tests.remove(method) diff -Nru ceph-15.2.8/qa/valgrind.supp ceph-15.2.11/qa/valgrind.supp --- ceph-15.2.8/qa/valgrind.supp 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/valgrind.supp 2021-04-19 13:47:30.000000000 +0000 @@ -1,3 +1,11 @@ + +{ + + Memcheck:Free + fun:free + ... +} + { older boost mersenne twister uses uninitialized memory for randomness Memcheck:Cond diff -Nru ceph-15.2.8/qa/workunits/fs/misc/subvolume.sh ceph-15.2.11/qa/workunits/fs/misc/subvolume.sh --- ceph-15.2.8/qa/workunits/fs/misc/subvolume.sh 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/qa/workunits/fs/misc/subvolume.sh 2021-04-19 13:47:30.000000000 +0000 @@ -0,0 +1,63 @@ +#!/bin/sh -x + +expect_failure() { + if "$@"; then return 1; else return 0; fi +} + +set -e + +mkdir group +mkdir group/subvol1 + +setfattr -n ceph.dir.subvolume -v 1 group/subvol1 + +# rename subvolume +mv group/subvol1 group/subvol2 + +# move file out of the subvolume +touch group/subvol2/file1 +expect_failure python3 -c "import os; os.rename('group/subvol2/file1', 'group/file1')" +# move file into the subvolume +touch group/file2 +expect_failure python3 -c "import os; os.rename('group/file2', 'group/subvol2/file2')" + +# create hardlink within subvolume +ln group/subvol2/file1 group/subvol2/file1_ + +# create hardlink out of subvolume +expect_failure ln group/subvol2/file1 group/file1_ +expect_failure ln group/file2 group/subvol1/file2_ + +# create snapshot at subvolume root +mkdir group/subvol2/.snap/s1 + +# create snapshot at descendent dir of subvolume +mkdir group/subvol2/dir +expect_failure mkdir group/subvol2/dir/.snap/s2 + +mkdir group/subvol3 +setfattr -n ceph.dir.subvolume -v 1 group/subvol3 + +# move file across subvolumes +expect_failure python3 -c "import os; os.rename('group/subvol2/file1', 'group/subvol3/file1')" + +# create hardlink across subvolumes +expect_failure ln group/subvol2/file1 group/subvol3/file1 + +# create subvolume inside existing subvolume +expect_failure setfattr -n ceph.dir.subvolume -v 1 group/subvol2/dir + +# clear subvolume flag +setfattr -n ceph.dir.subvolume -v 0 group/subvol2 +mkdir group/subvol2/dir/.snap/s2 + +# parent subvolume override child subvolume +setfattr -n ceph.dir.subvolume -v 1 group/subvol2/dir +setfattr -n ceph.dir.subvolume -v 1 group/subvol2 +expect_failure mkdir group/subvol2/dir/.snap/s3 + +rmdir group/subvol2/.snap/s1 +rmdir group/subvol2/dir/.snap/s2 +rm -rf group + +echo OK diff -Nru ceph-15.2.8/qa/workunits/rbd/krbd_stable_pages_required.sh ceph-15.2.11/qa/workunits/rbd/krbd_stable_pages_required.sh --- ceph-15.2.8/qa/workunits/rbd/krbd_stable_pages_required.sh 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/qa/workunits/rbd/krbd_stable_pages_required.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -function assert_dm() { - local name=$1 - local val=$2 - - local devno - devno=$(sudo dmsetup info -c --noheadings -o Major,Minor $name) - grep -q $val /sys/dev/block/$devno/bdi/stable_pages_required -} - -function dmsetup_reload() { - local name=$1 - - local table - table=$(entity_name.get_type() && !this->global_id && + global_id_status == global_id_status_t::NONE); + + ldout(cct, 10) << __func__ << " entity_name=" << entity_name + << " global_id=" << global_id << " is_new_global_id=" + << is_new_global_id << dendl; + this->entity_name = entity_name; + this->global_id = global_id; + + return do_start_session(is_new_global_id, result, caps); +} + AuthServiceHandler *get_auth_service_handler(int type, CephContext *cct, KeyServer *ks) { switch (type) { diff -Nru ceph-15.2.8/src/auth/AuthServiceHandler.h ceph-15.2.11/src/auth/AuthServiceHandler.h --- ceph-15.2.8/src/auth/AuthServiceHandler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/AuthServiceHandler.h 2021-04-19 13:47:30.000000000 +0000 @@ -25,32 +25,57 @@ class CryptoKey; struct AuthCapsInfo; +enum class global_id_status_t { + NONE, + // fresh client (global_id == 0); waiting for CephXAuthenticate + NEW_PENDING, + // connected client; new enough to correctly reclaim global_id + NEW_OK, + // connected client; unknown whether it can reclaim global_id correctly + NEW_NOT_EXPOSED, + // reconnecting client (global_id != 0); waiting for CephXAuthenticate + RECLAIM_PENDING, + // reconnected client; correctly reclaimed global_id + RECLAIM_OK, + // reconnected client; did not properly prove prior global_id ownership + RECLAIM_INSECURE +}; + +std::ostream& operator<<(std::ostream& os, + global_id_status_t global_id_status); + struct AuthServiceHandler { protected: CephContext *cct; -public: EntityName entity_name; - uint64_t global_id; + uint64_t global_id = 0; + global_id_status_t global_id_status = global_id_status_t::NONE; - explicit AuthServiceHandler(CephContext *cct_) : cct(cct_), global_id(0) {} +public: + explicit AuthServiceHandler(CephContext *cct_) : cct(cct_) {} virtual ~AuthServiceHandler() { } - virtual int start_session(const EntityName& name, - size_t connection_secret_required_length, - ceph::buffer::list *result, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) = 0; + int start_session(const EntityName& entity_name, + uint64_t global_id, + bool is_new_global_id, + ceph::buffer::list *result, + AuthCapsInfo *caps); virtual int handle_request(ceph::buffer::list::const_iterator& indata, size_t connection_secret_required_length, ceph::buffer::list *result, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *session_key, std::string *connection_secret) = 0; - EntityName& get_entity_name() { return entity_name; } + const EntityName& get_entity_name() { return entity_name; } + uint64_t get_global_id() { return global_id; } + global_id_status_t get_global_id_status() { return global_id_status; } + +private: + virtual int do_start_session(bool is_new_global_id, + ceph::buffer::list *result, + AuthCapsInfo *caps) = 0; }; extern AuthServiceHandler *get_auth_service_handler(int type, CephContext *cct, KeyServer *ks); diff -Nru ceph-15.2.8/src/auth/cephx/CephxClientHandler.h ceph-15.2.11/src/auth/cephx/CephxClientHandler.h --- ceph-15.2.8/src/auth/cephx/CephxClientHandler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxClientHandler.h 2021-04-19 13:47:30.000000000 +0000 @@ -48,6 +48,10 @@ reset(); } + CephxClientHandler* clone() const override { + return new CephxClientHandler(*this); + } + void reset() override; void prepare_build_request() override; int build_request(bufferlist& bl) const override; diff -Nru ceph-15.2.8/src/auth/cephx/CephxKeyServer.cc ceph-15.2.11/src/auth/cephx/CephxKeyServer.cc --- ceph-15.2.8/src/auth/cephx/CephxKeyServer.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxKeyServer.cc 2021-04-19 13:47:30.000000000 +0000 @@ -22,7 +22,8 @@ #define dout_prefix *_dout << "cephx keyserverdata: " bool KeyServerData::get_service_secret(CephContext *cct, uint32_t service_id, - ExpiringCryptoKey& secret, uint64_t& secret_id) const + CryptoKey& secret, uint64_t& secret_id, + double& ttl) const { map::const_iterator iter = rotating_secrets.find(service_id); @@ -39,25 +40,25 @@ if (secrets.secrets.size() > 1) ++riter; - if (riter->second.expiration < ceph_clock_now()) + utime_t now = ceph_clock_now(); + if (riter->second.expiration < now) ++riter; // "current" key has expired, use "next" key instead secret_id = riter->first; - secret = riter->second; - ldout(cct, 30) << "get_service_secret service " << ceph_entity_type_name(service_id) - << " id " << secret_id << " " << secret << dendl; - return true; -} - -bool KeyServerData::get_service_secret(CephContext *cct, uint32_t service_id, - CryptoKey& secret, uint64_t& secret_id) const -{ - ExpiringCryptoKey e; - - if (!get_service_secret(cct, service_id, e, secret_id)) - return false; + secret = riter->second.key; - secret = e.key; + // ttl may have just been increased by the user + // cap it by expiration of "next" key to prevent handing out a ticket + // with a bogus, possibly way into the future, validity + ttl = service_id == CEPH_ENTITY_TYPE_AUTH ? + cct->_conf->auth_mon_ticket_ttl : cct->_conf->auth_service_ticket_ttl; + ttl = min(ttl, static_cast( + secrets.secrets.rbegin()->second.expiration - now)); + + ldout(cct, 30) << __func__ << " service " + << ceph_entity_type_name(service_id) << " secret_id " + << secret_id << " " << riter->second << " ttl " << ttl + << dendl; return true; } @@ -233,12 +234,12 @@ return data.get_caps(cct, name, type, caps_info); } -bool KeyServer::get_service_secret(uint32_t service_id, - CryptoKey& secret, uint64_t& secret_id) const +bool KeyServer::get_service_secret(uint32_t service_id, CryptoKey& secret, + uint64_t& secret_id, double& ttl) const { std::scoped_lock l{lock}; - return data.get_service_secret(cct, service_id, secret, secret_id); + return data.get_service_secret(cct, service_id, secret, secret_id, ttl); } bool KeyServer::get_service_secret(uint32_t service_id, @@ -412,12 +413,13 @@ int KeyServer::_build_session_auth_info(uint32_t service_id, const AuthTicket& parent_ticket, - CephXSessionAuthInfo& info) + CephXSessionAuthInfo& info, + double ttl) { info.service_id = service_id; info.ticket = parent_ticket; - info.ticket.init_timestamps(ceph_clock_now(), - cct->_conf->auth_service_ticket_ttl); + info.ticket.init_timestamps(ceph_clock_now(), ttl); + info.validity.set_from_double(ttl); generate_secret(info.session_key); @@ -435,25 +437,27 @@ const AuthTicket& parent_ticket, CephXSessionAuthInfo& info) { - if (!get_service_secret(service_id, info.service_secret, info.secret_id)) { + double ttl; + if (!get_service_secret(service_id, info.service_secret, info.secret_id, + ttl)) { return -EACCES; } std::scoped_lock l{lock}; - - return _build_session_auth_info(service_id, parent_ticket, info); + return _build_session_auth_info(service_id, parent_ticket, info, ttl); } int KeyServer::build_session_auth_info(uint32_t service_id, const AuthTicket& parent_ticket, - CephXSessionAuthInfo& info, - CryptoKey& service_secret, - uint64_t secret_id) + const CryptoKey& service_secret, + uint64_t secret_id, + CephXSessionAuthInfo& info) { info.service_secret = service_secret; info.secret_id = secret_id; std::scoped_lock l{lock}; - return _build_session_auth_info(service_id, parent_ticket, info); + return _build_session_auth_info(service_id, parent_ticket, info, + cct->_conf->auth_service_ticket_ttl); } diff -Nru ceph-15.2.8/src/auth/cephx/CephxKeyServer.h ceph-15.2.11/src/auth/cephx/CephxKeyServer.h --- ceph-15.2.8/src/auth/cephx/CephxKeyServer.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxKeyServer.h 2021-04-19 13:47:30.000000000 +0000 @@ -95,9 +95,8 @@ } bool get_service_secret(CephContext *cct, uint32_t service_id, - ExpiringCryptoKey& secret, uint64_t& secret_id) const; - bool get_service_secret(CephContext *cct, uint32_t service_id, - CryptoKey& secret, uint64_t& secret_id) const; + CryptoKey& secret, uint64_t& secret_id, + double& ttl) const; bool get_service_secret(CephContext *cct, uint32_t service_id, uint64_t secret_id, CryptoKey& secret) const; bool get_auth(const EntityName& name, EntityAuth& auth) const; @@ -202,7 +201,8 @@ void _dump_rotating_secrets(); int _build_session_auth_info(uint32_t service_id, const AuthTicket& parent_ticket, - CephXSessionAuthInfo& info); + CephXSessionAuthInfo& info, + double ttl); bool _get_service_caps(const EntityName& name, uint32_t service_id, AuthCapsInfo& caps) const; public: @@ -221,13 +221,13 @@ CephXSessionAuthInfo& info); int build_session_auth_info(uint32_t service_id, const AuthTicket& parent_ticket, - CephXSessionAuthInfo& info, - CryptoKey& service_secret, - uint64_t secret_id); + const CryptoKey& service_secret, + uint64_t secret_id, + CephXSessionAuthInfo& info); /* get current secret for specific service type */ - bool get_service_secret(uint32_t service_id, CryptoKey& service_key, - uint64_t& secret_id) const; + bool get_service_secret(uint32_t service_id, CryptoKey& secret, + uint64_t& secret_id, double& ttl) const; bool get_service_secret(uint32_t service_id, uint64_t secret_id, CryptoKey& secret) const override; diff -Nru ceph-15.2.8/src/auth/cephx/CephxProtocol.cc ceph-15.2.11/src/auth/cephx/CephxProtocol.cc --- ceph-15.2.8/src/auth/cephx/CephxProtocol.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxProtocol.cc 2021-04-19 13:47:30.000000000 +0000 @@ -369,8 +369,10 @@ << " need " << need << dendl; } -bool cephx_decode_ticket(CephContext *cct, KeyStore *keys, uint32_t service_id, - CephXTicketBlob& ticket_blob, CephXServiceTicketInfo& ticket_info) +bool cephx_decode_ticket(CephContext *cct, KeyStore *keys, + uint32_t service_id, + const CephXTicketBlob& ticket_blob, + CephXServiceTicketInfo& ticket_info) { uint64_t secret_id = ticket_blob.secret_id; CryptoKey service_secret; diff -Nru ceph-15.2.8/src/auth/cephx/CephxProtocol.h ceph-15.2.11/src/auth/cephx/CephxProtocol.h --- ceph-15.2.8/src/auth/cephx/CephxProtocol.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxProtocol.h 2021-04-19 13:47:30.000000000 +0000 @@ -123,9 +123,11 @@ CephXTicketBlob old_ticket; uint32_t other_keys = 0; // replaces CephXServiceTicketRequest + bool old_ticket_may_be_omitted; + void encode(bufferlist& bl) const { using ceph::encode; - __u8 struct_v = 2; + __u8 struct_v = 3; encode(struct_v, bl); encode(client_challenge, bl); encode(key, bl); @@ -142,6 +144,13 @@ if (struct_v >= 2) { decode(other_keys, bl); } + + // v2 and v3 encodings are the same, but: + // - some clients that send v1 or v2 don't populate old_ticket + // on reconnects (but do on renewals) + // - any client that sends v3 or later is expected to populate + // old_ticket both on reconnects and renewals + old_ticket_may_be_omitted = struct_v < 3; } }; WRITE_CLASS_ENCODER(CephXAuthenticate) @@ -415,7 +424,8 @@ * Decode an extract ticket */ bool cephx_decode_ticket(CephContext *cct, KeyStore *keys, - uint32_t service_id, CephXTicketBlob& ticket_blob, + uint32_t service_id, + const CephXTicketBlob& ticket_blob, CephXServiceTicketInfo& ticket_info); /* diff -Nru ceph-15.2.8/src/auth/cephx/CephxServiceHandler.cc ceph-15.2.11/src/auth/cephx/CephxServiceHandler.cc --- ceph-15.2.8/src/auth/cephx/CephxServiceHandler.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxServiceHandler.cc 2021-04-19 13:47:30.000000000 +0000 @@ -27,15 +27,13 @@ #undef dout_prefix #define dout_prefix *_dout << "cephx server " << entity_name << ": " -int CephxServiceHandler::start_session( - const EntityName& name, - size_t connection_secret_required_length, +int CephxServiceHandler::do_start_session( + bool is_new_global_id, bufferlist *result_bl, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) + AuthCapsInfo *caps) { - entity_name = name; + global_id_status = is_new_global_id ? global_id_status_t::NEW_PENDING : + global_id_status_t::RECLAIM_PENDING; uint64_t min = 1; // always non-zero uint64_t max = std::numeric_limits::max(); @@ -49,11 +47,90 @@ return 0; } +int CephxServiceHandler::verify_old_ticket( + const CephXAuthenticate& req, + CephXServiceTicketInfo& old_ticket_info, + bool& should_enc_ticket) +{ + ldout(cct, 20) << " checking old_ticket: secret_id=" + << req.old_ticket.secret_id + << " len=" << req.old_ticket.blob.length() + << ", old_ticket_may_be_omitted=" + << req.old_ticket_may_be_omitted << dendl; + ceph_assert(global_id_status != global_id_status_t::NONE); + if (global_id_status == global_id_status_t::NEW_PENDING) { + // old ticket is not needed + if (req.old_ticket.blob.length()) { + ldout(cct, 0) << " superfluous ticket presented" << dendl; + return -EINVAL; + } + if (req.old_ticket_may_be_omitted) { + ldout(cct, 10) << " new global_id " << global_id + << " (unexposed legacy client)" << dendl; + global_id_status = global_id_status_t::NEW_NOT_EXPOSED; + } else { + ldout(cct, 10) << " new global_id " << global_id << dendl; + global_id_status = global_id_status_t::NEW_OK; + } + return 0; + } + + if (!req.old_ticket.blob.length()) { + // old ticket is needed but not presented + if (cct->_conf->auth_allow_insecure_global_id_reclaim && + req.old_ticket_may_be_omitted) { + ldout(cct, 10) << " allowing reclaim of global_id " << global_id + << " with no ticket presented (legacy client, auth_allow_insecure_global_id_reclaim=true)" + << dendl; + global_id_status = global_id_status_t::RECLAIM_INSECURE; + return 0; + } + ldout(cct, 0) << " attempt to reclaim global_id " << global_id + << " without presenting ticket" << dendl; + return -EACCES; + } + + if (!cephx_decode_ticket(cct, key_server, CEPH_ENTITY_TYPE_AUTH, + req.old_ticket, old_ticket_info)) { + if (cct->_conf->auth_allow_insecure_global_id_reclaim && + req.old_ticket_may_be_omitted) { + ldout(cct, 10) << " allowing reclaim of global_id " << global_id + << " using bad ticket (legacy client, auth_allow_insecure_global_id_reclaim=true)" + << dendl; + global_id_status = global_id_status_t::RECLAIM_INSECURE; + return 0; + } + ldout(cct, 0) << " attempt to reclaim global_id " << global_id + << " using bad ticket" << dendl; + return -EACCES; + } + ldout(cct, 20) << " decoded old_ticket: global_id=" + << old_ticket_info.ticket.global_id << dendl; + if (global_id != old_ticket_info.ticket.global_id) { + if (cct->_conf->auth_allow_insecure_global_id_reclaim && + req.old_ticket_may_be_omitted) { + ldout(cct, 10) << " allowing reclaim of global_id " << global_id + << " using mismatching ticket (legacy client, auth_allow_insecure_global_id_reclaim=true)" + << dendl; + global_id_status = global_id_status_t::RECLAIM_INSECURE; + return 0; + } + ldout(cct, 0) << " attempt to reclaim global_id " << global_id + << " using mismatching ticket" << dendl; + return -EACCES; + } + ldout(cct, 10) << " allowing reclaim of global_id " << global_id + << " (valid ticket presented, will encrypt new ticket)" + << dendl; + global_id_status = global_id_status_t::RECLAIM_OK; + should_enc_ticket = true; + return 0; +} + int CephxServiceHandler::handle_request( bufferlist::const_iterator& indata, size_t connection_secret_required_len, bufferlist *result_bl, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *psession_key, std::string *pconnection_secret) @@ -125,23 +202,28 @@ ret = -EACCES; break; } + CephXServiceTicketInfo old_ticket_info; + ret = verify_old_ticket(req, old_ticket_info, should_enc_ticket); + if (ret) { + ldout(cct, 0) << " could not verify old ticket" << dendl; + break; + } - if (cephx_decode_ticket(cct, key_server, CEPH_ENTITY_TYPE_AUTH, - req.old_ticket, old_ticket_info)) { - *global_id = old_ticket_info.ticket.global_id; - ldout(cct, 10) << "decoded old_ticket with global_id=" << *global_id - << dendl; - should_enc_ticket = true; + double ttl; + if (!key_server->get_service_secret(CEPH_ENTITY_TYPE_AUTH, + info.service_secret, info.secret_id, + ttl)) { + ldout(cct, 0) << " could not get service secret for auth subsystem" << dendl; + ret = -EIO; + break; } - ldout(cct,10) << __func__ << " auth ticket global_id " << *global_id - << dendl; - info.ticket.init_timestamps(ceph_clock_now(), - cct->_conf->auth_mon_ticket_ttl); + info.service_id = CEPH_ENTITY_TYPE_AUTH; info.ticket.name = entity_name; - info.ticket.global_id = *global_id; - info.validity += cct->_conf->auth_mon_ticket_ttl; + info.ticket.global_id = global_id; + info.ticket.init_timestamps(ceph_clock_now(), ttl); + info.validity.set_from_double(ttl); key_server->generate_secret(session_key); @@ -149,12 +231,6 @@ if (psession_key) { *psession_key = session_key; } - info.service_id = CEPH_ENTITY_TYPE_AUTH; - if (!key_server->get_service_secret(CEPH_ENTITY_TYPE_AUTH, info.service_secret, info.secret_id)) { - ldout(cct, 0) << " could not get service secret for auth subsystem" << dendl; - ret = -EIO; - break; - } vector info_vec; info_vec.push_back(info); @@ -200,11 +276,14 @@ } } encode(cbl, *result_bl); - // provite all of the other tickets at the same time + // provide requested service tickets at the same time vector info_vec; for (uint32_t service_id = 1; service_id <= req.other_keys; service_id <<= 1) { - if (req.other_keys & service_id) { + // skip CEPH_ENTITY_TYPE_AUTH: auth ticket is already encoded + // (possibly encrypted with the old session key) + if ((req.other_keys & service_id) && + service_id != CEPH_ENTITY_TYPE_AUTH) { ldout(cct, 10) << " adding key for service " << ceph_entity_type_name(service_id) << dendl; CephXSessionAuthInfo svc_info; @@ -212,7 +291,6 @@ service_id, info.ticket, svc_info); - svc_info.validity += cct->_conf->auth_service_ticket_ttl; info_vec.push_back(svc_info); } } @@ -264,7 +342,10 @@ int service_err = 0; for (uint32_t service_id = 1; service_id <= ticket_req.keys; service_id <<= 1) { - if (ticket_req.keys & service_id) { + // skip CEPH_ENTITY_TYPE_AUTH: auth ticket must be obtained with + // CEPHX_GET_AUTH_SESSION_KEY + if ((ticket_req.keys & service_id) && + service_id != CEPH_ENTITY_TYPE_AUTH) { ldout(cct, 10) << " adding key for service " << ceph_entity_type_name(service_id) << dendl; CephXSessionAuthInfo info; @@ -279,7 +360,6 @@ service_err = r; continue; } - info.validity += cct->_conf->auth_service_ticket_ttl; info_vec.push_back(info); ++found_services; } diff -Nru ceph-15.2.8/src/auth/cephx/CephxServiceHandler.h ceph-15.2.11/src/auth/cephx/CephxServiceHandler.h --- ceph-15.2.8/src/auth/cephx/CephxServiceHandler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/cephx/CephxServiceHandler.h 2021-04-19 13:47:30.000000000 +0000 @@ -19,6 +19,8 @@ #include "auth/Auth.h" class KeyServer; +struct CephXAuthenticate; +struct CephXServiceTicketInfo; class CephxServiceHandler : public AuthServiceHandler { KeyServer *key_server; @@ -29,22 +31,24 @@ : AuthServiceHandler(cct_), key_server(ks), server_challenge(0) {} ~CephxServiceHandler() override {} - int start_session(const EntityName& name, - size_t connection_secret_required_length, - bufferlist *result_bl, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) override; int handle_request( bufferlist::const_iterator& indata, size_t connection_secret_required_length, bufferlist *result_bl, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *session_key, std::string *connection_secret) override; - void build_cephx_response_header(int request_type, int status, bufferlist& bl); +private: + int do_start_session(bool is_new_global_id, + bufferlist *result_bl, + AuthCapsInfo *caps) override; + + int verify_old_ticket(const CephXAuthenticate& req, + CephXServiceTicketInfo& old_ticket_info, + bool& should_enc_ticket); + void build_cephx_response_header(int request_type, int status, + bufferlist& bl); }; #endif diff -Nru ceph-15.2.8/src/auth/krb/KrbClientHandler.hpp ceph-15.2.11/src/auth/krb/KrbClientHandler.hpp --- ceph-15.2.8/src/auth/krb/KrbClientHandler.hpp 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/krb/KrbClientHandler.hpp 2021-04-19 13:47:30.000000000 +0000 @@ -39,7 +39,11 @@ reset(); } ~KrbClientHandler() override; - + + KrbClientHandler* clone() const override { + return new KrbClientHandler(*this); + } + int get_protocol() const override { return CEPH_AUTH_GSS; } void reset() override { m_gss_client_name = GSS_C_NO_NAME; diff -Nru ceph-15.2.8/src/auth/krb/KrbServiceHandler.cpp ceph-15.2.11/src/auth/krb/KrbServiceHandler.cpp --- ceph-15.2.8/src/auth/krb/KrbServiceHandler.cpp 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/krb/KrbServiceHandler.cpp 2021-04-19 13:47:30.000000000 +0000 @@ -30,7 +30,6 @@ bufferlist::const_iterator& indata, size_t connection_secret_required_length, bufferlist *buff_list, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *session_key, std::string *connection_secret) @@ -152,13 +151,10 @@ return result; } -int KrbServiceHandler::start_session( - const EntityName& name, - size_t connection_secret_required_length, +int KrbServiceHandler::do_start_session( + bool is_new_global_id, bufferlist *buff_list, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) + AuthCapsInfo *caps) { gss_buffer_desc gss_buffer_in = {0, nullptr}; gss_OID gss_object_id = GSS_C_NT_HOSTBASED_SERVICE; @@ -170,7 +166,6 @@ gss_buffer_in.length = gss_service_name.length(); gss_buffer_in.value = (const_cast(gss_service_name.c_str())); - entity_name = name; gss_major_status = gss_import_name(&gss_minor_status, &gss_buffer_in, diff -Nru ceph-15.2.8/src/auth/krb/KrbServiceHandler.hpp ceph-15.2.11/src/auth/krb/KrbServiceHandler.hpp --- ceph-15.2.8/src/auth/krb/KrbServiceHandler.hpp 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/krb/KrbServiceHandler.hpp 2021-04-19 13:47:30.000000000 +0000 @@ -40,19 +40,15 @@ int handle_request(bufferlist::const_iterator& indata, size_t connection_secret_required_length, bufferlist *buff_list, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *session_key, std::string *connection_secret) override; - int start_session(const EntityName& name, - size_t connection_secret_required_length, - bufferlist *buff_list, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) override; - private: + int do_start_session(bool is_new_global_id, + bufferlist *buff_list, + AuthCapsInfo *caps) override; + gss_buffer_desc m_gss_buffer_out; gss_cred_id_t m_gss_credentials; gss_ctx_id_t m_gss_sec_ctx; diff -Nru ceph-15.2.8/src/auth/none/AuthNoneClientHandler.h ceph-15.2.11/src/auth/none/AuthNoneClientHandler.h --- ceph-15.2.8/src/auth/none/AuthNoneClientHandler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/none/AuthNoneClientHandler.h 2021-04-19 13:47:30.000000000 +0000 @@ -26,6 +26,10 @@ AuthNoneClientHandler(CephContext *cct_) : AuthClientHandler(cct_) {} + AuthNoneClientHandler* clone() const override { + return new AuthNoneClientHandler(*this); + } + void reset() override { } void prepare_build_request() override {} diff -Nru ceph-15.2.8/src/auth/none/AuthNoneServiceHandler.h ceph-15.2.11/src/auth/none/AuthNoneServiceHandler.h --- ceph-15.2.8/src/auth/none/AuthNoneServiceHandler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/auth/none/AuthNoneServiceHandler.h 2021-04-19 13:47:30.000000000 +0000 @@ -25,27 +25,21 @@ : AuthServiceHandler(cct_) {} ~AuthNoneServiceHandler() override {} - int start_session(const EntityName& name, - size_t connection_secret_required_length, - bufferlist *result_bl, - AuthCapsInfo *caps, - CryptoKey *session_key, - std::string *connection_secret) override { - entity_name = name; - caps->allow_all = true; - return 1; - } int handle_request(bufferlist::const_iterator& indata, size_t connection_secret_required_length, bufferlist *result_bl, - uint64_t *global_id, AuthCapsInfo *caps, CryptoKey *session_key, std::string *connection_secret) override { return 0; } - void build_cephx_response_header(int request_type, int status, - bufferlist& bl) { + +private: + int do_start_session(bool is_new_global_id, + bufferlist *result_bl, + AuthCapsInfo *caps) override { + caps->allow_all = true; + return 1; } }; diff -Nru ceph-15.2.8/src/cephadm/cephadm ceph-15.2.11/src/cephadm/cephadm --- ceph-15.2.8/src/cephadm/cephadm 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/cephadm/cephadm 2021-04-19 13:47:30.000000000 +0000 @@ -48,7 +48,6 @@ import platform import pwd import random -import re import select import shutil import socket @@ -59,6 +58,7 @@ import time import errno import struct +from enum import Enum try: from typing import Dict, List, Tuple, Optional, Union, Any, NoReturn, Callable, IO except ImportError: @@ -93,7 +93,7 @@ container_path = '' cached_stdin = None -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' +DATEFMT = '%Y-%m-%dT%H:%M:%S.%fZ' # Log and console output config logging_config = { @@ -182,7 +182,7 @@ ], }, "grafana": { - "image": "docker.io/ceph/ceph-grafana:6.6.2", + "image": "docker.io/ceph/ceph-grafana:6.7.4", "cpus": "2", "memory": "4GB", "args": [], @@ -924,12 +924,22 @@ ################################## # Popen wrappers, lifted from ceph-volume -def call(command, # type: List[str] - desc=None, # type: Optional[str] - verbose=False, # type: bool - verbose_on_failure=True, # type: bool - timeout=DEFAULT_TIMEOUT, # type: Optional[int] - **kwargs): +class CallVerbosity(Enum): + SILENT = 0 + # log stdout/stderr to logger.debug + DEBUG = 1 + # On a non-zero exit status, it will forcefully set + # logging ON for the terminal + VERBOSE_ON_FAILURE = 2 + # log at info (instead of debug) level. + VERBOSE = 3 + + +def call(command: List[str], + desc: Optional[str] = None, + verbosity: CallVerbosity = CallVerbosity.VERBOSE_ON_FAILURE, + timeout: Optional[int] = DEFAULT_TIMEOUT, + **kwargs) -> Tuple[str, str, int]: """ Wrap subprocess.Popen to @@ -937,14 +947,12 @@ - decode utf-8 - cleanly return out, err, returncode - If verbose=True, log at info (instead of debug) level. - - :param verbose_on_failure: On a non-zero exit status, it will forcefully set - logging ON for the terminal :param timeout: timeout in seconds """ - if not desc: + if desc is None: desc = command[0] + if desc: + desc += ': ' timeout = timeout or args.timeout logger.debug("Running command: %s" % ' '.join(command)) @@ -977,7 +985,7 @@ if end_time and (time.time() >= end_time): stop = True if process.poll() is None: - logger.info(desc + ':timeout after %s seconds' % timeout) + logger.info(desc + 'timeout after %s seconds' % timeout) process.kill() if reads and process.poll() is not None: # we want to stop, but first read off anything remaining @@ -1007,55 +1015,58 @@ lines = message.split('\n') out_buffer = lines.pop() for line in lines: - if verbose: - logger.info(desc + ':stdout ' + line) - else: - logger.debug(desc + ':stdout ' + line) + if verbosity == CallVerbosity.VERBOSE: + logger.info(desc + 'stdout ' + line) + elif verbosity != CallVerbosity.SILENT: + logger.debug(desc + 'stdout ' + line) elif fd == process.stderr.fileno(): err += message message = err_buffer + message lines = message.split('\n') err_buffer = lines.pop() for line in lines: - if verbose: - logger.info(desc + ':stderr ' + line) - else: - logger.debug(desc + ':stderr ' + line) + if verbosity == CallVerbosity.VERBOSE: + logger.info(desc + 'stderr ' + line) + elif verbosity != CallVerbosity.SILENT: + logger.debug(desc + 'stderr ' + line) else: assert False except (IOError, OSError): pass - if verbose: - logger.debug(desc + ':profile rt=%s, stop=%s, exit=%s, reads=%s' + if verbosity == CallVerbosity.VERBOSE: + logger.debug(desc + 'profile rt=%s, stop=%s, exit=%s, reads=%s' % (time.time()-start_time, stop, process.poll(), reads)) returncode = process.wait() if out_buffer != '': - if verbose: - logger.info(desc + ':stdout ' + out_buffer) - else: - logger.debug(desc + ':stdout ' + out_buffer) + if verbosity == CallVerbosity.VERBOSE: + logger.info(desc + 'stdout ' + out_buffer) + elif verbosity != CallVerbosity.SILENT: + logger.debug(desc + 'stdout ' + out_buffer) if err_buffer != '': - if verbose: - logger.info(desc + ':stderr ' + err_buffer) - else: - logger.debug(desc + ':stderr ' + err_buffer) + if verbosity == CallVerbosity.VERBOSE: + logger.info(desc + 'stderr ' + err_buffer) + elif verbosity != CallVerbosity.SILENT: + logger.debug(desc + 'stderr ' + err_buffer) - if returncode != 0 and verbose_on_failure and not verbose: + if returncode != 0 and verbosity == CallVerbosity.VERBOSE_ON_FAILURE: # dump stdout + stderr logger.info('Non-zero exit code %d from %s' % (returncode, ' '.join(command))) for line in out.splitlines(): - logger.info(desc + ':stdout ' + line) + logger.info(desc + 'stdout ' + line) for line in err.splitlines(): - logger.info(desc + ':stderr ' + line) + logger.info(desc + 'stderr ' + line) return out, err, returncode -def call_throws(command, **kwargs): - # type: (List[str], Any) -> Tuple[str, str, int] - out, err, ret = call(command, **kwargs) +def call_throws(command: List[str], + desc: Optional[str] = None, + verbosity: CallVerbosity = CallVerbosity.VERBOSE_ON_FAILURE, + timeout: Optional[int] = DEFAULT_TIMEOUT, + **kwargs) -> Tuple[str, str, int]: + out, err, ret = call(command, desc, verbosity, timeout, **kwargs) if ret: raise RuntimeError('Failed command: %s' % ' '.join(command)) return out, err, ret @@ -1166,7 +1177,7 @@ return datetime.datetime.fromtimestamp( mt, tz=datetime.timezone.utc ).strftime(DATEFMT) - except Exception as e: + except Exception: return None @@ -1188,11 +1199,11 @@ p = re.compile(r'(\.[\d]{6})[\d]*') s = p.sub(r'\1', s) - # replace trailling Z with -0000, since (on python 3.6.8) it won't parse + # replace trailing Z with -0000, since (on python 3.6.8) it won't parse if s and s[-1] == 'Z': s = s[:-1] + '-0000' - # cut off the redundnat 'CST' part that strptime can't parse, if + # cut off the redundant 'CST' part that strptime can't parse, if # present. v = s.split(' ') s = ' '.join(v[0:3]) @@ -1409,13 +1420,16 @@ [container_path, 'images', '--filter', 'label=ceph=True', '--filter', 'dangling=false', - '--format', '{{.Repository}} {{.Tag}}']) - for line in out.splitlines(): - if len(line.split()) == 2: - repository, tag = line.split() - r = '{}:{}'.format(repository, tag) - logger.info('Using recent ceph image %s' % r) - return r + '--format', '{{.Repository}}@{{.Digest}}']) + return _filter_last_local_ceph_image(out) + + +def _filter_last_local_ceph_image(out): + # str -> Optional[str] + for image in out.splitlines(): + if image and not image.endswith('@'): + logger.info('Using recent ceph image %s' % image) + return image return None @@ -1627,7 +1641,7 @@ installed = False try: out, err, code = call(['systemctl', 'is-enabled', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) if code == 0: enabled = True installed = True @@ -1641,7 +1655,7 @@ state = 'unknown' try: out, err, code = call(['systemctl', 'is-active', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) out = out.strip() if out in ['active']: state = 'running' @@ -2177,10 +2191,10 @@ # unit file, makes it easier to read and grok. file_obj.write('# ' + comment + '\n') # Sometimes, adding `--rm` to a run_cmd doesn't work. Let's remove the container manually - file_obj.write('! '+ ' '.join(container.rm_cmd()) + '\n') + file_obj.write('! '+ ' '.join(container.rm_cmd()) + ' 2> /dev/null\n') # Sometimes, `podman rm` doesn't find the container. Then you'll have to add `--storage` if 'podman' in container_path: - file_obj.write('! '+ ' '.join(container.rm_cmd(storage=True)) + '\n') + file_obj.write('! '+ ' '.join(container.rm_cmd(storage=True)) + ' 2> /dev/null\n') # container run command file_obj.write(' '.join(container.run_cmd()) + (' &' if background else '') + '\n') @@ -2292,9 +2306,9 @@ unit_name = get_unit_name(fsid, daemon_type, daemon_id) call(['systemctl', 'stop', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'reset-failed', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) if enable: call_throws(['systemctl', 'enable', unit_name]) if start: @@ -2339,7 +2353,7 @@ else: return - out, err, ret = call([self.cmd, '--permanent', '--query-service', svc], verbose_on_failure=False) + out, err, ret = call([self.cmd, '--permanent', '--query-service', svc], verbosity=CallVerbosity.DEBUG) if ret: logger.info('Enabling firewalld service %s in current zone...' % svc) out, err, ret = call([self.cmd, '--permanent', '--add-service', svc]) @@ -2357,7 +2371,7 @@ for port in fw_ports: tcp_port = str(port) + '/tcp' - out, err, ret = call([self.cmd, '--permanent', '--query-port', tcp_port], verbose_on_failure=False) + out, err, ret = call([self.cmd, '--permanent', '--query-port', tcp_port], verbosity=CallVerbosity.DEBUG) if ret: logger.info('Enabling firewalld port %s in current zone...' % tcp_port) out, err, ret = call([self.cmd, '--permanent', '--add-port', tcp_port]) @@ -2485,7 +2499,6 @@ LimitNOFILE=1048576 LimitNPROC=1048576 EnvironmentFile=-/etc/environment -ExecStartPre=-{container_path} rm ceph-{fsid}-%i ExecStart=/bin/bash {data_dir}/{fsid}/%i/unit.run ExecStop=-{container_path} stop ceph-{fsid}-%i ExecStopPost=-/bin/bash {data_dir}/{fsid}/%i/unit.poststop @@ -2709,7 +2722,7 @@ # type: () -> int out, err, ret = call_throws([ container_path, 'inspect', - '--format', '{{.ID}},{{json .RepoDigests}}', + '--format', '{{.ID}},{{.RepoDigests}}', args.image]) if ret: return errno.ENOENT @@ -2731,7 +2744,7 @@ 'image_id': normalize_container_id(image_id) } if digests: - json_digests = json.loads(digests) + json_digests = digests[1:-1].split(' ') if json_digests: r['repo_digest'] = json_digests[0] return r @@ -2792,7 +2805,14 @@ '--allow-overwrite to overwrite' % f) dirname = os.path.dirname(f) if dirname and not os.path.exists(dirname): - raise Error('%s directory %s does not exist' % (f, dirname)) + fname = os.path.basename(f) + logger.info(f"Creating directory {dirname} for {fname}") + try: + # use makedirs to create intermediate missing dirs + os.makedirs(dirname, 0o755) + except PermissionError: + raise Error(f"Unable to create {dirname} due to permissions failure. Retry with root, or sudo or preallocate the directory.") + if not args.skip_prepare_host: command_prepare_host() @@ -2877,8 +2897,15 @@ if not cp.has_section('global'): cp.add_section('global') cp.set('global', 'fsid', fsid); - cp.set('global', 'mon host', addr_arg) + cp.set('global', 'mon_host', addr_arg) cp.set('global', 'container_image', args.image) + if not cp.has_section('mon'): + cp.add_section('mon') + if ( + not cp.has_option('mon', 'auth_allow_insecure_global_id_reclaim') + and not cp.has_option('mon', 'auth allow insecure global id reclaim') + ): + cp.set('mon', 'auth_allow_insecure_global_id_reclaim', 'false') cpf = StringIO() cp.write(cpf) config = cpf.getvalue() @@ -3232,10 +3259,11 @@ logger.info('Creating initial admin user...') password = args.initial_dashboard_password or generate_password() - cmd = ['dashboard', 'ac-user-create', args.initial_dashboard_user, password, 'administrator', '--force-password'] + tmp_password_file = write_tmp(password, uid, gid) + cmd = ['dashboard', 'ac-user-create', args.initial_dashboard_user, '-i', '/tmp/dashboard.pw', 'administrator', '--force-password'] if not args.dashboard_password_noupdate: cmd.append('--pwd-update-required') - cli(cmd) + cli(cmd, extra_mounts={pathify(tmp_password_file.name): '/tmp/dashboard.pw:z'}) logger.info('Fetching dashboard port number...') out = cli(['config', 'get', 'mgr', 'mgr/dashboard/ssl_server_port']) port = int(out) @@ -3608,7 +3636,7 @@ privileged=True, volume_mounts=mounts, ) - out, err, code = call_throws(c.run_cmd(), verbose=True) + out, err, code = call_throws(c.run_cmd(), verbosity=CallVerbosity.VERBOSE) if not code: print(out) @@ -3626,7 +3654,10 @@ call_throws([ 'systemctl', args.command, - unit_name]) + unit_name], + verbosity=CallVerbosity.VERBOSE, + desc='' + ) ################################## @@ -3813,7 +3844,7 @@ '--format', '{{.Id}},{{.Config.Image}},{{%s}},{{.Created}},{{index .Config.Labels "io.ceph.version"}}' % image_field, 'ceph-%s-%s' % (fsid, j) ], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) if not code: (container_id, image_name, image_id, start, version) = out.strip().split(',') @@ -3975,7 +4006,7 @@ args=['lvm', 'list', '--format=json'], privileged=True ) - out, err, code = call_throws(c.run_cmd(), verbose=False) + out, err, code = call_throws(c.run_cmd()) if not code: try: js = json.loads(out) @@ -4305,11 +4336,11 @@ 'this command may destroy precious data!') call(['systemctl', 'stop', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'reset-failed', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'disable', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) data_dir = get_data_dir(args.fsid, daemon_type, daemon_id) if daemon_type in ['mon', 'osd', 'prometheus'] and \ not args.force_delete_data: @@ -4344,25 +4375,25 @@ continue unit_name = get_unit_name(args.fsid, d['name']) call(['systemctl', 'stop', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'reset-failed', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'disable', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) # cluster units for unit_name in ['ceph-%s.target' % args.fsid]: call(['systemctl', 'stop', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'reset-failed', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) call(['systemctl', 'disable', unit_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) slice_name = 'system-%s.slice' % (('ceph-%s' % args.fsid).replace('-', '\\x2d')) call(['systemctl', 'stop', slice_name], - verbose_on_failure=False) + verbosity=CallVerbosity.DEBUG) # rm units call_throws(['rm', '-f', args.unit_dir + @@ -4655,13 +4686,13 @@ def install(self, ls): logger.info('Installing packages %s...' % ls) - call_throws(['apt', 'install', '-y'] + ls) + call_throws(['apt-get', 'install', '-y'] + ls) def install_podman(self): if self.distro == 'ubuntu': logger.info('Setting up repo for podman...') self.add_kubic_repo() - call_throws(['apt', 'update']) + call_throws(['apt-get', 'update']) logger.info('Attempting podman install...') try: @@ -5436,7 +5467,6 @@ up_secs, _ = raw_time.split() return float(up_secs) - @property def kernel_security(self): # type: () -> Dict[str, str] """Determine the security features enabled in the kernel - SELinux, AppArmor""" @@ -5501,6 +5531,23 @@ "description": "Linux Security Module framework is not available" } + @property + def kernel_parameters(self): + # type: () -> Dict[str, str] + """Get kernel parameters required/used in Ceph clusters""" + + k_param = {} + out, _, _ = call_throws(['sysctl', '-a'], verbosity=CallVerbosity.SILENT) + if out: + param_list = out.split('\n') + param_dict = { param.split(" = ")[0]:param.split(" = ")[-1] for param in param_list} + + # return only desired parameters + if 'net.ipv4.ip_nonlocal_bind' in param_dict: + k_param['net.ipv4.ip_nonlocal_bind'] = param_dict['net.ipv4.ip_nonlocal_bind'] + + return k_param + def dump(self): # type: () -> str """Return the attributes of this HostFacts object as json""" diff -Nru ceph-15.2.8/src/cephadm/tests/test_cephadm.py ceph-15.2.11/src/cephadm/tests/test_cephadm.py --- ceph-15.2.8/src/cephadm/tests/test_cephadm.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/cephadm/tests/test_cephadm.py 2021-04-19 13:47:30.000000000 +0000 @@ -241,7 +241,7 @@ def test_get_image_info_from_inspect(self): # podman - out = """204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1,["docker.io/ceph/ceph@sha256:1cc9b824e1b076cdff52a9aa3f0cc8557d879fb2fbbba0cafed970aca59a3992"]""" + out = """204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1,[docker.io/ceph/ceph@sha256:1cc9b824e1b076cdff52a9aa3f0cc8557d879fb2fbbba0cafed970aca59a3992]""" r = cd.get_image_info_from_inspect(out, 'registry/ceph/ceph:latest') assert r == { 'image_id': '204a01f9b0b6710dd0c0af7f37ce7139c47ff0f0105d778d7104c69282dfbbf1', @@ -249,7 +249,7 @@ } # docker - out = """sha256:16f4549cf7a8f112bbebf7946749e961fbbd1b0838627fe619aab16bc17ce552,["quay.ceph.io/ceph-ci/ceph@sha256:4e13da36c1bd6780b312a985410ae678984c37e6a9493a74c87e4a50b9bda41f"]""" + out = """sha256:16f4549cf7a8f112bbebf7946749e961fbbd1b0838627fe619aab16bc17ce552,[quay.ceph.io/ceph-ci/ceph@sha256:4e13da36c1bd6780b312a985410ae678984c37e6a9493a74c87e4a50b9bda41f]""" r = cd.get_image_info_from_inspect(out, 'registry/ceph/ceph:latest') assert r == { 'image_id': '16f4549cf7a8f112bbebf7946749e961fbbd1b0838627fe619aab16bc17ce552', @@ -278,6 +278,15 @@ result = cd.dict_get_join({'a': 1}, 'a') assert result == 1 + def test_last_local_images(self): + out = ''' +docker.io/ceph/daemon-base@ +docker.io/ceph/ceph:v15.2.5 +docker.io/ceph/daemon-base:octopus + ''' + image = cd._filter_last_local_ceph_image(out) + assert image == 'docker.io/ceph/ceph:v15.2.5' + class TestCustomContainer(unittest.TestCase): cc: cd.CustomContainer diff -Nru ceph-15.2.8/src/ceph_fuse.cc ceph-15.2.11/src/ceph_fuse.cc --- ceph-15.2.8/src/ceph_fuse.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph_fuse.cc 2021-04-19 13:47:30.000000000 +0000 @@ -167,9 +167,8 @@ } { - g_ceph_context->_conf.finalize_reexpand_meta(); common_init_finish(g_ceph_context); - + init_async_signal_handler(); register_async_signal_handler(SIGHUP, sighup_handler); diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/api/lvm.py ceph-15.2.11/src/ceph-volume/ceph_volume/api/lvm.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/api/lvm.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/api/lvm.py 2021-04-19 13:47:30.000000000 +0000 @@ -588,9 +588,31 @@ def bytes_to_extents(self, size): ''' - Return a how many extents we can fit into a size in bytes. + Return a how many free extents we can fit into a size in bytes. This has + some uncertainty involved. If size/extent_size is within 1% of the + actual free extents we will return the extent count, otherwise we'll + throw an error. + This accomodates for the size calculation in batch. We need to report + the OSD layout but have not yet created any LVM structures. We use the + disk size in batch if no VG is present and that will overshoot the + actual free_extent count due to LVM overhead. + ''' - return int(size / int(self.vg_extent_size)) + b_to_ext = int(size / int(self.vg_extent_size)) + if b_to_ext < int(self.vg_free_count): + # return bytes in extents if there is more space + return b_to_ext + elif b_to_ext / int(self.vg_free_count) - 1 < 0.01: + # return vg_fre_count if its less then 1% off + logger.info( + 'bytes_to_extents results in {} but only {} ' + 'are available, adjusting the latter'.format(b_to_ext, + self.vg_free_count)) + return int(self.vg_free_count) + # else raise an exception + raise RuntimeError('Can\'t convert {} to free extents, only {} ({} ' + 'bytes) are free'.format(size, self.vg_free_count, + self.free)) def slots_to_extents(self, slots): ''' diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/devices/lvm/batch.py ceph-15.2.11/src/ceph-volume/ceph_volume/devices/lvm/batch.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/devices/lvm/batch.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/devices/lvm/batch.py 2021-04-19 13:47:30.000000000 +0000 @@ -102,7 +102,7 @@ requested_slots = getattr(args, '{}_slots'.format(type_)) if not requested_slots or requested_slots < fast_slots_per_device: if requested_slots: - mlogger.info('{}_slots argument is to small, ignoring'.format(type_)) + mlogger.info('{}_slots argument is too small, ignoring'.format(type_)) requested_slots = fast_slots_per_device requested_size = getattr(args, '{}_size'.format(type_), 0) diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/devices/lvm/create.py ceph-15.2.11/src/ceph-volume/ceph_volume/devices/lvm/create.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/devices/lvm/create.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/devices/lvm/create.py 2021-04-19 13:47:30.000000000 +0000 @@ -42,7 +42,7 @@ Create an OSD by assigning an ID and FSID, registering them with the cluster with an ID and FSID, formatting and mounting the volume, adding all the metadata to the logical volumes using LVM tags, and starting - the OSD daemon. This is a convinience command that combines the prepare + the OSD daemon. This is a convenience command that combines the prepare and activate steps. Encryption is supported via dmcrypt and the --dmcrypt flag. diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/drive_group/main.py ceph-15.2.11/src/ceph-volume/ceph_volume/drive_group/main.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/drive_group/main.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/drive_group/main.py 2021-04-19 13:47:30.000000000 +0000 @@ -90,7 +90,7 @@ def get_dg_spec(self, dg): dg_spec = DriveGroupSpec._from_json_impl(dg) dg_spec.validate() - i = Inventory([]) + i = Inventory(['--filter-for-batch']) i.main() inventory = i.get_report() devices = [Device.from_json(i) for i in inventory] diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/tests/api/test_lvm.py ceph-15.2.11/src/ceph-volume/ceph_volume/tests/api/test_lvm.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/tests/api/test_lvm.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/tests/api/test_lvm.py 2021-04-19 13:47:30.000000000 +0000 @@ -185,21 +185,44 @@ def setup(self): self.foo_volume = api.Volume(lv_name='foo', lv_path='/path', vg_name='foo_group', lv_tags='') self.foo_group = api.VolumeGroup(vg_name='foo_group', - vg_extent_size=4194304, - vg_extent_count=100, - vg_free_count=100) + vg_extent_size="4194304", + vg_extent_count="100", + vg_free_count="100") @patch('ceph_volume.api.lvm.process.run') @patch('ceph_volume.api.lvm.process.call') @patch('ceph_volume.api.lvm.get_first_lv') def test_uses_size(self, m_get_first_lv, m_call, m_run, monkeypatch): m_get_first_lv.return_value = self.foo_volume - api.create_lv('foo', 0, vg=self.foo_group, size=5368709120, tags={'ceph.type': 'data'}) - expected = ['lvcreate', '--yes', '-l', '1280', '-n', 'foo-0', 'foo_group'] + api.create_lv('foo', 0, vg=self.foo_group, size=419430400, tags={'ceph.type': 'data'}) + expected = ['lvcreate', '--yes', '-l', '100', '-n', 'foo-0', 'foo_group'] m_run.assert_called_with(expected) @patch('ceph_volume.api.lvm.process.run') @patch('ceph_volume.api.lvm.process.call') + @patch('ceph_volume.api.lvm.get_first_lv') + def test_uses_size_adjust_if_1percent_over(self, m_get_first_lv, m_call, m_run, monkeypatch): + foo_volume = api.Volume(lv_name='foo', lv_path='/path', vg_name='foo_group', lv_tags='') + foo_group = api.VolumeGroup(vg_name='foo_group', + vg_extent_size="4194304", + vg_extent_count="1000", + vg_free_count="1000") + m_get_first_lv.return_value = foo_volume + # 423624704 should be just under 1% off of the available size 419430400 + api.create_lv('foo', 0, vg=foo_group, size=4232052736, tags={'ceph.type': 'data'}) + expected = ['lvcreate', '--yes', '-l', '1000', '-n', 'foo-0', 'foo_group'] + m_run.assert_called_with(expected) + + @patch('ceph_volume.api.lvm.process.run') + @patch('ceph_volume.api.lvm.process.call') + @patch('ceph_volume.api.lvm.get_first_lv') + def test_uses_size_too_large(self, m_get_first_lv, m_call, m_run, monkeypatch): + m_get_first_lv.return_value = self.foo_volume + with pytest.raises(RuntimeError): + api.create_lv('foo', 0, vg=self.foo_group, size=5368709120, tags={'ceph.type': 'data'}) + + @patch('ceph_volume.api.lvm.process.run') + @patch('ceph_volume.api.lvm.process.call') @patch('ceph_volume.api.lvm.get_first_lv') def test_uses_extents(self, m_get_first_lv, m_call, m_run, monkeypatch): m_get_first_lv.return_value = self.foo_volume diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/util/device.py ceph-15.2.11/src/ceph-volume/ceph_volume/util/device.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/util/device.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/util/device.py 2021-04-19 13:47:30.000000000 +0000 @@ -454,7 +454,7 @@ # assuming 4M extents here extent_size = 4194304 vg_free = int(self.size / extent_size) * extent_size - if self.size % 4194304 == 0: + if self.size % extent_size == 0: # If the extent size divides size exactly, deduct on extent for # LVM metadata vg_free -= extent_size diff -Nru ceph-15.2.8/src/ceph-volume/ceph_volume/util/disk.py ceph-15.2.11/src/ceph-volume/ceph_volume/util/disk.py --- ceph-15.2.8/src/ceph-volume/ceph_volume/util/disk.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ceph-volume/ceph_volume/util/disk.py 2021-04-19 13:47:30.000000000 +0000 @@ -760,7 +760,7 @@ # If the mapper device is a logical volume it gets excluded if is_mapper_device(diskname): - if lvm.is_lv(diskname): + if lvm.get_device_lvs(diskname): continue # all facts that have no defaults diff -Nru ceph-15.2.8/src/client/Client.cc ceph-15.2.11/src/client/Client.cc --- ceph-15.2.8/src/client/Client.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/client/Client.cc 2021-04-19 13:47:30.000000000 +0000 @@ -124,6 +124,8 @@ #define DEBUG_GETATTR_CAPS (CEPH_CAP_XATTR_SHARED) +using namespace TOPNSPC::common; + void client_flush_set_callback(void *p, ObjectCacher::ObjectSet *oset) { Client *client = static_cast(p); @@ -150,9 +152,11 @@ std::lock_guard l{m_client->client_lock}; if (command == "mds_requests") m_client->dump_mds_requests(f); - else if (command == "mds_sessions") - m_client->dump_mds_sessions(f); - else if (command == "dump_cache") + else if (command == "mds_sessions") { + bool cap_dump = false; + cmd_getval(cmdmap, "cap_dump", cap_dump); + m_client->dump_mds_sessions(f, cap_dump); + } else if (command == "dump_cache") m_client->dump_cache(f); else if (command == "kick_stale_sessions") m_client->_kick_stale_sessions(); @@ -468,6 +472,7 @@ f->dump_int("osd_epoch", osd_epoch); f->dump_int("osd_epoch_barrier", cap_epoch_barrier); f->dump_bool("blacklisted", blacklisted); + f->dump_string("fs_name", mdsmap->get_fs_name()); } } @@ -519,7 +524,8 @@ lderr(cct) << "error registering admin socket command: " << cpp_strerror(-ret) << dendl; } - ret = admin_socket->register_command("mds_sessions", + ret = admin_socket->register_command("mds_sessions " + "name=cap_dump,type=CephBool,req=false", &m_command_hook, "show mds session state"); if (ret < 0) { @@ -1534,7 +1540,7 @@ } } -void Client::dump_mds_sessions(Formatter *f) +void Client::dump_mds_sessions(Formatter *f, bool cap_dump) { f->dump_int("id", get_nodeid().v); entity_inst_t inst(messenger->get_myname(), messenger->get_myaddr_legacy()); @@ -1544,7 +1550,7 @@ f->open_array_section("sessions"); for (const auto &p : mds_sessions) { f->open_object_section("session"); - p.second.dump(f); + p.second.dump(f, cap_dump); f->close_section(); } f->close_section(); @@ -1912,6 +1918,7 @@ rel.item.dname_len = dn->name.length(); rel.item.dname_seq = dn->lease_seq; rel.dname = dn->name; + dn->lease_mds = -1; } ldout(cct, 25) << __func__ << " exit(dn:" << dn << ")" << dendl; @@ -4211,7 +4218,7 @@ int Client::_do_remount(bool retry_on_error) { - uint64_t max_retries = g_conf().get_val("mds_max_retries_on_remount_failure"); + uint64_t max_retries = cct->_conf.get_val("mds_max_retries_on_remount_failure"); errno = 0; int r = remount_cb(callback_handle); @@ -7345,7 +7352,7 @@ mask |= CEPH_CAP_AUTH_SHARED; if (want & (CEPH_STATX_NLINK|CEPH_STATX_CTIME|CEPH_STATX_VERSION)) mask |= CEPH_CAP_LINK_SHARED; - if (want & (CEPH_STATX_ATIME|CEPH_STATX_MTIME|CEPH_STATX_CTIME|CEPH_STATX_SIZE|CEPH_STATX_BLOCKS|CEPH_STATX_VERSION)) + if (want & (CEPH_STATX_NLINK|CEPH_STATX_ATIME|CEPH_STATX_MTIME|CEPH_STATX_CTIME|CEPH_STATX_SIZE|CEPH_STATX_BLOCKS|CEPH_STATX_VERSION)) mask |= CEPH_CAP_FILE_SHARED; if (want & (CEPH_STATX_VERSION|CEPH_STATX_CTIME)) mask |= CEPH_CAP_XATTR_SHARED; @@ -8130,6 +8137,7 @@ string dn_name; while (true) { + int mask = caps; if (!dirp->inode->is_complete_and_ordered()) return -EAGAIN; if (pd == dir->readdir_cache.end()) @@ -8147,7 +8155,10 @@ } int idx = pd - dir->readdir_cache.begin(); - int r = _getattr(dn->inode, caps, dirp->perms); + if (dn->inode->is_dir()) { + mask |= CEPH_STAT_RSTAT; + } + int r = _getattr(dn->inode, mask, dirp->perms); if (r < 0) return r; @@ -8231,7 +8242,7 @@ uint64_t next_off = 1; int r; - r = _getattr(diri, caps, dirp->perms); + r = _getattr(diri, caps | CEPH_STAT_RSTAT, dirp->perms); if (r < 0) return r; @@ -8264,7 +8275,7 @@ in = diri->get_first_parent()->dir->parent_inode; int r; - r = _getattr(in, caps, dirp->perms); + r = _getattr(in, caps | CEPH_STAT_RSTAT, dirp->perms); if (r < 0) return r; @@ -8330,7 +8341,11 @@ int r; if (check_caps) { - r = _getattr(entry.inode, caps, dirp->perms); + int mask = caps; + if(entry.inode->is_dir()){ + mask |= CEPH_STAT_RSTAT; + } + r = _getattr(entry.inode, mask, dirp->perms); if (r < 0) return r; } @@ -9224,7 +9239,7 @@ int want, have = 0; bool movepos = false; std::unique_ptr onuninline; - int64_t r = 0; + int64_t rc = 0; const auto& conf = cct->_conf; Inode *in = f->inode.get(); utime_t lat; @@ -9242,8 +9257,9 @@ loff_t start_pos = offset; if (in->inline_version == 0) { - r = _getattr(in, CEPH_STAT_CAP_INLINE_DATA, f->actor_perms, true); + auto r = _getattr(in, CEPH_STAT_CAP_INLINE_DATA, f->actor_perms, true); if (r < 0) { + rc = r; goto done; } ceph_assert(in->inline_version > 0); @@ -9254,9 +9270,12 @@ want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO; else want = CEPH_CAP_FILE_CACHE; - r = get_caps(f, CEPH_CAP_FILE_RD, want, &have, -1); - if (r < 0) { - goto done; + { + auto r = get_caps(f, CEPH_CAP_FILE_RD, want, &have, -1); + if (r < 0) { + rc = r; + goto done; + } } if (f->flags & O_DIRECT) have &= ~(CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO); @@ -9278,12 +9297,12 @@ bl->substr_of(in->inline_data, offset, len - offset); bl->append_zero(endoff - len); } - r = endoff - offset; + rc = endoff - offset; } else if ((uint64_t)offset < endoff) { bl->append_zero(endoff - offset); - r = endoff - offset; + rc = endoff - offset; } else { - r = 0; + rc = 0; } goto success; } @@ -9296,27 +9315,31 @@ if (f->flags & O_RSYNC) { _flush_range(in, offset, size); } - r = _read_async(f, offset, size, bl); - if (r < 0) + rc = _read_async(f, offset, size, bl); + if (rc < 0) goto done; } else { if (f->flags & O_DIRECT) _flush_range(in, offset, size); bool checkeof = false; - r = _read_sync(f, offset, size, bl, &checkeof); - if (r < 0) + rc = _read_sync(f, offset, size, bl, &checkeof); + if (rc < 0) goto done; if (checkeof) { - offset += r; - size -= r; + offset += rc; + size -= rc; put_cap_ref(in, CEPH_CAP_FILE_RD); have = 0; // reverify size - r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms); - if (r < 0) - goto done; + { + auto r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms); + if (r < 0) { + rc = r; + goto done; + } + } // eof? short read. if ((uint64_t)offset < in->size) @@ -9325,10 +9348,10 @@ } success: - ceph_assert(r >= 0); + ceph_assert(rc >= 0); if (movepos) { // adjust fd pos - f->pos = start_pos + r; + f->pos = start_pos + rc; } lat = ceph_clock_now(); @@ -9348,7 +9371,7 @@ in->mark_caps_dirty(CEPH_CAP_FILE_WR); check_caps(in, 0); } else - r = ret; + rc = ret; } if (have) { put_cap_ref(in, CEPH_CAP_FILE_RD); @@ -9356,7 +9379,7 @@ if (movepos) { unlock_fh_pos(f); } - return r; + return rc; } Client::C_Readahead::C_Readahead(Client *c, Fh *f) : @@ -9874,6 +9897,8 @@ if (f->flags & O_PATH) return -EBADF; #endif + if ((f->mode & CEPH_FILE_MODE_WR) == 0) + return -EBADF; struct stat attr; attr.st_size = length; return _setattr(f->inode, &attr, CEPH_SETATTR_SIZE, perms); @@ -11463,6 +11488,9 @@ if (vxattr->flags & VXATTR_RSTAT) { flags |= CEPH_STAT_RSTAT; } + if (vxattr->flags & VXATTR_DIRSTAT) { + flags |= CEPH_CAP_FILE_SHARED; + } r = _getattr(in, flags, perms, true); if (r != 0) { // Error from getattr! @@ -11998,18 +12026,21 @@ (long unsigned)in->snap_btime.nsec()); } +size_t Client::_vxattrcb_cluster_fsid(Inode *in, char *val, size_t size) +{ + return snprintf(val, size, "%s", monclient->get_fsid().to_string().c_str()); +} + +size_t Client::_vxattrcb_client_id(Inode *in, char *val, size_t size) +{ + auto name = messenger->get_myname(); + return snprintf(val, size, "%s%ld", name.type_str(), name.num()); +} + #define CEPH_XATTR_NAME(_type, _name) "ceph." #_type "." #_name #define CEPH_XATTR_NAME2(_type, _name, _name2) "ceph." #_type "." #_name "." #_name2 -#define XATTR_NAME_CEPH(_type, _name) \ -{ \ - name: CEPH_XATTR_NAME(_type, _name), \ - getxattr_cb: &Client::_vxattrcb_ ## _type ## _ ## _name, \ - readonly: true, \ - exists_cb: NULL, \ - flags: 0, \ -} -#define XATTR_NAME_CEPH2(_type, _name, _flags) \ +#define XATTR_NAME_CEPH(_type, _name, _flags) \ { \ name: CEPH_XATTR_NAME(_type, _name), \ getxattr_cb: &Client::_vxattrcb_ ## _type ## _ ## _name, \ @@ -12047,14 +12078,14 @@ XATTR_LAYOUT_FIELD(dir, layout, object_size), XATTR_LAYOUT_FIELD(dir, layout, pool), XATTR_LAYOUT_FIELD(dir, layout, pool_namespace), - XATTR_NAME_CEPH(dir, entries), - XATTR_NAME_CEPH(dir, files), - XATTR_NAME_CEPH(dir, subdirs), - XATTR_NAME_CEPH2(dir, rentries, VXATTR_RSTAT), - XATTR_NAME_CEPH2(dir, rfiles, VXATTR_RSTAT), - XATTR_NAME_CEPH2(dir, rsubdirs, VXATTR_RSTAT), - XATTR_NAME_CEPH2(dir, rbytes, VXATTR_RSTAT), - XATTR_NAME_CEPH2(dir, rctime, VXATTR_RSTAT), + XATTR_NAME_CEPH(dir, entries, VXATTR_DIRSTAT), + XATTR_NAME_CEPH(dir, files, VXATTR_DIRSTAT), + XATTR_NAME_CEPH(dir, subdirs, VXATTR_DIRSTAT), + XATTR_NAME_CEPH(dir, rentries, VXATTR_RSTAT), + XATTR_NAME_CEPH(dir, rfiles, VXATTR_RSTAT), + XATTR_NAME_CEPH(dir, rsubdirs, VXATTR_RSTAT), + XATTR_NAME_CEPH(dir, rbytes, VXATTR_RSTAT), + XATTR_NAME_CEPH(dir, rctime, VXATTR_RSTAT), { name: "ceph.quota", getxattr_cb: &Client::_vxattrcb_quota, @@ -12104,6 +12135,24 @@ { name: "" } /* Required table terminator */ }; +const Client::VXattr Client::_common_vxattrs[] = { + { + name: "ceph.cluster_fsid", + getxattr_cb: &Client::_vxattrcb_cluster_fsid, + readonly: true, + exists_cb: nullptr, + flags: 0, + }, + { + name: "ceph.client_id", + getxattr_cb: &Client::_vxattrcb_client_id, + readonly: true, + exists_cb: nullptr, + flags: 0, + }, + { name: "" } /* Required table terminator */ +}; + const Client::VXattr *Client::_get_vxattrs(Inode *in) { if (in->is_dir()) @@ -12124,7 +12173,16 @@ vxattr++; } } + + // for common vxattrs + vxattr = _common_vxattrs; + while (!vxattr->name.empty()) { + if (vxattr->name == name) + return vxattr; + vxattr++; + } } + return NULL; } diff -Nru ceph-15.2.8/src/client/Client.h ceph-15.2.11/src/client/Client.h --- ceph-15.2.8/src/client/Client.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/client/Client.h 2021-04-19 13:47:30.000000000 +0000 @@ -778,7 +778,7 @@ void _sync_write_commit(Inode *in); void dump_mds_requests(Formatter *f); - void dump_mds_sessions(Formatter *f); + void dump_mds_sessions(Formatter *f, bool cap_dump=false); int make_request(MetaRequest *req, const UserPerm& perms, InodeRef *ptarget = 0, bool *pcreated = 0, @@ -1007,9 +1007,11 @@ /* Flags for VXattr */ static const unsigned VXATTR_RSTAT = 0x1; + static const unsigned VXATTR_DIRSTAT = 0x2; static const VXattr _dir_vxattrs[]; static const VXattr _file_vxattrs[]; + static const VXattr _common_vxattrs[]; @@ -1159,6 +1161,9 @@ bool _vxattrcb_snap_btime_exists(Inode *in); size_t _vxattrcb_snap_btime(Inode *in, char *val, size_t size); + size_t _vxattrcb_cluster_fsid(Inode *in, char *val, size_t size); + size_t _vxattrcb_client_id(Inode *in, char *val, size_t size); + static const VXattr *_get_vxattrs(Inode *in); static const VXattr *_match_vxattr(Inode *in, const char *name); diff -Nru ceph-15.2.8/src/client/fuse_ll.cc ceph-15.2.11/src/client/fuse_ll.cc --- ceph-15.2.8/src/client/fuse_ll.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/client/fuse_ll.cc 2021-04-19 13:47:30.000000000 +0000 @@ -135,7 +135,8 @@ static void get_fuse_groups(UserPerm& perms, fuse_req_t req) { - if (g_conf().get_val("fuse_set_user_groups")) { + CephFuse::Handle *cfuse = (CephFuse::Handle *)fuse_req_userdata(req); + if (cfuse->client->cct->_conf.get_val("fuse_set_user_groups")) { gid_t *gids = NULL; int count = getgroups(req, &gids); diff -Nru ceph-15.2.8/src/client/MetaSession.cc ceph-15.2.11/src/client/MetaSession.cc --- ceph-15.2.8/src/client/MetaSession.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/client/MetaSession.cc 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ #include "messages/MClientCapRelease.h" #include "MetaSession.h" +#include "Inode.h" #include "common/Formatter.h" @@ -21,7 +22,7 @@ } } -void MetaSession::dump(Formatter *f) const +void MetaSession::dump(Formatter *f, bool cap_dump) const { f->dump_int("mds", mds_num); f->dump_object("addrs", addrs); @@ -31,6 +32,13 @@ f->dump_stream("last_cap_renew_request") << last_cap_renew_request; f->dump_unsigned("cap_renew_seq", cap_renew_seq); f->dump_int("num_caps", caps.size()); + if (cap_dump) { + f->open_array_section("caps"); + for (const auto& cap : caps) { + f->dump_object("cap", *cap); + } + f->close_section(); + } f->dump_string("state", get_state_name()); } diff -Nru ceph-15.2.8/src/client/MetaSession.h ceph-15.2.11/src/client/MetaSession.h --- ceph-15.2.8/src/client/MetaSession.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/client/MetaSession.h 2021-04-19 13:47:30.000000000 +0000 @@ -66,7 +66,7 @@ const char *get_state_name() const; - void dump(Formatter *f) const; + void dump(Formatter *f, bool cap_dump=false) const; void enqueue_cap_release(inodeno_t ino, uint64_t cap_id, ceph_seq_t iseq, ceph_seq_t mseq, epoch_t osd_barrier); diff -Nru ceph-15.2.8/src/cls/rgw/cls_rgw.cc ceph-15.2.11/src/cls/rgw/cls_rgw.cc --- ceph-15.2.8/src/cls/rgw/cls_rgw.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/cls/rgw/cls_rgw.cc 2021-04-19 13:47:30.000000000 +0000 @@ -623,6 +623,7 @@ calc_header->tag_timeout = existing_header->tag_timeout; calc_header->ver = existing_header->ver; + calc_header->syncstopped = existing_header->syncstopped; map keys; string start_obj; @@ -968,9 +969,7 @@ entry.index_ver = header.ver; /* resetting entry flags, entry might have been previously a delete * marker */ - entry.flags = (entry.key.instance.empty() ? - 0 : - rgw_bucket_dir_entry::FLAG_VER); + entry.flags &= rgw_bucket_dir_entry::FLAG_VER; if (op.tag.size()) { map::iterator pinter = entry.pending_map.find(op.tag); diff -Nru ceph-15.2.8/src/cls/user/cls_user.cc ceph-15.2.11/src/cls/user/cls_user.cc --- ceph-15.2.8/src/cls/user/cls_user.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/cls/user/cls_user.cc 2021-04-19 13:47:30.000000000 +0000 @@ -414,6 +414,9 @@ } add_header_stats(&header.stats, e); } + if (!keys.empty()) { + from_index = keys.rbegin()->first; + } } while (truncated); bufferlist bl; diff -Nru ceph-15.2.8/src/common/buffer.cc ceph-15.2.11/src/common/buffer.cc --- ceph-15.2.8/src/common/buffer.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/buffer.cc 2021-04-19 13:47:30.000000000 +0000 @@ -1165,6 +1165,8 @@ std::unique_ptr nb) { unsigned pos = 0; + int mempool = _buffers.front().get_mempool(); + nb->reassign_to_mempool(mempool); for (auto& node : _buffers) { nb->copy_in(pos, node.length(), node.c_str(), false); pos += node.length(); diff -Nru ceph-15.2.8/src/common/config.cc ceph-15.2.11/src/common/config.cc --- ceph-15.2.8/src/common/config.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/config.cc 2021-04-19 13:47:30.000000000 +0000 @@ -1107,17 +1107,19 @@ bool md_config_t::finalize_reexpand_meta(ConfigValues& values, const ConfigTracker& tracker) { - for (auto& [name, value] : may_reexpand_meta) { - set_val(values, tracker, name, value); - } - - if (!may_reexpand_meta.empty()) { - // meta expands could have modified anything. Copy it all out again. - update_legacy_vals(values); - return true; - } else { - return false; + std::vector reexpands; + reexpands.swap(may_reexpand_meta); + for (auto& name : reexpands) { + // always refresh the options if they are in the may_reexpand_meta + // map, because the options may have already been expanded with old + // meta. + const auto &opt_iter = schema.find(name); + ceph_assert(opt_iter != schema.end()); + const Option &opt = opt_iter->second; + _refresh(values, opt); } + + return !may_reexpand_meta.empty(); } Option::value_t md_config_t::_expand_meta( @@ -1201,7 +1203,7 @@ } else if (var == "pid") { out += stringify(getpid()); if (o) { - may_reexpand_meta[o->name] = *str; + may_reexpand_meta.push_back(o->name); } } else if (var == "cctid") { out += stringify((unsigned long long)this); diff -Nru ceph-15.2.8/src/common/config.h ceph-15.2.11/src/common/config.h --- ceph-15.2.8/src/common/config.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/config.h 2021-04-19 13:47:30.000000000 +0000 @@ -100,7 +100,7 @@ std::map ignored_mon_values; /// original raw values saved that may need to re-expand at certain time - mutable std::map may_reexpand_meta; + mutable std::vector may_reexpand_meta; /// encoded, cached copy of of values + ignored_mon_values ceph::bufferlist values_bl; diff -Nru ceph-15.2.8/src/common/config_proxy.h ceph-15.2.11/src/common/config_proxy.h --- ceph-15.2.8/src/common/config_proxy.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/config_proxy.h 2021-04-19 13:47:30.000000000 +0000 @@ -199,7 +199,6 @@ rev_obs_map_t rev_obs; if (config.finalize_reexpand_meta(values, obs_mgr)) { _gather_changes(values.changed, &rev_obs, nullptr); - values.changed.clear(); } call_observers(locker, rev_obs); @@ -256,7 +255,6 @@ if (!values.cluster.empty()) { // meta expands could have modified anything. Copy it all out again. _gather_changes(values.changed, &rev_obs, oss); - values.changed.clear(); } call_observers(locker, rev_obs); @@ -268,6 +266,7 @@ [this, rev_obs](md_config_obs_t *obs, const std::string &key) { map_observer_changes(obs, key, rev_obs); }, oss); + changes.clear(); } int set_val(const std::string_view key, const std::string& s, std::stringstream* err_ss=nullptr) { @@ -290,7 +289,6 @@ rev_obs_map_t rev_obs; _gather_changes(values.changed, &rev_obs, nullptr); - values.changed.clear(); call_observers(locker, rev_obs); return ret; @@ -301,7 +299,6 @@ rev_obs_map_t rev_obs; _gather_changes(values.changed, &rev_obs, oss); - values.changed.clear(); call_observers(locker, rev_obs); return ret; diff -Nru ceph-15.2.8/src/common/legacy_config_opts.h ceph-15.2.11/src/common/legacy_config_opts.h --- ceph-15.2.8/src/common/legacy_config_opts.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/legacy_config_opts.h 2021-04-19 13:47:30.000000000 +0000 @@ -330,6 +330,8 @@ OPTION(cephx_sign_messages, OPT_BOOL) // Default to signing session messages if supported OPTION(auth_mon_ticket_ttl, OPT_DOUBLE) OPTION(auth_service_ticket_ttl, OPT_DOUBLE) +OPTION(auth_allow_insecure_global_id_reclaim, OPT_BOOL) +OPTION(auth_expose_insecure_global_id_reclaim, OPT_BOOL) OPTION(auth_debug, OPT_BOOL) // if true, assert when weird things happen OPTION(mon_client_hunt_parallel, OPT_U32) // how many mons to try to connect to in parallel during hunt OPTION(mon_client_hunt_interval, OPT_DOUBLE) // try new mon every N seconds until we connect @@ -898,6 +900,8 @@ OPTION(bdev_nvme_retry_count, OPT_INT) // -1 means by default which is 4 OPTION(bdev_enable_discard, OPT_BOOL) OPTION(bdev_async_discard, OPT_BOOL) +OPTION(bdev_flock_retry_interval, OPT_FLOAT) +OPTION(bdev_flock_retry, OPT_INT) OPTION(objectstore_blackhole, OPT_BOOL) @@ -916,6 +920,7 @@ OPTION(bluefs_log_replay_check_allocations, OPT_BOOL) OPTION(bluefs_replay_recovery, OPT_BOOL) OPTION(bluefs_replay_recovery_disable_compact, OPT_BOOL) +OPTION(bluefs_check_for_zeros, OPT_BOOL) OPTION(bluestore_bluefs, OPT_BOOL) OPTION(bluestore_bluefs_env_mirror, OPT_BOOL) // mirror to normal Env for debug @@ -1012,6 +1017,7 @@ OPTION(bluestore_max_deferred_txc, OPT_U64) OPTION(bluestore_max_defer_interval, OPT_U64) OPTION(bluestore_rocksdb_options, OPT_STR) +OPTION(bluestore_rocksdb_options_annex, OPT_STR) OPTION(bluestore_fsck_on_mount, OPT_BOOL) OPTION(bluestore_fsck_on_mount_deep, OPT_BOOL) OPTION(bluestore_fsck_quick_fix_on_mount, OPT_BOOL) @@ -1063,6 +1069,7 @@ OPTION(bluestore_volume_selection_policy, OPT_STR) OPTION(bluestore_volume_selection_reserved_factor, OPT_DOUBLE) OPTION(bluestore_volume_selection_reserved, OPT_INT) +OPTION(bluestore_kv_sync_util_logging_s, OPT_DOUBLE) OPTION(kstore_max_ops, OPT_U64) OPTION(kstore_max_bytes, OPT_U64) @@ -1443,6 +1450,7 @@ OPTION(rgw_curl_low_speed_time, OPT_INT) // low speed time for certain curl calls OPTION(rgw_copy_obj_progress, OPT_BOOL) // should dump progress during long copy operations? OPTION(rgw_copy_obj_progress_every_bytes, OPT_INT) // min bytes between copy progress output +OPTION(rgw_sync_obj_etag_verify, OPT_BOOL) // verify if the copied object from remote is identical to source OPTION(rgw_obj_tombstone_cache_size, OPT_INT) // how many objects in tombstone cache, which is used in multi-zone sync to keep // track of removed objects' mtime diff -Nru ceph-15.2.8/src/common/options.cc ceph-15.2.11/src/common/options.cc --- ceph-15.2.8/src/common/options.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/common/options.cc 2021-04-19 13:47:30.000000000 +0000 @@ -1699,6 +1699,22 @@ .add_service("mon") .set_description("time before OSDs who do not report to the mons are marked down (seconds)"), + Option("mon_warn_on_insecure_global_id_reclaim", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(true) + .add_service("mon") + .set_description("issue AUTH_INSECURE_GLOBAL_ID_RECLAIM health warning if any connected clients are insecurely reclaiming global_id") + .add_see_also("mon_warn_on_insecure_global_id_reclaim_allowed") + .add_see_also("auth_allow_insecure_global_id_reclaim") + .add_see_also("auth_expose_insecure_global_id_reclaim"), + + Option("mon_warn_on_insecure_global_id_reclaim_allowed", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(true) + .add_service("mon") + .set_description("issue AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED health warning if insecure global_id reclaim is allowed") + .add_see_also("mon_warn_on_insecure_global_id_reclaim") + .add_see_also("auth_allow_insecure_global_id_reclaim") + .add_see_also("auth_expose_insecure_global_id_reclaim"), + Option("mon_warn_on_msgr2_not_enabled", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) .set_default(true) .add_service("mon") @@ -2257,13 +2273,29 @@ .set_description(""), Option("auth_mon_ticket_ttl", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) - .set_default(12_hr) + .set_default(72_hr) .set_description(""), Option("auth_service_ticket_ttl", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) .set_default(1_hr) .set_description(""), + Option("auth_allow_insecure_global_id_reclaim", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(true) + .set_description("Allow reclaiming global_id without presenting a valid ticket proving previous possession of that global_id") + .set_long_description("Allowing unauthorized global_id (re)use poses a security risk. Unfortunately, older clients may omit their ticket on reconnects and therefore rely on this being allowed for preserving their global_id for the lifetime of the client instance. Setting this value to false would immediately prevent new connections from those clients (assuming auth_expose_insecure_global_id_reclaim set to true) and eventually break existing sessions as well (regardless of auth_expose_insecure_global_id_reclaim setting).") + .add_see_also("mon_warn_on_insecure_global_id_reclaim") + .add_see_also("mon_warn_on_insecure_global_id_reclaim_allowed") + .add_see_also("auth_expose_insecure_global_id_reclaim"), + + Option("auth_expose_insecure_global_id_reclaim", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(true) + .set_description("Force older clients that may omit their ticket on reconnects to reconnect as part of establishing a session") + .set_long_description("In permissive mode (auth_allow_insecure_global_id_reclaim set to true), this helps with identifying clients that are not patched. In enforcing mode (auth_allow_insecure_global_id_reclaim set to false), this is a fail-fast mechanism: don't establish a session that will almost inevitably be broken later.") + .add_see_also("mon_warn_on_insecure_global_id_reclaim") + .add_see_also("mon_warn_on_insecure_global_id_reclaim_allowed") + .add_see_also("auth_allow_insecure_global_id_reclaim"), + Option("auth_debug", Option::TYPE_BOOL, Option::LEVEL_DEV) .set_default(false) .set_description(""), @@ -3539,11 +3571,11 @@ .set_description("Time in seconds to sleep before next removal transaction for HDDs"), Option("osd_delete_sleep_ssd", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) - .set_default(0) + .set_default(1) .set_description("Time in seconds to sleep before next removal transaction for SSDs"), Option("osd_delete_sleep_hybrid", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) - .set_default(2) + .set_default(1) .set_description("Time in seconds to sleep before next removal transaction when data is on HDD and journal is on SSD"), Option("osd_failsafe_full_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) @@ -3977,6 +4009,14 @@ Option("bdev_async_discard", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) .set_default(false) .set_description(""), + + Option("bdev_flock_retry_interval", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) + .set_default(0.1) + .set_description("interval to retry the flock"), + + Option("bdev_flock_retry", Option::TYPE_INT, Option::LEVEL_ADVANCED) + .set_default(3) + .set_description("times to retry the flock"), Option("bluefs_alloc_size", Option::TYPE_SIZE, Option::LEVEL_ADVANCED) .set_default(1_M) @@ -4043,6 +4083,14 @@ .set_default(false) .set_description(""), + Option("bluefs_check_for_zeros", Option::TYPE_BOOL, Option::LEVEL_DEV) + .set_default(false) + .set_flag(Option::FLAG_RUNTIME) + .set_description("Check data read for suspicious pages") + .set_long_description("Looks into data read to check if there is a 4K block entirely filled with zeros. " + "If this happens, we re-read data. If there is difference, we print error to log.") + .add_see_also("bluestore_retry_disk_reads"), + Option("bluestore_bluefs", Option::TYPE_BOOL, Option::LEVEL_DEV) .set_default(true) .set_flag(Option::FLAG_CREATE) @@ -4426,7 +4474,11 @@ Option("bluestore_rocksdb_options", Option::TYPE_STR, Option::LEVEL_ADVANCED) .set_default("compression=kNoCompression,max_write_buffer_number=4,min_write_buffer_number_to_merge=1,recycle_log_file_num=4,write_buffer_size=268435456,writable_file_max_buffer_size=0,compaction_readahead_size=2097152,max_background_compactions=2") - .set_description("Rocksdb options"), + .set_description("Full set of rocksdb settings to override"), + + Option("bluestore_rocksdb_options_annex", Option::TYPE_STR, Option::LEVEL_ADVANCED) + .set_default("") + .set_description("An addition to bluestore_rocksdb_options. Allows setting rocksdb options without repeating the existing defaults."), Option("bluestore_rocksdb_cf", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) .set_default(false) @@ -4678,6 +4730,22 @@ .set_default(false) .set_description("Enables Linux io_uring API instead of libaio"), + Option("bdev_ioring_hipri", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(false) + .set_description("Enables Linux io_uring API Use polled IO completions"), + + Option("bdev_ioring_sqthread_poll", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(false) + .set_description("Enables Linux io_uring API Offload submission/completion to kernel thread"), + + Option("bluestore_kv_sync_util_logging_s", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) + .set_default(10.0) + .set_flag(Option::FLAG_RUNTIME) + .set_description("KV sync thread utilization logging period") + .set_long_description("How often (in seconds) to print KV sync thread utilization, " + "not logged when set to 0 or when utilization is 0%"), + + // ----------------------------------------- // kstore @@ -6366,6 +6434,15 @@ .set_default(1_M) .set_description("Send copy-object progress info after these many bytes"), + Option("rgw_sync_obj_etag_verify", Option::TYPE_BOOL, Option::LEVEL_ADVANCED) + .set_default(false) + .set_description("Verify if the object copied from remote is identical to its source") + .set_long_description( + "If true, this option computes the MD5 checksum of the data which is written at the " + "destination and checks if it is identical to the ETAG stored in the source. " + "It ensures integrity of the objects fetched from a remote server over HTTP including " + "multisite sync."), + Option("rgw_obj_tombstone_cache_size", Option::TYPE_INT, Option::LEVEL_ADVANCED) .set_default(1000) .set_description("Max number of entries to keep in tombstone cache") @@ -7806,6 +7883,24 @@ .set_flag(Option::FLAG_RUNTIME) .set_long_description("This is the order of magnitude difference (in base 2) of the internal liveness decay counter and the number of capabilities the session holds. When this difference occurs, the MDS treats the session as quiescent and begins recalling capabilities."), + Option("mds_session_cap_acquisition_decay_rate", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) + .set_default(10) + .set_description("decay rate for session readdir caps leading to readdir throttle") + .set_flag(Option::FLAG_RUNTIME) + .set_long_description("The half-life for the session cap acquisition counter of caps acquired by readdir. This is used for throttling readdir requests from clients slow to release caps."), + + Option("mds_session_cap_acquisition_throttle", Option::TYPE_UINT, Option::LEVEL_ADVANCED) + .set_default(500000) + .set_description("throttle point for cap acquisition decay counter"), + + Option("mds_session_max_caps_throttle_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) + .set_default(1.1) + .set_description("ratio of mds_max_maps_per_client that client must exceed before readdir may be throttled by cap acquisition throttle"), + + Option("mds_cap_acquisition_throttle_retry_request_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED) + .set_default(0.5) + .set_description("timeout in seconds after which a client request is retried due to cap acquisition throttling"), + Option("mds_freeze_tree_timeout", Option::TYPE_FLOAT, Option::LEVEL_DEV) .set_default(30) .set_description(""), diff -Nru ceph-15.2.8/src/crimson/osd/pg.cc ceph-15.2.11/src/crimson/osd/pg.cc --- ceph-15.2.8/src/crimson/osd/pg.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/crimson/osd/pg.cc 2021-04-19 13:47:30.000000000 +0000 @@ -297,7 +297,8 @@ } } -void PG::do_delete_work(ceph::os::Transaction &t) +ghobject_t PG::do_delete_work(ceph::os::Transaction &t, + ghobject_t _next) { // TODO shard_services.dec_pg_num(); diff -Nru ceph-15.2.8/src/crimson/osd/pg.h ceph-15.2.11/src/crimson/osd/pg.h --- ceph-15.2.8/src/crimson/osd/pg.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/crimson/osd/pg.h 2021-04-19 13:47:30.000000000 +0000 @@ -273,7 +273,8 @@ void on_removal(ceph::os::Transaction &t) final { // TODO } - void do_delete_work(ceph::os::Transaction &t) final; + ghobject_t do_delete_work(ceph::os::Transaction &t, + ghobject_t _next) final; // merge/split not ready void clear_ready_to_merge() final {} diff -Nru ceph-15.2.8/src/.git_version ceph-15.2.11/src/.git_version --- ceph-15.2.8/src/.git_version 2020-12-16 17:34:16.000000000 +0000 +++ ceph-15.2.11/src/.git_version 2021-04-19 13:50:12.000000000 +0000 @@ -1,2 +1,2 @@ -bdf3eebcd22d7d0b3dd4d5501bee5bac354d5b55 -15.2.8 +e3523634d9c2227df9af89a4eac33d16738c49cb +15.2.11 diff -Nru ceph-15.2.8/src/global/global_init.cc ceph-15.2.11/src/global/global_init.cc --- ceph-15.2.8/src/global/global_init.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/global/global_init.cc 2021-04-19 13:47:30.000000000 +0000 @@ -494,6 +494,9 @@ void global_init_postfork_start(CephContext *cct) { + // reexpand the meta in child process + cct->_conf.finalize_reexpand_meta(); + // restart log thread cct->_log->start(); cct->notify_post_fork(); diff -Nru ceph-15.2.8/src/global/signal_handler.h ceph-15.2.11/src/global/signal_handler.h --- ceph-15.2.8/src/global/signal_handler.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/global/signal_handler.h 2021-04-19 13:47:30.000000000 +0000 @@ -20,10 +20,12 @@ typedef void (*signal_handler_t)(int); -#ifndef HAVE_REENTRANT_STRSIGNAL -# define sig_str(signum) sys_siglist[signum] -#else +#ifdef HAVE_SIGDESCR_NP +# define sig_str(signum) sigdescr_np(signum) +#elif HAVE_REENTRANT_STRSIGNAL # define sig_str(signum) strsignal(signum) +#else +# define sig_str(signum) sys_siglist[signum] #endif void install_sighandler(int signum, signal_handler_t handler, int flags); diff -Nru ceph-15.2.8/src/include/config-h.in.cmake ceph-15.2.11/src/include/config-h.in.cmake --- ceph-15.2.8/src/include/config-h.in.cmake 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/include/config-h.in.cmake 2021-04-19 13:47:30.000000000 +0000 @@ -220,6 +220,9 @@ /* Define to 1 if you have sched.h. */ #cmakedefine HAVE_SCHED 1 +/* Define to 1 if you have sigdescr_np. */ +#cmakedefine HAVE_SIGDESCR_NP 1 + /* Support SSE (Streaming SIMD Extensions) instructions */ #cmakedefine HAVE_SSE diff -Nru ceph-15.2.8/src/include/rbd/librbd.h ceph-15.2.11/src/include/rbd/librbd.h --- ceph-15.2.8/src/include/rbd/librbd.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/include/rbd/librbd.h 2021-04-19 13:47:30.000000000 +0000 @@ -1241,6 +1241,9 @@ rbd_mirror_image_info_t *mirror_image_info, size_t info_size, rbd_completion_t c); +CEPH_RBD_API int rbd_aio_mirror_image_get_mode(rbd_image_t image, + rbd_mirror_image_mode_t *mode, + rbd_completion_t c); CEPH_RBD_API int rbd_aio_mirror_image_get_global_status( rbd_image_t image, @@ -1251,6 +1254,11 @@ size_t status_size, rbd_completion_t c) CEPH_RBD_DEPRECATED; +CEPH_RBD_API int rbd_aio_mirror_image_create_snapshot(rbd_image_t image, + uint32_t flags, + uint64_t *snap_id, + rbd_completion_t c); + // RBD groups support functions CEPH_RBD_API int rbd_group_create(rados_ioctx_t p, const char *name); CEPH_RBD_API int rbd_group_remove(rados_ioctx_t p, const char *name); diff -Nru ceph-15.2.8/src/include/rbd/librbd.hpp ceph-15.2.11/src/include/rbd/librbd.hpp --- ceph-15.2.8/src/include/rbd/librbd.hpp 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/include/rbd/librbd.hpp 2021-04-19 13:47:30.000000000 +0000 @@ -768,6 +768,8 @@ mirror_image_status_t *mirror_image_status, size_t status_size, RBD::AioCompletion *c) CEPH_RBD_DEPRECATED; + int aio_mirror_image_create_snapshot(uint32_t flags, uint64_t *snap_id, + RBD::AioCompletion *c); int update_watch(UpdateWatchCtx *ctx, uint64_t *handle); int update_unwatch(uint64_t handle); diff -Nru ceph-15.2.8/src/krbd.cc ceph-15.2.11/src/krbd.cc --- ceph-15.2.8/src/krbd.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/krbd.cc 2021-04-19 13:47:30.000000000 +0000 @@ -44,6 +44,7 @@ #include #include +#include #include static const int UDEV_BUF_SIZE = 1 << 20; /* doubled to 2M (SO_RCVBUFFORCE) */ @@ -184,24 +185,39 @@ } static int build_map_buf(CephContext *cct, const krbd_spec& spec, - const char *options, string *pbuf) + const string& options, string *pbuf) { + bool msgr2 = false; ostringstream oss; int r; + boost::char_separator sep(","); + boost::tokenizer> tok(options, sep); + for (const auto& t : tok) { + if (boost::starts_with(t, "ms_mode=")) { + /* msgr2 unless ms_mode=legacy */ + msgr2 = t.compare(8, t.npos, "legacy"); + } + } + MonMap monmap; r = monmap.build_initial(cct, false, cerr); if (r < 0) return r; - list mon_addr; - monmap.list_addrs(mon_addr); - - for (const auto &p : mon_addr) { - if (oss.tellp() > 0) { - oss << ","; + /* + * If msgr2, filter TYPE_MSGR2 addresses. Otherwise, filter + * TYPE_LEGACY addresses. + */ + for (const auto& p : monmap.mon_info) { + for (const auto& a : p.second.public_addrs.v) { + if ((msgr2 && a.is_msgr2()) || (!msgr2 && a.is_legacy())) { + if (oss.tellp() > 0) { + oss << ","; + } + oss << a.get_sockaddr(); + } } - oss << p.get_sockaddr(); } oss << " name=" << cct->_conf->name.get_id(); @@ -244,7 +260,7 @@ oss << ",key=" << key_name; } - if (strcmp(options, "") != 0) + if (!options.empty()) oss << "," << options; if (!spec.nspace_name.empty()) oss << ",_pool_ns=" << spec.nspace_name; diff -Nru ceph-15.2.8/src/librbd/api/DiffIterate.cc ceph-15.2.11/src/librbd/api/DiffIterate.cc --- ceph-15.2.8/src/librbd/api/DiffIterate.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/DiffIterate.cc 2021-04-19 13:47:30.000000000 +0000 @@ -32,12 +32,6 @@ namespace { -enum ObjectDiffState { - OBJECT_DIFF_STATE_NONE = 0, - OBJECT_DIFF_STATE_UPDATED = 1, - OBJECT_DIFF_STATE_HOLE = 2 -}; - struct DiffContext { DiffIterate<>::Callback callback; void *callback_arg; @@ -381,7 +375,8 @@ if (fast_diff_enabled) { const uint64_t object_no = p->second.front().objectno; - if (object_diff_state[object_no] == OBJECT_DIFF_STATE_NONE && + uint8_t diff_state = object_diff_state[object_no]; + if (diff_state == object_map::DIFF_STATE_HOLE && from_snap_id == 0 && !diff_context.parent_diff.empty()) { // no data in child object -- report parent diff instead for (auto& oe : p->second) { @@ -399,9 +394,9 @@ } } } - } else if (object_diff_state[object_no] != OBJECT_DIFF_STATE_NONE) { - bool updated = (object_diff_state[object_no] == - OBJECT_DIFF_STATE_UPDATED); + } else if (diff_state == object_map::DIFF_STATE_HOLE_UPDATED || + diff_state == object_map::DIFF_STATE_DATA_UPDATED) { + bool updated = (diff_state == object_map::DIFF_STATE_DATA_UPDATED); for (std::vector::iterator q = p->second.begin(); q != p->second.end(); ++q) { r = m_callback(off + q->offset, q->length, updated, m_callback_arg); diff -Nru ceph-15.2.8/src/librbd/api/Image.cc ceph-15.2.11/src/librbd/api/Image.cc --- ceph-15.2.8/src/librbd/api/Image.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/Image.cc 2021-04-19 13:47:30.000000000 +0000 @@ -548,7 +548,7 @@ return -EBUSY; } - features = (src->features & ~RBD_FEATURES_IMPLICIT_ENABLE); + features = src->features; src_size = src->get_image_size(src->snap_id); } uint64_t format = 2; diff -Nru ceph-15.2.8/src/librbd/api/Migration.cc ceph-15.2.11/src/librbd/api/Migration.cc --- ceph-15.2.8/src/librbd/api/Migration.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/Migration.cc 2021-04-19 13:47:30.000000000 +0000 @@ -427,7 +427,6 @@ return -ENOSYS; } features &= ~RBD_FEATURES_INTERNAL; - features |= RBD_FEATURE_MIGRATING; opts.set(RBD_IMAGE_OPTION_FEATURES, features); uint64_t order = image_ctx->order; @@ -460,9 +459,6 @@ cls::rbd::MIGRATION_STATE_PREPARING, "", nullptr); r = migration.prepare(); - features &= ~RBD_FEATURE_MIGRATING; - opts.set(RBD_IMAGE_OPTION_FEATURES, features); - return r; } diff -Nru ceph-15.2.8/src/librbd/api/Mirror.cc ceph-15.2.11/src/librbd/api/Mirror.cc --- ceph-15.2.8/src/librbd/api/Mirror.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/Mirror.cc 2021-04-19 13:47:30.000000000 +0000 @@ -35,6 +35,7 @@ #include "json_spirit/json_spirit.h" #include +#include #define dout_subsys ceph_subsys_rbd #undef dout_prefix @@ -353,6 +354,39 @@ } }; +template +struct C_ImageSnapshotCreate : public Context { + I *ictx; + uint64_t *snap_id; + Context *on_finish; + + cls::rbd::MirrorImage mirror_image; + mirror::PromotionState promotion_state; + std::string primary_mirror_uuid; + + C_ImageSnapshotCreate(I *ictx, uint64_t *snap_id, Context *on_finish) + : ictx(ictx), snap_id(snap_id), on_finish(on_finish) { + } + + void finish(int r) override { + if (r < 0 && r != -ENOENT) { + on_finish->complete(r); + return; + } + + if (mirror_image.mode != cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT || + mirror_image.state != cls::rbd::MIRROR_IMAGE_STATE_ENABLED) { + lderr(ictx->cct) << "snapshot based mirroring is not enabled" << dendl; + on_finish->complete(-EINVAL); + return; + } + + auto req = mirror::snapshot::CreatePrimaryRequest::create( + ictx, mirror_image.global_image_id, CEPH_NOSNAP, 0U, snap_id, on_finish); + req->send(); + } +}; + } // anonymous namespace template @@ -1970,36 +2004,48 @@ } template -int Mirror::image_snapshot_create(I *ictx, uint64_t *snap_id) { +int Mirror::image_snapshot_create(I *ictx, uint32_t flags, + uint64_t *snap_id) { + C_SaferCond ctx; + Mirror::image_snapshot_create(ictx, flags, snap_id, &ctx); + + return ctx.wait(); +} + +template +void Mirror::image_snapshot_create(I *ictx, uint32_t flags, + uint64_t *snap_id, Context *on_finish) { CephContext *cct = ictx->cct; ldout(cct, 20) << "ictx=" << ictx << dendl; - int r = ictx->state->refresh_if_required(); - if (r < 0) { - return r; + if (flags != 0U) { + lderr(cct) << "invalid snap create flags: " << std::bitset<32>(flags) + << dendl; + on_finish->complete(-EINVAL); + return; } - cls::rbd::MirrorImage mirror_image; - r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id, - &mirror_image); - if (r == -ENOENT) { - return -EINVAL; - } else if (r < 0) { - lderr(cct) << "failed to retrieve mirror image" << dendl; - return r; - } + auto on_refresh = new LambdaContext( + [ictx, snap_id, on_finish](int r) { + if (r < 0) { + lderr(ictx->cct) << "refresh failed: " << cpp_strerror(r) << dendl; + on_finish->complete(r); + return; + } - if (mirror_image.mode != cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT || - mirror_image.state != cls::rbd::MIRROR_IMAGE_STATE_ENABLED) { - lderr(cct) << "snapshot based mirroring is not enabled" << dendl; - return -EINVAL; - } + auto ctx = new C_ImageSnapshotCreate(ictx, snap_id, on_finish); + auto req = mirror::GetInfoRequest::create(*ictx, &ctx->mirror_image, + &ctx->promotion_state, + &ctx->primary_mirror_uuid, + ctx); + req->send(); + }); - C_SaferCond on_finish; - auto req = mirror::snapshot::CreatePrimaryRequest::create( - ictx, mirror_image.global_image_id, CEPH_NOSNAP, 0U, snap_id, &on_finish); - req->send(); - return on_finish.wait(); + if (ictx->state->is_refresh_required()) { + ictx->state->refresh(on_refresh); + } else { + on_refresh->complete(0); + } } } // namespace api diff -Nru ceph-15.2.8/src/librbd/api/Mirror.h ceph-15.2.11/src/librbd/api/Mirror.h --- ceph-15.2.8/src/librbd/api/Mirror.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/Mirror.h 2021-04-19 13:47:30.000000000 +0000 @@ -113,7 +113,10 @@ Context *on_finish); static int image_get_instance_id(ImageCtxT *ictx, std::string *instance_id); - static int image_snapshot_create(ImageCtxT *ictx, uint64_t *snap_id); + static int image_snapshot_create(ImageCtxT *ictx, uint32_t flags, + uint64_t *snap_id); + static void image_snapshot_create(ImageCtxT *ictx, uint32_t flags, + uint64_t *snap_id, Context *on_finish); }; } // namespace api diff -Nru ceph-15.2.8/src/librbd/api/PoolMetadata.cc ceph-15.2.11/src/librbd/api/PoolMetadata.cc --- ceph-15.2.8/src/librbd/api/PoolMetadata.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/api/PoolMetadata.cc 2021-04-19 13:47:30.000000000 +0000 @@ -17,6 +17,32 @@ namespace librbd { namespace api { +namespace { + +void update_pool_timestamp(librados::IoCtx& io_ctx) { + CephContext *cct = (CephContext *)io_ctx.cct(); + + auto now = ceph_clock_now(); + std::string cmd = + R"({)" + R"("prefix": "config set", )" + R"("who": "global", )" + R"("name": "rbd_config_pool_override_update_timestamp", )" + R"("value": ")" + stringify(now.sec()) + R"(")" + R"(})"; + + librados::Rados rados(io_ctx); + bufferlist in_bl; + std::string ss; + int r = rados.mon_command(cmd, in_bl, nullptr, &ss); + if (r < 0) { + lderr(cct) << "failed to notify clients of pool config update: " + << cpp_strerror(r) << dendl; + } +} + +} // anonymous namespace + template int PoolMetadata::get(librados::IoCtx& io_ctx, const std::string &key, std::string *value) { @@ -36,7 +62,7 @@ const std::string &value) { CephContext *cct = (CephContext *)io_ctx.cct(); - bool update_pool_timestamp = false; + bool need_update_pool_timestamp = false; std::string config_key; if (util::is_metadata_config_override(key, &config_key)) { @@ -52,7 +78,7 @@ return -EINVAL; } - update_pool_timestamp = true; + need_update_pool_timestamp = true; } ceph::bufferlist bl; @@ -65,24 +91,8 @@ return r; } - if (update_pool_timestamp) { - auto now = ceph_clock_now(); - std::string cmd = - R"({)" - R"("prefix": "config set", )" - R"("who": "global", )" - R"("name": "rbd_config_pool_override_update_timestamp", )" - R"("value": ")" + stringify(now.sec()) + R"(")" - R"(})"; - - librados::Rados rados(io_ctx); - bufferlist in_bl; - std::string ss; - r = rados.mon_command(cmd, in_bl, nullptr, &ss); - if (r < 0) { - lderr(cct) << "failed to notify clients of pool config update: " - << cpp_strerror(r) << dendl; - } + if (need_update_pool_timestamp) { + update_pool_timestamp(io_ctx); } return 0; @@ -111,6 +121,11 @@ return r; } + std::string config_key; + if (util::is_metadata_config_override(key, &config_key)) { + update_pool_timestamp(io_ctx); + } + return 0; } diff -Nru ceph-15.2.8/src/librbd/CMakeLists.txt ceph-15.2.11/src/librbd/CMakeLists.txt --- ceph-15.2.8/src/librbd/CMakeLists.txt 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/CMakeLists.txt 2021-04-19 13:47:30.000000000 +0000 @@ -1,3 +1,7 @@ +if(Boost_VERSION VERSION_GREATER_EQUAL 1.74) + add_definitions(-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT) +endif() + add_library(rbd_types STATIC journal/Types.cc mirroring_watcher/Types.cc diff -Nru ceph-15.2.8/src/librbd/deep_copy/ImageCopyRequest.cc ceph-15.2.11/src/librbd/deep_copy/ImageCopyRequest.cc --- ceph-15.2.8/src/librbd/deep_copy/ImageCopyRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/deep_copy/ImageCopyRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -67,7 +67,36 @@ } template +void ImageCopyRequest::map_src_objects(uint64_t dst_object, + std::set *src_objects) { + std::vector> image_extents; + Striper::extent_to_file(m_cct, &m_dst_image_ctx->layout, dst_object, 0, + m_dst_image_ctx->layout.object_size, image_extents); + + for (auto &e : image_extents) { + std::map> src_object_extents; + Striper::file_to_extents(m_cct, m_src_image_ctx->format_string, + &m_src_image_ctx->layout, e.first, e.second, 0, + src_object_extents); + for (auto &p : src_object_extents) { + for (auto &s : p.second) { + src_objects->insert(s.objectno); + } + } + } + + ceph_assert(!src_objects->empty()); + + ldout(m_cct, 20) << dst_object << " -> " << *src_objects << dendl; +} + +template void ImageCopyRequest::compute_diff() { + if (m_flatten) { + send_object_copies(); + return; + } + ldout(m_cct, 10) << dendl; auto ctx = create_context_callback< @@ -149,22 +178,41 @@ } uint64_t ono = m_object_no++; - if (ono < m_object_diff_state.size() && - m_object_diff_state[ono] == object_map::DIFF_STATE_NONE) { - ldout(m_cct, 20) << "skipping clean object " << ono << dendl; - return 1; + + if (m_object_diff_state.size() > 0) { + std::set src_objects; + map_src_objects(ono, &src_objects); + + bool skip = true; + for (auto src_ono : src_objects) { + if (src_ono >= m_object_diff_state.size() || + m_object_diff_state[src_ono] != object_map::DIFF_STATE_HOLE) { + skip = false; + break; + } + } + + if (skip) { + ldout(m_cct, 20) << "skipping clean object " << ono << dendl; + return 1; + } } ldout(m_cct, 20) << "object_num=" << ono << dendl; ++m_current_ops; + uint32_t flags = 0; + if (m_flatten) { + flags |= OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + Context *ctx = new LambdaContext( [this, ono](int r) { handle_object_copy(ono, r); }); auto req = ObjectCopyRequest::create( m_src_image_ctx, m_dst_image_ctx, m_src_snap_id_start, m_dst_snap_id_start, - m_snap_map, ono, m_flatten, m_handler, ctx); + m_snap_map, ono, flags, m_handler, ctx); req->send(); return 0; } diff -Nru ceph-15.2.8/src/librbd/deep_copy/ImageCopyRequest.h ceph-15.2.11/src/librbd/deep_copy/ImageCopyRequest.h --- ceph-15.2.8/src/librbd/deep_copy/ImageCopyRequest.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/deep_copy/ImageCopyRequest.h 2021-04-19 13:47:30.000000000 +0000 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -102,6 +103,8 @@ BitVector<2> m_object_diff_state; + void map_src_objects(uint64_t dst_object, std::set *src_objects); + void compute_diff(); void handle_compute_diff(int r); diff -Nru ceph-15.2.8/src/librbd/deep_copy/ObjectCopyRequest.cc ceph-15.2.11/src/librbd/deep_copy/ObjectCopyRequest.cc --- ceph-15.2.8/src/librbd/deep_copy/ObjectCopyRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/deep_copy/ObjectCopyRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -40,6 +40,7 @@ using librbd::util::create_context_callback; using librbd::util::create_rados_callback; +using librbd::util::get_image_ctx; template ObjectCopyRequest::ObjectCopyRequest(I *src_image_ctx, @@ -48,27 +49,30 @@ librados::snap_t dst_snap_id_start, const SnapMap &snap_map, uint64_t dst_object_number, - bool flatten, Handler* handler, + uint32_t flags, Handler* handler, Context *on_finish) : m_src_image_ctx(src_image_ctx), m_dst_image_ctx(dst_image_ctx), m_cct(dst_image_ctx->cct), m_src_snap_id_start(src_snap_id_start), m_dst_snap_id_start(dst_snap_id_start), m_snap_map(snap_map), - m_dst_object_number(dst_object_number), m_flatten(flatten), + m_dst_object_number(dst_object_number), m_flags(flags), m_handler(handler), m_on_finish(on_finish) { ceph_assert(src_image_ctx->data_ctx.is_valid()); ceph_assert(dst_image_ctx->data_ctx.is_valid()); ceph_assert(!m_snap_map.empty()); m_src_async_op = new io::AsyncOperation(); - m_src_async_op->start_op(*util::get_image_ctx(m_src_image_ctx)); + m_src_async_op->start_op(*get_image_ctx(m_src_image_ctx)); m_src_io_ctx.dup(m_src_image_ctx->data_ctx); m_dst_io_ctx.dup(m_dst_image_ctx->data_ctx); m_dst_oid = m_dst_image_ctx->get_object_name(dst_object_number); - ldout(m_cct, 20) << "dst_oid=" << m_dst_oid << dendl; + ldout(m_cct, 20) << "dst_oid=" << m_dst_oid << ", " + << "src_snap_id_start=" << m_src_snap_id_start << ", " + << "dst_snap_id_start=" << m_dst_snap_id_start << ", " + << "snap_map=" << m_snap_map << dendl; compute_src_object_extents(); } @@ -259,7 +263,7 @@ auto ctx = create_context_callback< ObjectCopyRequest, &ObjectCopyRequest::handle_read_from_parent>(this); auto comp = io::AioCompletion::create_and_start( - ctx, util::get_image_ctx(m_src_image_ctx->parent), io::AIO_TYPE_READ); + ctx, get_image_ctx(m_src_image_ctx->parent), io::AIO_TYPE_READ); ldout(m_cct, 20) << "completion " << comp << ", extents " << image_extents << dendl; @@ -301,14 +305,87 @@ compute_dst_object_may_exist(); compute_zero_ops(); - if (m_write_ops.empty()) { - // nothing to copy - finish(-ENOENT); + send_update_object_map(); +} + +template +void ObjectCopyRequest::send_update_object_map() { + if (!m_dst_image_ctx->test_features(RBD_FEATURE_OBJECT_MAP) || + m_dst_object_state.empty()) { + if (m_write_ops.empty()) { + // no data to copy or truncate/zero. only the copyup state machine cares + // about whether the object exists or not, and it always copies from + // snap id 0. + finish(m_src_snap_id_start > 0 ? 0 : -ENOENT); + return; + } + + send_write_object(); + return; + } + + m_dst_image_ctx->owner_lock.lock_shared(); + m_dst_image_ctx->image_lock.lock_shared(); + if (m_dst_image_ctx->object_map == nullptr) { + // possible that exclusive lock was lost in background + lderr(m_cct) << "object map is not initialized" << dendl; + + m_dst_image_ctx->image_lock.unlock_shared(); + m_dst_image_ctx->owner_lock.unlock_shared(); + finish(-EINVAL); + return; + } + + auto &dst_object_state = *m_dst_object_state.begin(); + auto it = m_snap_map.find(dst_object_state.first); + ceph_assert(it != m_snap_map.end()); + auto dst_snap_id = it->second.front(); + auto object_state = dst_object_state.second; + m_dst_object_state.erase(m_dst_object_state.begin()); + + ldout(m_cct, 20) << "dst_snap_id=" << dst_snap_id << ", object_state=" + << static_cast(object_state) << dendl; + + int r; + auto finish_op_ctx = start_lock_op(m_dst_image_ctx->owner_lock, &r); + if (finish_op_ctx == nullptr) { + lderr(m_cct) << "lost exclusive lock" << dendl; + m_dst_image_ctx->image_lock.unlock_shared(); + m_dst_image_ctx->owner_lock.unlock_shared(); + finish(r); + return; + } + + auto ctx = new LambdaContext([this, finish_op_ctx](int r) { + handle_update_object_map(r); + finish_op_ctx->complete(0); + }); + + auto dst_image_ctx = m_dst_image_ctx; + bool sent = dst_image_ctx->object_map->template aio_update< + Context, &Context::complete>(dst_snap_id, m_dst_object_number, object_state, + {}, {}, false, ctx); + + // NOTE: state machine might complete before we reach here + dst_image_ctx->image_lock.unlock_shared(); + dst_image_ctx->owner_lock.unlock_shared(); + if (!sent) { + ceph_assert(dst_snap_id == CEPH_NOSNAP); + ctx->complete(0); + } +} + +template +void ObjectCopyRequest::handle_update_object_map(int r) { + ldout(m_cct, 20) << "r=" << r << dendl; + + if (r < 0) { + lderr(m_cct) << "failed to update object map: " << cpp_strerror(r) << dendl; + finish(r); return; } - send_write_object(); - return; + send_update_object_map(); } template @@ -351,7 +428,10 @@ librados::ObjectWriteOperation op; uint64_t buffer_offset; - if (!m_dst_image_ctx->migration_info.empty()) { + bool migration = ((m_flags & OBJECT_COPY_REQUEST_FLAG_MIGRATION) != 0); + if (migration) { + ldout(m_cct, 20) << "assert_snapc_seq=" << dst_snap_seq << dendl; + cls_client::assert_snapc_seq(&op, dst_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_GT_SNAPSET_SEQ); } @@ -393,7 +473,7 @@ } } - if (op.size() == (m_dst_image_ctx->migration_info.empty() ? 0 : 1)) { + if (op.size() == (migration ? 1 : 0)) { handle_write_object(0); return; } @@ -444,82 +524,6 @@ return; } - send_update_object_map(); -} - -template -void ObjectCopyRequest::send_update_object_map() { - if (!m_dst_image_ctx->test_features(RBD_FEATURE_OBJECT_MAP) || - m_dst_object_state.empty()) { - finish(0); - return; - } - - m_dst_image_ctx->owner_lock.lock_shared(); - m_dst_image_ctx->image_lock.lock_shared(); - if (m_dst_image_ctx->object_map == nullptr) { - // possible that exclusive lock was lost in background - lderr(m_cct) << "object map is not initialized" << dendl; - - m_dst_image_ctx->image_lock.unlock_shared(); - m_dst_image_ctx->owner_lock.unlock_shared(); - finish(-EINVAL); - return; - } - - auto &dst_object_state = *m_dst_object_state.begin(); - auto it = m_snap_map.find(dst_object_state.first); - ceph_assert(it != m_snap_map.end()); - auto dst_snap_id = it->second.front(); - auto object_state = dst_object_state.second; - m_dst_object_state.erase(m_dst_object_state.begin()); - - ldout(m_cct, 20) << "dst_snap_id=" << dst_snap_id << ", object_state=" - << static_cast(object_state) << dendl; - - int r; - auto finish_op_ctx = start_lock_op(m_dst_image_ctx->owner_lock, &r); - if (finish_op_ctx == nullptr) { - lderr(m_cct) << "lost exclusive lock" << dendl; - m_dst_image_ctx->image_lock.unlock_shared(); - m_dst_image_ctx->owner_lock.unlock_shared(); - finish(r); - return; - } - - auto ctx = new LambdaContext([this, finish_op_ctx](int r) { - handle_update_object_map(r); - finish_op_ctx->complete(0); - }); - - auto dst_image_ctx = m_dst_image_ctx; - bool sent = dst_image_ctx->object_map->template aio_update< - Context, &Context::complete>(dst_snap_id, m_dst_object_number, object_state, - {}, {}, false, ctx); - - // NOTE: state machine might complete before we reach here - dst_image_ctx->image_lock.unlock_shared(); - dst_image_ctx->owner_lock.unlock_shared(); - if (!sent) { - ceph_assert(dst_snap_id == CEPH_NOSNAP); - ctx->complete(0); - } -} - -template -void ObjectCopyRequest::handle_update_object_map(int r) { - ldout(m_cct, 20) << "r=" << r << dendl; - - if (r < 0) { - lderr(m_cct) << "failed to update object map: " << cpp_strerror(r) << dendl; - finish(r); - return; - } - - if (!m_dst_object_state.empty()) { - send_update_object_map(); - return; - } finish(0); } @@ -600,14 +604,68 @@ m_src_image_ctx->image_lock.unlock_shared(); librados::snap_t src_copy_point_snap_id = m_snap_map.rbegin()->first; - bool prev_exists = (hide_parent || m_src_snap_id_start > 0); + bool prev_exists = hide_parent; uint64_t prev_end_size = prev_exists ? m_src_image_ctx->layout.object_size : 0; + + if (m_src_snap_id_start > 0) { + // determine if the src object exists within the dst object at the + // specified start snapshot so we can properly compute its object + // map state later + interval_set diff; + uint64_t end_size; + bool exists; + librados::snap_t clone_end_snap_id; + calc_snap_set_diff(m_cct, m_snap_set, 0, m_src_snap_id_start, &diff, + &end_size, &exists, &clone_end_snap_id, + &m_read_whole_object); + if (m_read_whole_object) { + exists = true; + end_size = m_src_image_ctx->layout.object_size; + } + + ldout(m_cct, 20) << "start_src_snap_id=0, " + << "end_src_snap_id=" << m_src_snap_id_start << ", " + << "end_size=" << end_size << ", " + << "exists=" << exists << dendl; + if (exists) { + prev_exists = true; + prev_end_size = end_size; + + for (auto& [dst_object_offset, src_object_extent] : m_src_object_extents) { + if (src_object_extent.object_no != m_src_ono || + src_object_extent.offset + 1 > end_size) { + // src extent maps to a different object or an extent that starts + // after the current object end_size + continue; + } + + // trim the src extent length to the corresponding end size + auto src_object_extent_length = std::min( + src_object_extent.length, end_size - src_object_extent.offset); + auto dst_object_extent_length = dst_object_offset + + src_object_extent_length; + + ldout(m_cct, 20) << "src_end_size=" << src_object_extent_length << ", " + << "dst_end_size=" << dst_object_extent_length + << dendl; + m_dst_object_size = std::max(m_dst_object_size.value_or(0), + dst_object_extent_length); + } + } + } + librados::snap_t start_src_snap_id = m_src_snap_id_start; for (auto &pair : m_snap_map) { ceph_assert(!pair.second.empty()); librados::snap_t end_src_snap_id = pair.first; + if (start_src_snap_id >= end_src_snap_id) { + // skip any snapshots prior to the requested start position + ldout(m_cct, 20) << "skipping src snap id " << end_src_snap_id << dendl; + continue; + } + librados::snap_t end_dst_snap_id = pair.second.front(); interval_set diff; @@ -757,7 +815,8 @@ return; } - if (noent_count == m_src_object_extents.size() && !m_flatten) { + bool flatten = ((m_flags & OBJECT_COPY_REQUEST_FLAG_FLATTEN) != 0); + if (noent_count == m_src_object_extents.size() && !flatten) { ldout(m_cct, 20) << "reading all extents skipped when no flatten" << dendl; return; @@ -864,8 +923,9 @@ void ObjectCopyRequest::compute_zero_ops() { ldout(m_cct, 20) << dendl; + bool object_exists = (m_src_snap_id_start > 0 && !!m_dst_object_size); bool fast_diff = m_dst_image_ctx->test_features(RBD_FEATURE_FAST_DIFF); - uint64_t prev_end_size = 0; + uint64_t prev_end_size = m_dst_object_size.value_or(0); m_src_image_ctx->image_lock.lock_shared(); bool hide_parent = (m_src_image_ctx->parent != nullptr); @@ -881,9 +941,10 @@ auto dst_may_exist_it = m_dst_object_may_exist.find(dst_snap_seq); ceph_assert(dst_may_exist_it != m_dst_object_may_exist.end()); - if (!dst_may_exist_it->second && prev_end_size > 0) { + if (!dst_may_exist_it->second && object_exists) { ldout(m_cct, 5) << "object DNE for snap_id: " << dst_snap_seq << dendl; m_write_ops[src_snap_seq].emplace_back(COPY_OP_TYPE_REMOVE, 0, 0, 0); + object_exists = false; prev_end_size = 0; continue; } @@ -911,11 +972,6 @@ if (overlap == 0) { ldout(m_cct, 20) << "no parent overlap" << dendl; hide_parent = false; - } else if (src_snap_seq == m_dst_zero_interval.begin()->first) { - for (auto e : image_extents) { - prev_end_size += e.second; - } - ceph_assert(prev_end_size <= m_dst_image_ctx->layout.object_size); } } } @@ -927,6 +983,7 @@ if (iter != m_write_ops.end()) { for (auto ©_op : iter->second) { for (auto &e : copy_op.dst_extent_map) { + object_exists = true; end_size = std::max(end_size, e.first + e.second); } } @@ -939,15 +996,18 @@ m_write_ops[src_snap_seq] .emplace_back(COPY_OP_TYPE_REMOVE_TRUNC, 0, 0, 0); ldout(m_cct, 20) << "COPY_OP_TYPE_REMOVE_TRUNC" << dendl; + object_exists = true; } else if (z.get_start() < prev_end_size) { if (z.get_start() == 0) { m_write_ops[src_snap_seq] .emplace_back(COPY_OP_TYPE_REMOVE, 0, 0, 0); ldout(m_cct, 20) << "COPY_OP_TYPE_REMOVE" << dendl; + object_exists = false; } else { m_write_ops[src_snap_seq] .emplace_back(COPY_OP_TYPE_TRUNC, 0, z.get_start(), 0); ldout(m_cct, 20) << "COPY_OP_TYPE_TRUNC " << z.get_start() << dendl; + object_exists = true; } } end_size = std::min(end_size, z.get_start()); @@ -957,17 +1017,23 @@ .emplace_back(COPY_OP_TYPE_ZERO, 0, z.get_start(), z.get_len()); ldout(m_cct, 20) << "COPY_OP_TYPE_ZERO " << z.get_start() << "~" << z.get_len() << dendl; + object_exists = true; } } - ldout(m_cct, 20) << "src_snap_seq=" << src_snap_seq << ", end_size=" - << end_size << dendl; - if (end_size > 0 || hide_parent) { - m_dst_object_state[src_snap_seq] = OBJECT_EXISTS; - if (fast_diff && end_size == prev_end_size && - m_write_ops[src_snap_seq].empty()) { - m_dst_object_state[src_snap_seq] = OBJECT_EXISTS_CLEAN; + + uint8_t dst_object_map_state = OBJECT_NONEXISTENT; + if (object_exists) { + dst_object_map_state = OBJECT_EXISTS; + if (fast_diff && m_write_ops[src_snap_seq].empty()) { + dst_object_map_state = OBJECT_EXISTS_CLEAN; } + m_dst_object_state[src_snap_seq] = dst_object_map_state; } + + ldout(m_cct, 20) << "dst_snap_seq=" << dst_snap_seq << ", " + << "end_size=" << end_size << ", " + << "dst_object_map_state=" + << static_cast(dst_object_map_state) << dendl; prev_end_size = end_size; } } diff -Nru ceph-15.2.8/src/librbd/deep_copy/ObjectCopyRequest.h ceph-15.2.11/src/librbd/deep_copy/ObjectCopyRequest.h --- ceph-15.2.8/src/librbd/deep_copy/ObjectCopyRequest.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/deep_copy/ObjectCopyRequest.h 2021-04-19 13:47:30.000000000 +0000 @@ -13,6 +13,7 @@ #include "librbd/io/Types.h" #include #include +#include #include class Context; @@ -34,17 +35,17 @@ librados::snap_t src_snap_id_start, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, - uint64_t object_number, bool flatten, + uint64_t object_number, uint32_t flags, Handler* handler, Context *on_finish) { return new ObjectCopyRequest(src_image_ctx, dst_image_ctx, src_snap_id_start, dst_snap_id_start, snap_map, - object_number, flatten, handler, on_finish); + object_number, flags, handler, on_finish); } ObjectCopyRequest(ImageCtxT *src_image_ctx, ImageCtxT *dst_image_ctx, librados::snap_t src_snap_id_start, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, - uint64_t object_number, bool flatten, Handler* handler, + uint64_t object_number, uint32_t flags, Handler* handler, Context *on_finish); void send(); @@ -80,13 +81,13 @@ * | /-----------\ * | | | (repeat for each snapshot) * v v | - * WRITE_OBJECT --------/ - * | + * UPDATE_OBJECT_MAP ---/ (skip if object + * | map disabled) * | /-----------\ * | | | (repeat for each snapshot) * v v | - * UPDATE_OBJECT_MAP ---/ (skip if object - * | map disabled) + * WRITE_OBJECT --------/ + * | * v * * @@ -147,7 +148,7 @@ librados::snap_t m_dst_snap_id_start; SnapMap m_snap_map; uint64_t m_dst_object_number; - bool m_flatten; + uint32_t m_flags; Handler* m_handler; Context *m_on_finish; @@ -172,6 +173,7 @@ std::map> m_dst_zero_interval; std::map m_dst_object_state; std::map m_dst_object_may_exist; + std::optional m_dst_object_size = std::nullopt; bufferlist m_read_from_parent_data; io::AsyncOperation* m_src_async_op = nullptr; @@ -185,12 +187,12 @@ void send_read_from_parent(); void handle_read_from_parent(int r); - void send_write_object(); - void handle_write_object(int r); - void send_update_object_map(); void handle_update_object_map(int r); + void send_write_object(); + void handle_write_object(int r); + Context *start_lock_op(ceph::shared_mutex &owner_lock, int* r); uint64_t src_to_dst_object_offset(uint64_t objectno, uint64_t offset); diff -Nru ceph-15.2.8/src/librbd/deep_copy/Types.h ceph-15.2.11/src/librbd/deep_copy/Types.h --- ceph-15.2.8/src/librbd/deep_copy/Types.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/deep_copy/Types.h 2021-04-19 13:47:30.000000000 +0000 @@ -11,6 +11,11 @@ namespace librbd { namespace deep_copy { +enum { + OBJECT_COPY_REQUEST_FLAG_FLATTEN = 1U << 0, + OBJECT_COPY_REQUEST_FLAG_MIGRATION = 1U << 1, +}; + typedef std::vector SnapIds; typedef std::map SnapMap; diff -Nru ceph-15.2.8/src/librbd/image/CreateRequest.cc ceph-15.2.11/src/librbd/image/CreateRequest.cc --- ceph-15.2.8/src/librbd/image/CreateRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/image/CreateRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -38,7 +38,7 @@ lderr(cct) << "librbd does not support requested features." << dendl; return -ENOSYS; } - if ((features & RBD_FEATURE_OPERATIONS) != 0) { + if ((features & RBD_FEATURES_INTERNAL) != 0) { lderr(cct) << "cannot use internally controlled features" << dendl; return -EINVAL; } @@ -155,6 +155,7 @@ m_features |= features_set; m_features &= ~features_clear; + m_features &= ~RBD_FEATURES_IMPLICIT_ENABLE; if ((m_features & RBD_FEATURE_OBJECT_MAP) == RBD_FEATURE_OBJECT_MAP) { m_features |= RBD_FEATURE_FAST_DIFF; } @@ -200,14 +201,11 @@ m_features |= RBD_FEATURE_DATA_POOL; } else { m_data_pool.clear(); - m_features &= ~RBD_FEATURE_DATA_POOL; } if ((m_stripe_unit != 0 && m_stripe_unit != (1ULL << m_order)) || (m_stripe_count != 0 && m_stripe_count != 1)) { m_features |= RBD_FEATURE_STRIPINGV2; - } else { - m_features &= ~RBD_FEATURE_STRIPINGV2; } ldout(m_cct, 10) << "name=" << m_image_name << ", " diff -Nru ceph-15.2.8/src/librbd/io/CopyupRequest.cc ceph-15.2.11/src/librbd/io/CopyupRequest.cc --- ceph-15.2.8/src/librbd/io/CopyupRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/io/CopyupRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -237,11 +237,16 @@ ldout(cct, 20) << "flatten=" << m_flatten << dendl; + uint32_t flags = deep_copy::OBJECT_COPY_REQUEST_FLAG_MIGRATION; + if (m_flatten) { + flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + auto ctx = util::create_context_callback< CopyupRequest, &CopyupRequest::handle_deep_copy>(this); auto req = deep_copy::ObjectCopyRequest::create( m_image_ctx->parent, m_image_ctx, 0, 0, - m_image_ctx->migration_info.snap_map, m_object_no, m_flatten, nullptr, ctx); + m_image_ctx->migration_info.snap_map, m_object_no, flags, nullptr, ctx); req->send(); } diff -Nru ceph-15.2.8/src/librbd/librbd.cc ceph-15.2.11/src/librbd/librbd.cc --- ceph-15.2.8/src/librbd/librbd.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/librbd.cc 2021-04-19 13:47:30.000000000 +0000 @@ -2834,7 +2834,7 @@ int Image::mirror_image_create_snapshot(uint64_t *snap_id) { ImageCtx *ictx = (ImageCtx *)ctx; - return librbd::api::Mirror<>::image_snapshot_create(ictx, snap_id); + return librbd::api::Mirror<>::image_snapshot_create(ictx, 0U, snap_id); } int Image::mirror_image_get_info(mirror_image_info_t *mirror_image_info, @@ -2986,6 +2986,17 @@ #pragma GCC diagnostic pop + int Image::aio_mirror_image_create_snapshot(uint32_t flags, uint64_t *snap_id, + RBD::AioCompletion *c) { + ImageCtx *ictx = (ImageCtx *)ctx; + + librbd::api::Mirror<>::image_snapshot_create( + ictx, flags, snap_id, new C_AioCompletion(ictx, + librbd::io::AIO_TYPE_GENERIC, + get_aio_completion(c))); + return 0; + } + int Image::update_watch(UpdateWatchCtx *wctx, uint64_t *handle) { ImageCtx *ictx = (ImageCtx *)ctx; tracepoint(librbd, update_watch_enter, ictx, wctx); @@ -6301,7 +6312,7 @@ uint64_t *snap_id) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; - return librbd::api::Mirror<>::image_snapshot_create(ictx, snap_id); + return librbd::api::Mirror<>::image_snapshot_create(ictx, 0U, snap_id); } extern "C" int rbd_mirror_image_get_info(rbd_image_t image, @@ -6497,6 +6508,20 @@ #pragma GCC diagnostic pop +extern "C" int rbd_aio_mirror_image_create_snapshot(rbd_image_t image, + uint32_t flags, + uint64_t *snap_id, + rbd_completion_t c) { + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; + + librbd::api::Mirror<>::image_snapshot_create( + ictx, flags, snap_id, new C_AioCompletion(ictx, + librbd::io::AIO_TYPE_GENERIC, + get_aio_completion(comp))); + return 0; +} + extern "C" int rbd_update_watch(rbd_image_t image, uint64_t *handle, rbd_update_callback_t watch_cb, void *arg) { diff -Nru ceph-15.2.8/src/librbd/mirror/GetStatusRequest.cc ceph-15.2.11/src/librbd/mirror/GetStatusRequest.cc --- ceph-15.2.8/src/librbd/mirror/GetStatusRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/mirror/GetStatusRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -50,8 +50,10 @@ ldout(cct, 20) << "r=" << r << dendl; if (r < 0) { - lderr(cct) << "failed to retrieve mirroring state: " << cpp_strerror(r) - << dendl; + if (r != -ENOENT) { + lderr(cct) << "failed to retrieve mirroring state: " << cpp_strerror(r) + << dendl; + } finish(r); return; } else if (m_mirror_image->state != cls::rbd::MIRROR_IMAGE_STATE_ENABLED) { diff -Nru ceph-15.2.8/src/librbd/mirror/snapshot/SetImageStateRequest.cc ceph-15.2.11/src/librbd/mirror/snapshot/SetImageStateRequest.cc --- ceph-15.2.8/src/librbd/mirror/snapshot/SetImageStateRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/mirror/snapshot/SetImageStateRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -27,6 +27,45 @@ template void SetImageStateRequest::send() { + get_name(); +} + +template +void SetImageStateRequest::get_name() { + CephContext *cct = m_image_ctx->cct; + ldout(cct, 15) << dendl; + + librados::ObjectReadOperation op; + cls_client::dir_get_name_start(&op, m_image_ctx->id); + + librados::AioCompletion *comp = create_rados_callback< + SetImageStateRequest, + &SetImageStateRequest::handle_get_name>(this); + m_bl.clear(); + int r = m_image_ctx->md_ctx.aio_operate(RBD_DIRECTORY, comp, &op, &m_bl); + ceph_assert(r == 0); + comp->release(); +} + +template +void SetImageStateRequest::handle_get_name(int r) { + CephContext *cct = m_image_ctx->cct; + ldout(cct, 15) << "r=" << r << dendl; + + if (r == 0) { + auto it = m_bl.cbegin(); + r = cls_client::dir_get_name_finish(&it, &m_image_state.name); + } + + if (r < 0) { + lderr(cct) << "failed to retrieve image name: " << cpp_strerror(r) + << dendl; + finish(r); + return; + } + + ldout(cct, 15) << "name=" << m_image_state.name << dendl; + get_snap_limit(); } @@ -99,7 +138,6 @@ { std::shared_lock image_locker{m_image_ctx->image_lock}; - m_image_state.name = m_image_ctx->name; m_image_state.features = m_image_ctx->features & ~RBD_FEATURES_IMPLICIT_ENABLE; diff -Nru ceph-15.2.8/src/librbd/mirror/snapshot/SetImageStateRequest.h ceph-15.2.11/src/librbd/mirror/snapshot/SetImageStateRequest.h --- ceph-15.2.8/src/librbd/mirror/snapshot/SetImageStateRequest.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/mirror/snapshot/SetImageStateRequest.h 2021-04-19 13:47:30.000000000 +0000 @@ -40,6 +40,9 @@ * * | * v + * GET_NAME + * | + * v * GET_SNAP_LIMIT * | * v @@ -66,6 +69,9 @@ bufferlist m_bl; bufferlist m_state_bl; + void get_name(); + void handle_get_name(int r); + void get_snap_limit(); void handle_get_snap_limit(int r); diff -Nru ceph-15.2.8/src/librbd/object_map/DiffRequest.cc ceph-15.2.11/src/librbd/object_map/DiffRequest.cc --- ceph-15.2.8/src/librbd/object_map/DiffRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/object_map/DiffRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -22,20 +22,34 @@ template void DiffRequest::send() { - std::shared_lock image_locker{m_image_ctx->image_lock}; + auto cct = m_image_ctx->cct; - m_diff_from_start = (m_snap_id_start == 0); - if (m_snap_id_start == 0) { - if (!m_image_ctx->snap_info.empty()) { - m_snap_id_start = m_image_ctx->snap_info.begin()->first; - } else { - m_snap_id_start = CEPH_NOSNAP; - } + if (m_snap_id_start == CEPH_NOSNAP || m_snap_id_start > m_snap_id_end) { + lderr(cct) << "invalid start/end snap ids: " + << "snap_id_start=" << m_snap_id_start << ", " + << "snap_id_end=" << m_snap_id_end << dendl; + finish(-EINVAL); + return; + } else if (m_snap_id_start == m_snap_id_end) { + // no delta between the same snapshot + finish(0); + return; } m_object_diff_state->clear(); - m_current_snap_id = m_snap_id_start; - m_next_snap_id = m_snap_id_end; + + // collect all the snap ids in the provided range (inclusive) + if (m_snap_id_start != 0) { + m_snap_ids.insert(m_snap_id_start); + } + + std::shared_lock image_locker{m_image_ctx->image_lock}; + auto snap_info_it = m_image_ctx->snap_info.upper_bound(m_snap_id_start); + auto snap_info_it_end = m_image_ctx->snap_info.lower_bound(m_snap_id_end); + for (; snap_info_it != snap_info_it_end; ++snap_info_it) { + m_snap_ids.insert(snap_info_it->first); + } + m_snap_ids.insert(m_snap_id_end); load_object_map(&image_locker); } @@ -45,24 +59,20 @@ std::shared_lock* image_locker) { ceph_assert(ceph_mutex_is_locked(m_image_ctx->image_lock)); - auto cct = m_image_ctx->cct; - ldout(cct, 10) << dendl; - - m_current_size = m_image_ctx->size; - if (m_current_snap_id != CEPH_NOSNAP) { - auto snap_it = m_image_ctx->snap_info.find(m_current_snap_id); - ceph_assert(snap_it != m_image_ctx->snap_info.end()); - m_current_size = snap_it->second.size; + if (m_snap_ids.empty()) { + image_locker->unlock(); - ++snap_it; - if (snap_it != m_image_ctx->snap_info.end()) { - m_next_snap_id = snap_it->first; - } else { - m_next_snap_id = CEPH_NOSNAP; - } + finish(0); + return; } - if ((m_image_ctx->features & RBD_FEATURE_FAST_DIFF) != 0) { + m_current_snap_id = *m_snap_ids.begin(); + m_snap_ids.erase(m_current_snap_id); + + auto cct = m_image_ctx->cct; + ldout(cct, 10) << "snap_id=" << m_current_snap_id << dendl; + + if ((m_image_ctx->features & RBD_FEATURE_FAST_DIFF) == 0) { image_locker->unlock(); ldout(cct, 10) << "fast-diff feature not enabled" << dendl; @@ -70,6 +80,32 @@ return; } + // ignore ENOENT with intermediate snapshots since deleted + // snaps will get merged with later snapshots + m_ignore_enoent = (m_current_snap_id != m_snap_id_start && + m_current_snap_id != m_snap_id_end); + + if (m_current_snap_id == CEPH_NOSNAP) { + m_current_size = m_image_ctx->size; + } else { + auto snap_it = m_image_ctx->snap_info.find(m_current_snap_id); + if (snap_it == m_image_ctx->snap_info.end()) { + ldout(cct, 10) << "snapshot " << m_current_snap_id << " does not exist" + << dendl; + if (!m_ignore_enoent) { + image_locker->unlock(); + + finish(-ENOENT); + return; + } + + load_object_map(image_locker); + return; + } + + m_current_size = snap_it->second.size; + } + uint64_t flags = 0; int r = m_image_ctx->get_flags(m_current_snap_id, &flags); if (r < 0) { @@ -80,9 +116,9 @@ finish(r); return; } - if ((flags & RBD_FLAG_FAST_DIFF_INVALID) != 0) { - image_locker->unlock(); + image_locker->unlock(); + if ((flags & RBD_FLAG_FAST_DIFF_INVALID) != 0) { ldout(cct, 1) << "cannot perform fast diff on invalid object map" << dendl; finish(-EINVAL); @@ -115,7 +151,13 @@ std::string oid(ObjectMap<>::object_map_name(m_image_ctx->id, m_current_snap_id)); - if (r < 0) { + if (r == -ENOENT && m_ignore_enoent) { + ldout(cct, 10) << "object map " << oid << " does not exist" << dendl; + + std::shared_lock image_locker{m_image_ctx->image_lock}; + load_object_map(&image_locker); + return; + } else if (r < 0) { lderr(cct) << "failed to load object map: " << oid << dendl; finish(r); return; @@ -133,63 +175,67 @@ m_object_map.resize(num_objs); } - if (m_object_diff_state->size() < num_objs) { + size_t prev_object_diff_state_size = m_object_diff_state->size(); + if (prev_object_diff_state_size < num_objs) { // the diff state should be the largest of all snapshots in the set m_object_diff_state->resize(num_objs); } if (m_object_map.size() < m_object_diff_state->size()) { // the image was shrunk so expanding the object map will flag end objects // as non-existent and they will be compared against the previous object - // map + // diff state m_object_map.resize(m_object_diff_state->size()); } - uint64_t overlap = std::min(m_object_map.size(), m_prev_object_map.size()); + uint64_t overlap = std::min(m_object_map.size(), prev_object_diff_state_size); auto it = m_object_map.begin(); auto overlap_end_it = it + overlap; - auto pre_it = m_prev_object_map.begin(); auto diff_it = m_object_diff_state->begin(); uint64_t i = 0; - for (; it != overlap_end_it; ++it, ++pre_it, ++diff_it, ++i) { - ldout(cct, 20) << "object state: " << i << " " - << static_cast(*pre_it) - << "->" << static_cast(*it) << dendl; - if (*it == OBJECT_NONEXISTENT) { - if (*pre_it != OBJECT_NONEXISTENT) { - *diff_it = DIFF_STATE_HOLE; - } - } else if (*it == OBJECT_EXISTS || - (*pre_it != *it && - !(*pre_it == OBJECT_EXISTS && - *it == OBJECT_EXISTS_CLEAN))) { - *diff_it = DIFF_STATE_UPDATED; + for (; it != overlap_end_it; ++it, ++diff_it, ++i) { + uint8_t object_map_state = *it; + uint8_t prev_object_diff_state = *diff_it; + if (object_map_state == OBJECT_EXISTS || + object_map_state == OBJECT_PENDING || + (object_map_state == OBJECT_EXISTS_CLEAN && + prev_object_diff_state != DIFF_STATE_DATA && + prev_object_diff_state != DIFF_STATE_DATA_UPDATED)) { + *diff_it = DIFF_STATE_DATA_UPDATED; + } else if (object_map_state == OBJECT_NONEXISTENT && + prev_object_diff_state != DIFF_STATE_HOLE && + prev_object_diff_state != DIFF_STATE_HOLE_UPDATED) { + *diff_it = DIFF_STATE_HOLE_UPDATED; } + + ldout(cct, 20) << "object state: " << i << " " + << static_cast(prev_object_diff_state) + << "->" << static_cast(*diff_it) << " (" + << static_cast(object_map_state) << ")" + << dendl; } ldout(cct, 20) << "computed overlap diffs" << dendl; + bool diff_from_start = (m_snap_id_start == 0); auto end_it = m_object_map.end(); - if (m_object_map.size() > m_prev_object_map.size() && - (m_diff_from_start || m_prev_object_map_valid)) { + if (m_object_map.size() > prev_object_diff_state_size) { for (; it != end_it; ++it,++diff_it, ++i) { - ldout(cct, 20) << "object state: " << i << " " - << "->" << static_cast(*it) << dendl; - if (*it == OBJECT_NONEXISTENT) { - *diff_it = DIFF_STATE_NONE; + uint8_t object_map_state = *it; + if (object_map_state == OBJECT_NONEXISTENT) { + *diff_it = DIFF_STATE_HOLE; + } else if (diff_from_start || object_map_state != OBJECT_EXISTS_CLEAN) { + *diff_it = DIFF_STATE_DATA_UPDATED; } else { - *diff_it = DIFF_STATE_UPDATED; + *diff_it = DIFF_STATE_DATA; } + + ldout(cct, 20) << "object state: " << i << " " + << "->" << static_cast(*diff_it) << " (" + << static_cast(*it) << ")" << dendl; } } ldout(cct, 20) << "computed resize diffs" << dendl; - if (m_current_snap_id == m_next_snap_id || m_next_snap_id > m_snap_id_end) { - finish(0); - return; - } - - m_current_snap_id = m_next_snap_id; - m_prev_object_map = m_object_map; - m_prev_object_map_valid = true; + m_object_diff_state_valid = true; std::shared_lock image_locker{m_image_ctx->image_lock}; load_object_map(&image_locker); diff -Nru ceph-15.2.8/src/librbd/object_map/DiffRequest.h ceph-15.2.11/src/librbd/object_map/DiffRequest.h --- ceph-15.2.8/src/librbd/object_map/DiffRequest.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/object_map/DiffRequest.h 2021-04-19 13:47:30.000000000 +0000 @@ -8,6 +8,7 @@ #include "common/bit_vector.hpp" #include "common/ceph_mutex.h" #include "librbd/object_map/Types.h" +#include struct Context; @@ -60,15 +61,14 @@ BitVector<2>* m_object_diff_state; Context* m_on_finish; - bool m_diff_from_start = false; + std::set m_snap_ids; uint64_t m_current_snap_id = 0; - uint64_t m_next_snap_id = 0; + bool m_ignore_enoent = false; uint64_t m_current_size = 0; BitVector<2> m_object_map; - BitVector<2> m_prev_object_map; - bool m_prev_object_map_valid = false; + bool m_object_diff_state_valid = false; bufferlist m_out_bl; diff -Nru ceph-15.2.8/src/librbd/object_map/Types.h ceph-15.2.11/src/librbd/object_map/Types.h --- ceph-15.2.8/src/librbd/object_map/Types.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/object_map/Types.h 2021-04-19 13:47:30.000000000 +0000 @@ -8,9 +8,10 @@ namespace object_map { enum DiffState { - DIFF_STATE_NONE = 0, - DIFF_STATE_UPDATED = 1, - DIFF_STATE_HOLE = 2 + DIFF_STATE_HOLE = 0, /* unchanged hole */ + DIFF_STATE_DATA = 1, /* unchanged data */ + DIFF_STATE_HOLE_UPDATED = 2, /* new hole */ + DIFF_STATE_DATA_UPDATED = 3 /* new data */ }; } // namespace object_map diff -Nru ceph-15.2.8/src/librbd/operation/DisableFeaturesRequest.cc ceph-15.2.11/src/librbd/operation/DisableFeaturesRequest.cc --- ceph-15.2.8/src/librbd/operation/DisableFeaturesRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/operation/DisableFeaturesRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -305,15 +305,20 @@ return handle_finish(*result); } - if ((mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) && !m_force) { - lderr(cct) << "cannot disable journaling: image mirroring " + if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED && + mirror_image.mode == cls::rbd::MIRROR_IMAGE_MODE_JOURNAL && !m_force) { + lderr(cct) << "cannot disable journaling: journal-based mirroring " << "enabled and mirror pool mode set to image" << dendl; *result = -EINVAL; return handle_finish(*result); } - send_disable_mirror_image(); + if (mirror_image.mode != cls::rbd::MIRROR_IMAGE_MODE_JOURNAL) { + send_close_journal(); + } else { + send_disable_mirror_image(); + } return nullptr; } diff -Nru ceph-15.2.8/src/librbd/operation/MigrateRequest.cc ceph-15.2.11/src/librbd/operation/MigrateRequest.cc --- ceph-15.2.8/src/librbd/operation/MigrateRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/operation/MigrateRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -128,9 +128,14 @@ } else { ceph_assert(image_ctx.parent != nullptr); + uint32_t flags = deep_copy::OBJECT_COPY_REQUEST_FLAG_MIGRATION; + if (image_ctx.migration_info.flatten) { + flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + auto req = deep_copy::ObjectCopyRequest::create( image_ctx.parent, &image_ctx, 0, 0, image_ctx.migration_info.snap_map, - m_object_no, image_ctx.migration_info.flatten, nullptr, ctx); + m_object_no, flags, nullptr, ctx); ldout(cct, 20) << "deep copy object req " << req << ", object_no " << m_object_no << dendl; diff -Nru ceph-15.2.8/src/librbd/operation/RenameRequest.cc ceph-15.2.11/src/librbd/operation/RenameRequest.cc --- ceph-15.2.8/src/librbd/operation/RenameRequest.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/operation/RenameRequest.cc 2021-04-19 13:47:30.000000000 +0000 @@ -22,6 +22,9 @@ std::ostream& operator<<(std::ostream& os, const typename RenameRequest::State& state) { switch(state) { + case RenameRequest::STATE_READ_DIRECTORY: + os << "READ_DIRECTORY"; + break; case RenameRequest::STATE_READ_SOURCE_HEADER: os << "READ_SOURCE_HEADER"; break; @@ -55,7 +58,12 @@ template void RenameRequest::send_op() { - send_read_source_header(); + I &image_ctx = this->m_image_ctx; + if (image_ctx.old_format) { + send_read_source_header(); + return; + } + send_read_directory(); } template @@ -74,7 +82,24 @@ return true; } - if (m_state == STATE_UPDATE_DIRECTORY) { + if (m_state == STATE_READ_DIRECTORY) { + std::string name; + auto it = m_source_name_bl.cbegin(); + r = cls_client::dir_get_name_finish(&it, &name); + if (r < 0) { + lderr(cct) << "could not read directory: " << cpp_strerror(r) << dendl; + return true; + } + bool update = false; + { + std::shared_lock image_locker{image_ctx.image_lock}; + update = image_ctx.name != name; + } + if (update) { + image_ctx.set_image_name(name); + m_source_oid = util::id_obj_name(name); + } + } else if (m_state == STATE_UPDATE_DIRECTORY) { // update in-memory name before removing source header apply(); } else if (m_state == STATE_REMOVE_SOURCE_HEADER) { @@ -83,6 +108,9 @@ std::shared_lock owner_lock{image_ctx.owner_lock}; switch (m_state) { + case STATE_READ_DIRECTORY: + send_read_source_header(); + break; case STATE_READ_SOURCE_HEADER: send_write_destination_header(); break; @@ -121,6 +149,23 @@ } template +void RenameRequest::send_read_directory() { + I &image_ctx = this->m_image_ctx; + CephContext *cct = image_ctx.cct; + ldout(cct, 5) << this << " " << __func__ << dendl; + m_state = STATE_READ_DIRECTORY; + + librados::ObjectReadOperation op; + cls_client::dir_get_name_start(&op, image_ctx.id); + + auto comp = this->create_callback_completion(); + int r = image_ctx.md_ctx.aio_operate(RBD_DIRECTORY, comp, &op, + &m_source_name_bl); + ceph_assert(r == 0); + comp->release(); +} + +template void RenameRequest::send_read_source_header() { I &image_ctx = this->m_image_ctx; CephContext *cct = image_ctx.cct; diff -Nru ceph-15.2.8/src/librbd/operation/RenameRequest.h ceph-15.2.11/src/librbd/operation/RenameRequest.h --- ceph-15.2.8/src/librbd/operation/RenameRequest.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/operation/RenameRequest.h 2021-04-19 13:47:30.000000000 +0000 @@ -27,6 +27,9 @@ * * | * v + * STATE_READ_DIRECTORY + * | + * v * STATE_READ_SOURCE_HEADER * | * v @@ -45,6 +48,7 @@ * */ enum State { + STATE_READ_DIRECTORY, STATE_READ_SOURCE_HEADER, STATE_WRITE_DEST_HEADER, STATE_UPDATE_DIRECTORY, @@ -69,10 +73,12 @@ std::string m_source_oid; std::string m_dest_oid; - State m_state = STATE_READ_SOURCE_HEADER; + State m_state = STATE_READ_DIRECTORY; + bufferlist m_source_name_bl; bufferlist m_header_bl; + void send_read_directory(); void send_read_source_header(); void send_write_destination_header(); void send_update_directory(); diff -Nru ceph-15.2.8/src/librbd/Operations.cc ceph-15.2.11/src/librbd/Operations.cc --- ceph-15.2.8/src/librbd/Operations.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/librbd/Operations.cc 2021-04-19 13:47:30.000000000 +0000 @@ -537,29 +537,16 @@ return -EEXIST; } - if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) { - r = invoke_async_request("rename", - exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, - true, - boost::bind(&Operations::execute_rename, this, - dstname, _1), - boost::bind(&ImageWatcher::notify_rename, - m_image_ctx.image_watcher, dstname, - _1)); - if (r < 0 && r != -EEXIST) { - return r; - } - } else { - C_SaferCond cond_ctx; - { - std::shared_lock owner_lock{m_image_ctx.owner_lock}; - execute_rename(dstname, &cond_ctx); - } - - r = cond_ctx.wait(); - if (r < 0) { - return r; - } + r = invoke_async_request("rename", + exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, + true, + boost::bind(&Operations::execute_rename, this, + dstname, _1), + boost::bind(&ImageWatcher::notify_rename, + m_image_ctx.image_watcher, dstname, + _1)); + if (r < 0 && r != -EEXIST) { + return r; } m_image_ctx.set_image_name(dstname); @@ -580,19 +567,19 @@ return; } - m_image_ctx.image_lock.lock_shared(); - if (m_image_ctx.name == dest_name) { - m_image_ctx.image_lock.unlock_shared(); - on_finish->complete(-EEXIST); - return; - } - m_image_ctx.image_lock.unlock_shared(); - CephContext *cct = m_image_ctx.cct; ldout(cct, 5) << this << " " << __func__ << ": dest_name=" << dest_name << dendl; if (m_image_ctx.old_format) { + m_image_ctx.image_lock.lock_shared(); + if (m_image_ctx.name == dest_name) { + m_image_ctx.image_lock.unlock_shared(); + on_finish->complete(-EEXIST); + return; + } + m_image_ctx.image_lock.unlock_shared(); + // unregister watch before and register back after rename on_finish = new C_NotifyUpdate(m_image_ctx, on_finish); on_finish = new LambdaContext([this, on_finish](int r) { diff -Nru ceph-15.2.8/src/mds/CInode.cc ceph-15.2.11/src/mds/CInode.cc --- ceph-15.2.8/src/mds/CInode.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/CInode.cc 2021-04-19 13:47:30.000000000 +0000 @@ -617,18 +617,20 @@ } } -void CInode::record_snaprealm_parent_dentry(sr_t *new_snap, SnapRealm *newparent, +void CInode::record_snaprealm_parent_dentry(sr_t *new_snap, SnapRealm *oldparent, CDentry *dn, bool primary_dn) { ceph_assert(new_snap->is_parent_global()); - SnapRealm *oldparent = dn->get_dir()->inode->find_snaprealm(); + + if (!oldparent) + oldparent = dn->get_dir()->inode->find_snaprealm(); auto& snaps = oldparent->get_snaps(); if (!primary_dn) { auto p = snaps.lower_bound(dn->first); if (p != snaps.end()) new_snap->past_parent_snaps.insert(p, snaps.end()); - } else if (newparent != oldparent) { + } else { // 'last_destroyed' is used as 'current_parent_since' auto p = snaps.lower_bound(new_snap->last_destroyed); if (p != snaps.end()) diff -Nru ceph-15.2.8/src/mds/MDCache.cc ceph-15.2.11/src/mds/MDCache.cc --- ceph-15.2.8/src/mds/MDCache.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/MDCache.cc 2021-04-19 13:47:30.000000000 +0000 @@ -11995,6 +11995,7 @@ for (const auto& dir : info.resultfrags) { dout(10) << " storing result frag " << *dir << dendl; + dir->mark_dirty(dir->pre_dirty(), mdr->ls); dir->mark_new(mdr->ls); // freeze and store them too diff -Nru ceph-15.2.8/src/mds/MDSDaemon.cc ceph-15.2.11/src/mds/MDSDaemon.cc --- ceph-15.2.8/src/mds/MDSDaemon.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/MDSDaemon.cc 2021-04-19 13:47:30.000000000 +0000 @@ -333,11 +333,15 @@ asok_hook, "dump snapshots"); ceph_assert(r == 0); - r = admin_socket->register_command("session ls name=filters,type=CephString,n=N,req=false", + r = admin_socket->register_command("session ls " + "name=cap_dump,type=CephBool,req=false " + "name=filters,type=CephString,n=N,req=false ", asok_hook, "List client sessions based on a filter"); ceph_assert(r == 0); - r = admin_socket->register_command("client ls name=filters,type=CephString,n=N,req=false", + r = admin_socket->register_command("client ls " + "name=cap_dump,type=CephBool,req=false " + "name=filters,type=CephString,n=N,req=false ", asok_hook, "List client sessions based on a filter"); ceph_assert(r == 0); @@ -353,7 +357,7 @@ asok_hook, "Evict a client session by id"); ceph_assert(r == 0); - r = admin_socket->register_command("session ls", + r = admin_socket->register_command("session ls name=cap_dump,type=CephBool,req=false", asok_hook, "Enumerate connected CephFS clients"); ceph_assert(r == 0); diff -Nru ceph-15.2.8/src/mds/MDSRank.cc ceph-15.2.11/src/mds/MDSRank.cc --- ceph-15.2.8/src/mds/MDSRank.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/MDSRank.cc 2021-04-19 13:47:30.000000000 +0000 @@ -1953,7 +1953,6 @@ { dout(1) << "clientreplay_start" << dendl; finish_contexts(g_ceph_context, waiting_for_replay); // kick waiters - mdcache->start_files_to_recover(); queue_one_replay(); } @@ -2006,7 +2005,6 @@ mdcache->clean_open_file_lists(); mdcache->export_remaining_imported_caps(); finish_contexts(g_ceph_context, waiting_for_replay); // kick waiters - mdcache->start_files_to_recover(); mdcache->reissue_all_caps(); @@ -2023,7 +2021,7 @@ mdcache->start_recovered_truncates(); mdcache->start_purge_inodes(); - mdcache->do_file_recover(); + mdcache->start_files_to_recover(); // tell connected clients //bcast_mds_map(); // not anymore, they get this from the monitor @@ -2506,14 +2504,17 @@ } else if (command == "session ls" || command == "client ls") { std::lock_guard l(mds_lock); + bool cap_dump = false; std::vector filter_args; + cmd_getval(cmdmap, "cap_dump", cap_dump); cmd_getval(cmdmap, "filters", filter_args); + SessionFilter filter; r = filter.parse(filter_args, &ss); if (r != 0) { goto out; } - dump_sessions(filter, f); + dump_sessions(filter, f, cap_dump); } else if (command == "session evict" || command == "client evict") { std::lock_guard l(mds_lock); @@ -2772,7 +2773,7 @@ gather.activate(); } -void MDSRankDispatcher::dump_sessions(const SessionFilter &filter, Formatter *f) const +void MDSRankDispatcher::dump_sessions(const SessionFilter &filter, Formatter *f, bool cap_dump) const { // Dump sessions, decorated with recovery/replay status f->open_array_section("sessions"); @@ -2785,7 +2786,9 @@ continue; } - f->dump_object("session", *s); + f->open_object_section("session"); + s->dump(f, cap_dump); + f->close_section(); } f->close_section(); // sessions } @@ -3573,6 +3576,11 @@ "mds_recall_warning_decay_rate", "mds_request_load_average_decay_rate", "mds_session_cache_liveness_decay_rate", + "mds_session_cap_acquisition_decay_rate", + "mds_max_caps_per_client", + "mds_session_cap_acquisition_throttle", + "mds_session_max_caps_throttle_ratio", + "mds_cap_acquisition_throttle_retry_request_time", NULL }; return KEYS; diff -Nru ceph-15.2.8/src/mds/MDSRank.h ceph-15.2.11/src/mds/MDSRank.h --- ceph-15.2.8/src/mds/MDSRank.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/MDSRank.h 2021-04-19 13:47:30.000000000 +0000 @@ -648,7 +648,7 @@ const char** get_tracked_conf_keys() const override final; void handle_conf_change(const ConfigProxy& conf, const std::set& changed) override; - void dump_sessions(const SessionFilter &filter, Formatter *f) const; + void dump_sessions(const SessionFilter &filter, Formatter *f, bool cap_dump=false) const; void evict_clients(const SessionFilter &filter, std::function on_finish); diff -Nru ceph-15.2.8/src/mds/Server.cc ceph-15.2.11/src/mds/Server.cc --- ceph-15.2.8/src/mds/Server.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/Server.cc 2021-04-19 13:47:30.000000000 +0000 @@ -171,6 +171,9 @@ PerfCountersBuilder::PRIO_INTERESTING); plb.add_u64_counter(l_mdss_cap_revoke_eviction, "cap_revoke_eviction", "Cap Revoke Client Eviction", "cre", PerfCountersBuilder::PRIO_INTERESTING); + plb.add_u64_counter(l_mdss_cap_acquisition_throttle, + "cap_acquisition_throttle", "Cap acquisition throttle counter", "cat", + PerfCountersBuilder::PRIO_INTERESTING); // fop latencies are useful plb.set_prio_default(PerfCountersBuilder::PRIO_USEFUL); @@ -251,6 +254,10 @@ cap_revoke_eviction_timeout = g_conf().get_val("mds_cap_revoke_eviction_timeout"); max_snaps_per_dir = g_conf().get_val("mds_max_snaps_per_dir"); delegate_inos_pct = g_conf().get_val("mds_client_delegate_inos_pct"); + max_caps_per_client = g_conf().get_val("mds_max_caps_per_client"); + cap_acquisition_throttle = g_conf().get_val("mds_session_cap_acquisition_throttle"); + max_caps_throttle_ratio = g_conf().get_val("mds_session_max_caps_throttle_ratio"); + caps_throttle_retry_request_timeout = g_conf().get_val("mds_cap_acquisition_throttle_retry_request_timeout"); supported_features = feature_bitset_t(CEPHFS_FEATURES_MDS_SUPPORTED); } @@ -1192,6 +1199,18 @@ if (changed.count("mds_client_delegate_inos_pct")) { delegate_inos_pct = g_conf().get_val("mds_client_delegate_inos_pct"); } + if (changed.count("mds_max_caps_per_client")) { + max_caps_per_client = g_conf().get_val("mds_max_caps_per_client"); + } + if (changed.count("mds_session_cap_acquisition_throttle")) { + cap_acquisition_throttle = g_conf().get_val("mds_session_cap_acquisition_throttle"); + } + if (changed.count("mds_session_max_caps_throttle_ratio")) { + max_caps_throttle_ratio = g_conf().get_val("mds_session_max_caps_throttle_ratio"); + } + if (changed.count("mds_cap_acquisition_throttle_retry_request_timeout")) { + caps_throttle_retry_request_timeout = g_conf().get_val("mds_cap_acquisition_throttle_retry_request_timeout"); + } } /* @@ -4425,6 +4444,7 @@ void Server::handle_client_readdir(MDRequestRef& mdr) { const cref_t &req = mdr->client_request; + Session *session = mds->get_session(req); client_t client = req->get_source().num(); MutationImpl::LockOpVec lov; CInode *diri = rdlock_path_pin_ref(mdr, false, true); @@ -4438,6 +4458,19 @@ return; } + auto num_caps = session->get_num_caps(); + auto session_cap_acquisition = session->get_cap_acquisition(); + + if (num_caps > static_cast(max_caps_per_client * max_caps_throttle_ratio) && session_cap_acquisition >= cap_acquisition_throttle) { + dout(20) << "readdir throttled. max_caps_per_client: " << max_caps_per_client << " num_caps: " << num_caps + << " session_cap_acquistion: " << session_cap_acquisition << " cap_acquisition_throttle: " << cap_acquisition_throttle << dendl; + if (logger) + logger->inc(l_mdss_cap_acquisition_throttle); + + mds->timer.add_event_after(caps_throttle_retry_request_timeout, new C_MDS_RetryRequest(mdcache, mdr)); + return; + } + lov.add_rdlock(&diri->filelock); lov.add_rdlock(&diri->dirfragtreelock); @@ -4636,6 +4669,8 @@ mdcache->lru.lru_touch(dn); } + session->touch_readdir_cap(numfiles); + __u16 flags = 0; if (end) { flags = CEPH_READDIR_FRAG_END; @@ -4679,15 +4714,17 @@ */ class C_MDS_inode_update_finish : public ServerLogContext { CInode *in; - bool truncating_smaller, changed_ranges, new_realm; + bool truncating_smaller, changed_ranges, adjust_realm; public: C_MDS_inode_update_finish(Server *s, MDRequestRef& r, CInode *i, - bool sm=false, bool cr=false, bool nr=false) : + bool sm=false, bool cr=false, bool ar=false) : ServerLogContext(s, r), in(i), - truncating_smaller(sm), changed_ranges(cr), new_realm(nr) { } + truncating_smaller(sm), changed_ranges(cr), adjust_realm(ar) { } void finish(int r) override { ceph_assert(r == 0); + int snap_op = (in->snaprealm ? CEPH_SNAP_OP_UPDATE : CEPH_SNAP_OP_SPLIT); + // apply in->pop_and_dirty_projected_inode(mdr->ls); mdr->apply(); @@ -4700,10 +4737,9 @@ mds->mdcache->truncate_inode(in, mdr->ls); } - if (new_realm) { - int op = CEPH_SNAP_OP_SPLIT; - mds->mdcache->send_snap_update(in, 0, op); - mds->mdcache->do_realm_invalidate_and_update_notify(in, op); + if (adjust_realm) { + mds->mdcache->send_snap_update(in, 0, snap_op); + mds->mdcache->do_realm_invalidate_and_update_notify(in, snap_op); } get_mds()->balancer->hit_inode(in, META_POP_IWR); @@ -5498,7 +5534,7 @@ return; } - bool new_realm = false; + bool adjust_realm = false; if (name.compare(0, 15, "ceph.dir.layout") == 0) { if (!cur->is_dir()) { respond_to_request(mdr, -EINVAL); @@ -5565,26 +5601,72 @@ } if (quota.is_enable() && !cur->get_projected_srnode()) - new_realm = true; + adjust_realm = true; + + if (!xlock_policylock(mdr, cur, false, adjust_realm)) + return; - if (!xlock_policylock(mdr, cur, false, new_realm)) + if (cur->get_projected_inode()->quota == quota) { + respond_to_request(mdr, 0); return; + } - auto &pi = cur->project_inode(false, new_realm); + auto &pi = cur->project_inode(false, adjust_realm); pi.inode.quota = quota; - if (new_realm) { - SnapRealm *realm = cur->find_snaprealm(); - auto seq = realm->get_newest_seq(); - auto &newsnap = *pi.snapnode; - newsnap.created = seq; - newsnap.seq = seq; - } + if (adjust_realm) + pi.snapnode->created = pi.snapnode->seq = cur->find_snaprealm()->get_newest_seq(); + mdr->no_early_reply = true; pip = &pi.inode; client_t exclude_ct = mdr->get_client(); mdcache->broadcast_quota_to_client(cur, exclude_ct, true); + } else if (name == "ceph.dir.subvolume"sv) { + if (!cur->is_dir()) { + respond_to_request(mdr, -EINVAL); + return; + } + + bool val; + try { + val = boost::lexical_cast(value); + } catch (boost::bad_lexical_cast const&) { + dout(10) << "bad vxattr value, unable to parse bool for " << name << dendl; + respond_to_request(mdr, -EINVAL); + return; + } + + if (!xlock_policylock(mdr, cur, false, true)) + return; + + SnapRealm *realm = cur->find_snaprealm(); + if (val) { + inodeno_t subvol_ino = realm->get_subvolume_ino(); + // can't create subvolume inside another subvolume + if (subvol_ino && subvol_ino != cur->ino()) { + respond_to_request(mdr, -EINVAL); + return; + } + } + + const auto srnode = cur->get_projected_srnode(); + if (val == (srnode && srnode->is_subvolume())) { + respond_to_request(mdr, 0); + return; + } + + auto& pi = cur->project_inode(false, true); + if (!srnode) + pi.snapnode->created = pi.snapnode->seq = realm->get_newest_seq(); + if (val) + pi.snapnode->mark_subvolume(); + else + pi.snapnode->clear_subvolume(); + + mdr->no_early_reply = true; + pip = &pi.inode; + adjust_realm = true; } else if (name == "ceph.dir.pin"sv) { if (!cur->is_dir() || cur->is_root()) { respond_to_request(mdr, -EINVAL); @@ -5680,7 +5762,7 @@ mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur); journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(this, mdr, cur, - false, false, new_realm)); + false, false, adjust_realm)); return; } @@ -6293,12 +6375,22 @@ return; } + CInode* target_pin = targeti->get_projected_parent_dir()->inode; + SnapRealm *target_realm = target_pin->find_snaprealm(); + if (target_pin != dir->inode && + target_realm->get_subvolume_ino() != + dir->inode->find_snaprealm()->get_subvolume_ino()) { + dout(7) << "target is in different subvolume, failing..." << dendl; + respond_to_request(mdr, -EXDEV); + return; + } + // go! ceph_assert(g_conf()->mds_kill_link_at != 1); // local or remote? if (targeti->is_auth()) - _link_local(mdr, destdn, targeti); + _link_local(mdr, destdn, targeti, target_realm); else _link_remote(mdr, true, destdn, targeti); mds->balancer->maybe_fragment(dir, false); @@ -6323,7 +6415,7 @@ }; -void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti) +void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti, SnapRealm *target_realm) { dout(10) << "_link_local " << *dn << " to " << *targeti << dendl; @@ -6343,10 +6435,10 @@ pi.inode.version = tipv; bool adjust_realm = false; - if (!targeti->is_projected_snaprealm_global()) { + if (!target_realm->get_subvolume_ino() && !targeti->is_projected_snaprealm_global()) { sr_t *newsnap = targeti->project_snaprealm(); targeti->mark_snaprealm_global(newsnap); - targeti->record_snaprealm_parent_dentry(newsnap, NULL, targeti->get_projected_parent_dn(), true); + targeti->record_snaprealm_parent_dentry(newsnap, target_realm, targeti->get_projected_parent_dn(), true); adjust_realm = true; } @@ -6600,10 +6692,13 @@ if (mdr->slave_request->get_op() == MMDSSlaveRequest::OP_LINKPREP) { inc = true; pi.inode.nlink++; - if (!targeti->is_projected_snaprealm_global()) { + + CDentry *target_pdn = targeti->get_projected_parent_dn(); + SnapRealm *target_realm = target_pdn->get_dir()->inode->find_snaprealm(); + if (!target_realm->get_subvolume_ino() && !targeti->is_projected_snaprealm_global()) { sr_t *newsnap = targeti->project_snaprealm(); targeti->mark_snaprealm_global(newsnap); - targeti->record_snaprealm_parent_dentry(newsnap, NULL, targeti->get_projected_parent_dn(), true); + targeti->record_snaprealm_parent_dentry(newsnap, target_realm, target_pdn, true); adjust_realm = true; realm_projected = true; } @@ -6986,7 +7081,7 @@ if (!mdr->more()->desti_srnode) { if (in->is_projected_snaprealm_global()) { sr_t *new_srnode = in->prepare_new_srnode(0); - in->record_snaprealm_parent_dentry(new_srnode, NULL, dn, dnl->is_primary()); + in->record_snaprealm_parent_dentry(new_srnode, nullptr, dn, dnl->is_primary()); // dropping the last linkage or dropping the last remote linkage, // detch the inode from global snaprealm auto nlink = in->get_projected_inode()->nlink; @@ -7844,6 +7939,21 @@ } */ + SnapRealm *dest_realm = nullptr; + SnapRealm *src_realm = nullptr; + if (!linkmerge) { + dest_realm = destdir->inode->find_snaprealm(); + if (srcdir->inode == destdir->inode) + src_realm = dest_realm; + else + src_realm = srcdir->inode->find_snaprealm(); + if (src_realm != dest_realm && + src_realm->get_subvolume_ino() != dest_realm->get_subvolume_ino()) { + respond_to_request(mdr, -EXDEV); + return; + } + } + ceph_assert(g_conf()->mds_kill_rename_at != 1); // -- open all srcdn inode frags, if any -- @@ -7874,7 +7984,7 @@ srci->get_projected_inode()->nlink == 1 && srci->is_projected_snaprealm_global()) { sr_t *new_srnode = srci->prepare_new_srnode(0); - srci->record_snaprealm_parent_dentry(new_srnode, NULL, destdn, false); + srci->record_snaprealm_parent_dentry(new_srnode, nullptr, destdn, false); srci->clear_snaprealm_global(new_srnode); mdr->more()->srci_srnode = new_srnode; @@ -7883,7 +7993,7 @@ if (oldin && !mdr->more()->desti_srnode) { if (oldin->is_projected_snaprealm_global()) { sr_t *new_srnode = oldin->prepare_new_srnode(0); - oldin->record_snaprealm_parent_dentry(new_srnode, NULL, destdn, destdnl->is_primary()); + oldin->record_snaprealm_parent_dentry(new_srnode, dest_realm, destdn, destdnl->is_primary()); // dropping the last linkage or dropping the last remote linkage, // detch the inode from global snaprealm auto nlink = oldin->get_projected_inode()->nlink; @@ -7893,7 +8003,6 @@ oldin->clear_snaprealm_global(new_srnode); mdr->more()->desti_srnode = new_srnode; } else if (destdnl->is_primary()) { - SnapRealm *dest_realm = destdir->inode->find_snaprealm(); snapid_t follows = dest_realm->get_newest_seq(); if (oldin->snaprealm || follows + 1 > oldin->get_oldest_snap()) { sr_t *new_srnode = oldin->prepare_new_srnode(follows); @@ -7903,13 +8012,11 @@ } } if (!mdr->more()->srci_srnode) { - SnapRealm *dest_realm = destdir->inode->find_snaprealm(); if (srci->is_projected_snaprealm_global()) { sr_t *new_srnode = srci->prepare_new_srnode(0); - srci->record_snaprealm_parent_dentry(new_srnode, dest_realm, srcdn, srcdnl->is_primary()); + srci->record_snaprealm_parent_dentry(new_srnode, src_realm, srcdn, srcdnl->is_primary()); mdr->more()->srci_srnode = new_srnode; } else if (srcdnl->is_primary()) { - SnapRealm *src_realm = srcdir->inode->find_snaprealm(); snapid_t follows = src_realm->get_newest_seq(); if (src_realm != dest_realm && (srci->snaprealm || follows + 1 > srci->get_oldest_snap())) { @@ -9878,6 +9985,12 @@ if (!check_access(mdr, diri, MAY_WRITE|MAY_SNAPSHOT)) return; + if (inodeno_t subvol_ino = diri->find_snaprealm()->get_subvolume_ino(); + (subvol_ino && subvol_ino != diri->ino())) { + respond_to_request(mdr, -EPERM); + return; + } + // check if we can create any more snapshots // we don't allow any more if we are already at or beyond the limit if (diri->snaprealm && diff -Nru ceph-15.2.8/src/mds/Server.h ceph-15.2.11/src/mds/Server.h --- ceph-15.2.8/src/mds/Server.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/Server.h 2021-04-19 13:47:30.000000000 +0000 @@ -77,6 +77,7 @@ l_mdss_req_symlink_latency, l_mdss_req_unlink_latency, l_mdss_cap_revoke_eviction, + l_mdss_cap_acquisition_throttle, l_mdss_last, }; @@ -233,7 +234,7 @@ // link void handle_client_link(MDRequestRef& mdr); - void _link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti); + void _link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti, SnapRealm *target_realm); void _link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti, version_t, version_t, bool); @@ -348,6 +349,12 @@ DecayCounter recall_throttle; time last_recall_state; + + // Cache cap acquisition throttle configs + uint64_t max_caps_per_client; + uint64_t cap_acquisition_throttle; + double max_caps_throttle_ratio; + double caps_throttle_retry_request_timeout; }; static inline constexpr auto operator|(Server::RecallFlags a, Server::RecallFlags b) { diff -Nru ceph-15.2.8/src/mds/SessionMap.cc ceph-15.2.11/src/mds/SessionMap.cc --- ceph-15.2.8/src/mds/SessionMap.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/SessionMap.cc 2021-04-19 13:47:30.000000000 +0000 @@ -571,13 +571,20 @@ } } -void Session::dump(Formatter *f) const +void Session::dump(Formatter *f, bool cap_dump) const { f->dump_int("id", info.inst.name.num()); f->dump_object("entity", info.inst); f->dump_string("state", get_state_name()); f->dump_int("num_leases", leases.size()); f->dump_int("num_caps", caps.size()); + if (cap_dump) { + f->open_array_section("caps"); + for (const auto& cap : caps) { + f->dump_object("cap", *cap); + } + f->close_section(); + } if (is_open() || is_stale()) { f->dump_unsigned("request_load_avg", get_load_avg()); } @@ -590,6 +597,7 @@ f->dump_object("recall_caps_throttle", recall_caps_throttle); f->dump_object("recall_caps_throttle2o", recall_caps_throttle2o); f->dump_object("session_cache_liveness", session_cache_liveness); + f->dump_object("cap_acquisition", cap_acquisition); info.dump(f); } @@ -1079,6 +1087,13 @@ }; apply_to_open_sessions(mut); } + if (changed.count("mds_session_cap_acquisition_decay_rate")) { + auto d = g_conf().get_val("mds_session_cap_acquisition_decay_rate"); + auto mut = [d](auto s) { + s->cap_acquisition = DecayCounter(d); + }; + apply_to_open_sessions(mut); + } } void SessionMap::update_average_session_age() { diff -Nru ceph-15.2.8/src/mds/SessionMap.h ceph-15.2.11/src/mds/SessionMap.h --- ceph-15.2.8/src/mds/SessionMap.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/SessionMap.h 2021-04-19 13:47:30.000000000 +0000 @@ -92,6 +92,7 @@ recall_caps_throttle(g_conf().get_val("mds_recall_max_decay_rate")), recall_caps_throttle2o(0.5), session_cache_liveness(g_conf().get_val("mds_session_cache_liveness_decay_rate")), + cap_acquisition(g_conf().get_val("mds_session_cap_acquisition_decay_rate")), birth_time(clock::now()) { set_connection(std::move(con)); @@ -117,7 +118,7 @@ } } - void dump(Formatter *f) const; + void dump(Formatter *f, bool cap_dump=false) const; void push_pv(version_t pv) { ceph_assert(projected.empty() || projected.back() != pv); @@ -171,6 +172,9 @@ auto get_session_cache_liveness() const { return session_cache_liveness.get(); } + auto get_cap_acquisition() const { + return cap_acquisition.get(); + } inodeno_t take_ino(inodeno_t ino = 0) { if (ino) { @@ -293,6 +297,10 @@ } } + void touch_readdir_cap(uint32_t count) { + cap_acquisition.hit(count); + } + void touch_cap(Capability *cap) { session_cache_liveness.hit(1.0); caps.push_front(&cap->item_session_caps); @@ -472,6 +480,9 @@ // session caps liveness DecayCounter session_cache_liveness; + // cap acquisition via readdir + DecayCounter cap_acquisition; + // session start time -- used to track average session time // note that this is initialized in the constructor rather // than at the time of adding a session to the sessionmap diff -Nru ceph-15.2.8/src/mds/snap.h ceph-15.2.11/src/mds/snap.h --- ceph-15.2.8/src/mds/snap.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/snap.h 2021-04-19 13:47:30.000000000 +0000 @@ -74,6 +74,10 @@ void clear_parent_global() { flags &= ~PARENT_GLOBAL; } bool is_parent_global() const { return flags & PARENT_GLOBAL; } + void mark_subvolume() { flags |= SUBVOLUME; } + void clear_subvolume() { flags &= ~SUBVOLUME; } + bool is_subvolume() const { return flags & SUBVOLUME; } + void encode(bufferlist &bl) const; void decode(bufferlist::const_iterator &bl); void dump(Formatter *f) const; @@ -90,7 +94,8 @@ __u32 flags = 0; enum { - PARENT_GLOBAL = 1 << 0, + PARENT_GLOBAL = 1 << 0, + SUBVOLUME = 1 << 1, }; }; WRITE_CLASS_ENCODER(sr_t) diff -Nru ceph-15.2.8/src/mds/SnapRealm.cc ceph-15.2.11/src/mds/SnapRealm.cc --- ceph-15.2.8/src/mds/SnapRealm.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/SnapRealm.cc 2021-04-19 13:47:30.000000000 +0000 @@ -332,6 +332,13 @@ cached_seq = seq; cached_last_created = last_created; cached_last_destroyed = last_destroyed; + + cached_subvolume_ino = 0; + if (parent) + cached_subvolume_ino = parent->get_subvolume_ino(); + if (!cached_subvolume_ino && srnode.is_subvolume()) + cached_subvolume_ino = inode->ino(); + build_snap_set(); build_snap_trace(); diff -Nru ceph-15.2.8/src/mds/SnapRealm.h ceph-15.2.11/src/mds/SnapRealm.h --- ceph-15.2.8/src/mds/SnapRealm.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mds/SnapRealm.h 2021-04-19 13:47:30.000000000 +0000 @@ -102,6 +102,11 @@ return (p != s.end() && *p <= last); } + inodeno_t get_subvolume_ino() { + check_cache(); + return cached_subvolume_ino; + } + void adjust_parent(); void split_at(SnapRealm *child); @@ -156,6 +161,7 @@ mutable set cached_snaps; mutable SnapContext cached_snap_context; mutable bufferlist cached_snap_trace; + mutable inodeno_t cached_subvolume_ino = 0; }; ostream& operator<<(ostream& out, const SnapRealm &realm); diff -Nru ceph-15.2.8/src/messages/MMonCommandAck.h ceph-15.2.11/src/messages/MMonCommandAck.h --- ceph-15.2.8/src/messages/MMonCommandAck.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/messages/MMonCommandAck.h 2021-04-19 13:47:30.000000000 +0000 @@ -17,6 +17,9 @@ #include "messages/PaxosServiceMessage.h" +using TOPNSPC::common::cmdmap_from_json; +using TOPNSPC::common::cmd_getval; + class MMonCommandAck : public PaxosServiceMessage { public: std::vector cmd; @@ -33,7 +36,28 @@ public: std::string_view get_type_name() const override { return "mon_command"; } void print(std::ostream& o) const override { - o << "mon_command_ack(" << cmd << "=" << r << " " << rs << " v" << version << ")"; + cmdmap_t cmdmap; + stringstream ss; + string prefix; + cmdmap_from_json(cmd, &cmdmap, ss); + cmd_getval(cmdmap, "prefix", prefix); + // Some config values contain sensitive data, so don't log them + o << "mon_command_ack("; + if (prefix == "config set") { + string name; + cmd_getval(cmdmap, "name", name); + o << "[{prefix=" << prefix + << ", name=" << name << "}]" + << "=" << r << " " << rs << " v" << version << ")"; + } else if (prefix == "config-key set") { + string key; + cmd_getval(cmdmap, "key", key); + o << "[{prefix=" << prefix << ", key=" << key << "}]" + << "=" << r << " " << rs << " v" << version << ")"; + } else { + o << cmd; + } + o << "=" << r << " " << rs << " v" << version << ")"; } void encode_payload(uint64_t features) override { diff -Nru ceph-15.2.8/src/messages/MMonCommand.h ceph-15.2.11/src/messages/MMonCommand.h --- ceph-15.2.8/src/messages/MMonCommand.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/messages/MMonCommand.h 2021-04-19 13:47:30.000000000 +0000 @@ -20,6 +20,9 @@ #include #include +using TOPNSPC::common::cmdmap_from_json; +using TOPNSPC::common::cmd_getval; + class MMonCommand : public PaxosServiceMessage { public: // weird note: prior to octopus, MgrClient would leave fsid blank when @@ -41,10 +44,26 @@ public: std::string_view get_type_name() const override { return "mon_command"; } void print(std::ostream& o) const override { + cmdmap_t cmdmap; + stringstream ss; + string prefix; + cmdmap_from_json(cmd, &cmdmap, ss); + cmd_getval(cmdmap, "prefix", prefix); + // Some config values contain sensitive data, so don't log them o << "mon_command("; - for (unsigned i=0; ilock); + PyEval_RestoreThread(tstate); // TODO: pick the highest version, and make sure that // somewhere else (during health reporting?) we are // indicating to the user if we see mixed versions @@ -133,7 +135,9 @@ Py_RETURN_NONE; } + PyThreadState *tstate = PyEval_SaveThread(); std::lock_guard l(metadata->lock); + PyEval_RestoreThread(tstate); PyFormatter f; f.dump_string("hostname", metadata->hostname); for (const auto &i : metadata->metadata) { @@ -152,8 +156,9 @@ derr << "Requested missing service " << svc_type << "." << svc_id << dendl; Py_RETURN_NONE; } - + PyThreadState *tstate = PyEval_SaveThread(); std::lock_guard l(metadata->lock); + PyEval_RestoreThread(tstate); PyFormatter f; for (const auto &i : metadata->service_status) { f.dump_string(i.first.c_str(), i.second); @@ -197,7 +202,6 @@ }); return f.get(); } else if (what == "modified_config_options") { - PyEval_RestoreThread(tstate); auto all_daemons = daemon_state.get_all(); set names; for (auto& [key, daemon] : all_daemons) { @@ -206,6 +210,7 @@ names.insert(name); } } + PyEval_RestoreThread(tstate); f.open_array_section("options"); for (auto& name : names) { f.dump_string("name", name); @@ -238,31 +243,35 @@ return f.get(); } else if (what == "osd_metadata") { auto dmc = daemon_state.get_by_service("osd"); - PyEval_RestoreThread(tstate); for (const auto &[key, state] : dmc) { std::lock_guard l(state->lock); + PyEval_RestoreThread(tstate); f.open_object_section(key.name.c_str()); f.dump_string("hostname", state->hostname); for (const auto &[name, val] : state->metadata) { f.dump_string(name.c_str(), val); } f.close_section(); + tstate = PyEval_SaveThread(); } + PyEval_RestoreThread(tstate); return f.get(); } else if (what == "mds_metadata") { auto dmc = daemon_state.get_by_service("mds"); - PyEval_RestoreThread(tstate); for (const auto &[key, state] : dmc) { std::lock_guard l(state->lock); + PyEval_RestoreThread(tstate); f.open_object_section(key.name.c_str()); f.dump_string("hostname", state->hostname); for (const auto &[name, val] : state->metadata) { f.dump_string(name.c_str(), val); } f.close_section(); + tstate = PyEval_SaveThread(); } + PyEval_RestoreThread(tstate); return f.get(); } else if (what == "pg_summary") { cluster_state.with_pgmap( @@ -509,8 +518,8 @@ dout(15) << "queuing notify to " << name << dendl; // workaround for https://bugs.llvm.org/show_bug.cgi?id=35984 finisher.queue(new LambdaContext([module=module, notify_type, notify_id] - (int r){ - module->notify(notify_type, notify_id); + (int r){ + module->notify(notify_type, notify_id); })); } } @@ -612,7 +621,10 @@ derr << "Module '" << module_name << "' is not available" << dendl; Py_RETURN_NONE; } - dout(10) << __func__ << " " << final_key << " found: " << value << dendl; + // removing value to hide sensitive data going into mgr logs + // leaving this for debugging purposes + // dout(10) << __func__ << " " << final_key << " found: " << value << dendl; + dout(10) << __func__ << " " << final_key << " found" << dendl; return module->get_typed_option_value(key, value); } PyEval_RestoreThread(tstate); @@ -725,7 +737,9 @@ auto metadata = daemon_state.get(DaemonKey{svc_name, svc_id}); if (metadata) { + tstate = PyEval_SaveThread(); std::lock_guard l2(metadata->lock); + PyEval_RestoreThread(tstate); if (metadata->perf_counters.instances.count(path)) { auto counter_instance = metadata->perf_counters.instances.at(path); auto counter_type = metadata->perf_counters.types.at(path); @@ -829,8 +843,9 @@ if (!daemons.empty()) { for (auto& [key, state] : daemons) { f.open_object_section(ceph::to_string(key).c_str()); - + tstate = PyEval_SaveThread(); std::lock_guard l(state->lock); + PyEval_RestoreThread(tstate); for (auto ctr_inst_iter : state->perf_counters.instances) { const auto &counter_name = ctr_inst_iter.first; f.open_object_section(counter_name.c_str()); diff -Nru ceph-15.2.8/src/mgr/BaseMgrModule.cc ceph-15.2.11/src/mgr/BaseMgrModule.cc --- ceph-15.2.8/src/mgr/BaseMgrModule.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mgr/BaseMgrModule.cc 2021-04-19 13:47:30.000000000 +0000 @@ -125,12 +125,20 @@ char *cmd_json = nullptr; char *tag = nullptr; + char *inbuf_ptr = nullptr; + Py_ssize_t inbuf_len = 0; + bufferlist inbuf = {}; + PyObject *completion = nullptr; - if (!PyArg_ParseTuple(args, "Ossss:ceph_send_command", - &completion, &type, &name, &cmd_json, &tag)) { + if (!PyArg_ParseTuple(args, "Ossssz#:ceph_send_command", + &completion, &type, &name, &cmd_json, &tag, &inbuf_ptr, &inbuf_len)) { return nullptr; } + if (inbuf_ptr) { + inbuf.append(inbuf_ptr, (unsigned)inbuf_len); + } + auto set_fn = PyObject_GetAttrString(completion, "complete"); if (set_fn == nullptr) { ceph_abort(); // TODO raise python exception instead @@ -164,7 +172,7 @@ self->py_modules->get_monc().start_mon_command( name, {cmd_json}, - {}, + inbuf, &command_c->outbl, &command_c->outs, new C_OnFinisher(c, &self->py_modules->cmd_finisher)); @@ -184,7 +192,7 @@ self->py_modules->get_objecter().osd_command( osd_id, {cmd_json}, - {}, + inbuf, &tid, &command_c->outbl, &command_c->outs, @@ -193,7 +201,7 @@ int r = self->py_modules->get_client().mds_command( name, {cmd_json}, - {}, + inbuf, &command_c->outbl, &command_c->outs, new C_OnFinisher(command_c, &self->py_modules->cmd_finisher)); @@ -219,7 +227,7 @@ self->py_modules->get_objecter().pg_command( pgid, {cmd_json}, - {}, + inbuf, &tid, &command_c->outbl, &command_c->outs, @@ -349,7 +357,7 @@ self->py_modules->set_health_checks(self->this_module->get_name(), std::move(out_checks)); PyEval_RestoreThread(tstate); - + Py_RETURN_NONE; } diff -Nru ceph-15.2.8/src/mgr/ClusterState.cc ceph-15.2.11/src/mgr/ClusterState.cc --- ceph-15.2.8/src/mgr/ClusterState.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mgr/ClusterState.cc 2021-04-19 13:47:30.000000000 +0000 @@ -72,7 +72,17 @@ std::lock_guard l(lock); const int from = stats->get_orig_source().num(); - pending_inc.update_stat(from, std::move(stats->osd_stat)); + bool is_in = with_osdmap([from](const OSDMap& osdmap) { + return osdmap.is_in(from); + }); + + if (is_in) { + pending_inc.update_stat(from, std::move(stats->osd_stat)); + } else { + osd_stat_t empty_stat; + empty_stat.seq = stats->osd_stat.seq; + pending_inc.update_stat(from, std::move(empty_stat)); + } for (auto p : stats->pg_stat) { pg_t pgid = p.first; diff -Nru ceph-15.2.8/src/mgr/MgrStandby.cc ceph-15.2.11/src/mgr/MgrStandby.cc --- ceph-15.2.8/src/mgr/MgrStandby.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mgr/MgrStandby.cc 2021-04-19 13:47:30.000000000 +0000 @@ -131,7 +131,10 @@ // We must register our config callback before calling init(), so // that we see the initial configuration message monc.register_config_callback([this](const std::string &k, const std::string &v){ - dout(10) << "config_callback: " << k << " : " << v << dendl; + // removing value to hide sensitive data going into mgr logs + // leaving this for debugging purposes + // dout(10) << "config_callback: " << k << " : " << v << dendl; + dout(10) << "config_callback: " << k << " : " << dendl; if (k.substr(0, 4) == "mgr/") { const std::string global_key = PyModule::config_prefix + k.substr(4); py_module_registry.handle_config(global_key, v); @@ -384,6 +387,7 @@ // this MgrMap is changing its set of enabled modules bool need_respawn = py_module_registry.handle_mgr_map(map); if (need_respawn) { + dout(1) << "respawning because set of enabled modules changed!" << dendl; respawn(); } diff -Nru ceph-15.2.8/src/mgr/PyModuleRegistry.cc ceph-15.2.11/src/mgr/PyModuleRegistry.cc --- ceph-15.2.8/src/mgr/PyModuleRegistry.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mgr/PyModuleRegistry.cc 2021-04-19 13:47:30.000000000 +0000 @@ -424,7 +424,10 @@ std::lock_guard l(module_config.lock); if (!v.empty()) { - dout(10) << "Loaded module_config entry " << k << ":" << v << dendl; + // removing value to hide sensitive data going into mgr logs + // leaving this for debugging purposes + // dout(10) << "Loaded module_config entry " << k << ":" << v << dendl; + dout(10) << "Loaded module_config entry " << k << ":" << dendl; module_config.config[k] = v; } else { module_config.config.erase(k); diff -Nru ceph-15.2.8/src/mon/AuthMonitor.cc ceph-15.2.11/src/mon/AuthMonitor.cc --- ceph-15.2.8/src/mon/AuthMonitor.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/AuthMonitor.cc 2021-04-19 13:47:30.000000000 +0000 @@ -588,6 +588,7 @@ bool start = false; bool finished = false; EntityName entity_name; + bool is_new_global_id = false; // set up handler? if (m->protocol == 0 && !s->auth_handler) { @@ -707,23 +708,23 @@ ceph_assert(!paxos_writable); return false; } + is_new_global_id = true; } try { if (start) { // new session ret = s->auth_handler->start_session(entity_name, - 0, // no connection_secret needed + s->con->peer_global_id, + is_new_global_id, &response_bl, - &s->con->peer_caps_info, - nullptr, nullptr); + &s->con->peer_caps_info); } else { // request ret = s->auth_handler->handle_request( indata, 0, // no connection_secret needed &response_bl, - &s->con->peer_global_id, &s->con->peer_caps_info, nullptr, nullptr); } diff -Nru ceph-15.2.8/src/mon/ConfigMonitor.cc ceph-15.2.11/src/mon/ConfigMonitor.cc --- ceph-15.2.8/src/mon/ConfigMonitor.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/ConfigMonitor.cc 2021-04-19 13:47:30.000000000 +0000 @@ -801,13 +801,6 @@ it->next(); } dout(10) << __func__ << " got " << num << " keys" << dendl; - dout(20) << __func__ << " config map:\n"; - JSONFormatter jf(true); - jf.open_object_section("config_map"); - config_map.dump(&jf); - jf.close_section(); - jf.flush(*_dout); - *_dout << dendl; // refresh our own config { @@ -884,8 +877,9 @@ dout(20) << __func__ << " no change, " << out << dendl; return false; } - - dout(20) << __func__ << " " << out << dendl; + // removing this to hide sensitive data going into logs + // leaving this for debugging purposes + // dout(20) << __func__ << " " << out << dendl; s->last_config = std::move(out); s->any_config = true; return true; diff -Nru ceph-15.2.8/src/mon/HealthMonitor.cc ceph-15.2.11/src/mon/HealthMonitor.cc --- ceph-15.2.8/src/mon/HealthMonitor.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/HealthMonitor.cc 2021-04-19 13:47:30.000000000 +0000 @@ -540,6 +540,7 @@ { dout(20) << __func__ << dendl; bool changed = false; + const auto max = g_conf().get_val("mon_health_max_detail"); // snapshot of usage DataStats stats; @@ -609,6 +610,44 @@ } } + // AUTH_INSECURE_GLOBAL_ID_RECLAIM + if (g_conf().get_val("mon_warn_on_insecure_global_id_reclaim") && + g_conf().get_val("auth_allow_insecure_global_id_reclaim")) { + // Warn if there are any clients that are insecurely renewing their global_id + std::lock_guard l(mon->session_map_lock); + list detail; + for (auto p = mon->session_map.sessions.begin(); + p != mon->session_map.sessions.end(); + ++p) { + if ((*p)->global_id_status == global_id_status_t::RECLAIM_INSECURE) { + ostringstream ds; + ds << (*p)->entity_name << " at " << (*p)->addrs + << " is using insecure global_id reclaim"; + detail.push_back(ds.str()); + if (detail.size() >= max) { + detail.push_back("..."); + break; + } + } + } + if (!detail.empty()) { + ostringstream ss; + ss << "client%plurals% %isorare% using insecure global_id reclaim"; + auto& d = next.add("AUTH_INSECURE_GLOBAL_ID_RECLAIM", HEALTH_WARN, ss.str(), + detail.size()); + d.detail.swap(detail); + } + } + // AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED + if (g_conf().get_val("mon_warn_on_insecure_global_id_reclaim_allowed") && + g_conf().get_val("auth_allow_insecure_global_id_reclaim")) { + ostringstream ss, ds; + ss << "mon%plurals% %isorare% allowing insecure global_id reclaim"; + auto& d = next.add("AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED", HEALTH_WARN, ss.str(), 1); + ds << "mon." << mon->name << " has auth_allow_insecure_global_id_reclaim set to true"; + d.detail.push_back(ds.str()); + } + auto p = quorum_checks.find(mon->rank); if (p == quorum_checks.end()) { if (next.empty()) { diff -Nru ceph-15.2.8/src/mon/MonCap.cc ceph-15.2.11/src/mon/MonCap.cc --- ceph-15.2.8/src/mon/MonCap.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/MonCap.cc 2021-04-19 13:47:30.000000000 +0000 @@ -199,7 +199,7 @@ profile_grants.push_back(MonCapGrant("mds", MON_CAP_R | MON_CAP_W)); profile_grants.push_back(MonCapGrant("fs", MON_CAP_R | MON_CAP_W)); profile_grants.push_back(MonCapGrant("osd", MON_CAP_R | MON_CAP_W)); - profile_grants.push_back(MonCapGrant("auth", MON_CAP_R | MON_CAP_X)); + profile_grants.push_back(MonCapGrant("auth", MON_CAP_R | MON_CAP_W | MON_CAP_X)); profile_grants.push_back(MonCapGrant("config-key", MON_CAP_R | MON_CAP_W)); profile_grants.push_back(MonCapGrant("config", MON_CAP_R | MON_CAP_W)); // cephadm orchestrator provisions new daemon keys and updates caps diff -Nru ceph-15.2.8/src/mon/MonClient.cc ceph-15.2.11/src/mon/MonClient.cc --- ceph-15.2.8/src/mon/MonClient.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/MonClient.cc 2021-04-19 13:47:30.000000000 +0000 @@ -162,8 +162,11 @@ } while ((!got_config || monmap.get_epoch() == 0) && r == 0) { ldout(cct,20) << __func__ << " waiting for monmap|config" << dendl; - map_cond.wait_for(l, ceph::make_timespan( - cct->_conf->mon_client_hunt_interval)); + auto status = map_cond.wait_for(l, ceph::make_timespan( + cct->_conf->mon_client_hunt_interval)); + if (status == std::cv_status::timeout) { + r = -ETIMEDOUT; + } } if (got_config) { ldout(cct,10) << __func__ << " success" << dendl; @@ -508,7 +511,11 @@ active_con.reset(); pending_cons.clear(); + auth.reset(); + global_id = 0; + authenticate_err = 0; + authenticated = false; monc_lock.unlock(); @@ -688,9 +695,9 @@ _start_hunting(); if (rank >= 0) { - _add_conn(rank, global_id); + _add_conn(rank); } else { - _add_conns(global_id); + _add_conns(); } // throw out old queued messages @@ -712,11 +719,14 @@ } } -MonConnection& MonClient::_add_conn(unsigned rank, uint64_t global_id) +MonConnection& MonClient::_add_conn(unsigned rank) { auto peer = monmap.get_addrs(rank); auto conn = messenger->connect_to_mon(peer); MonConnection mc(cct, conn, global_id, &auth_registry); + if (auth) { + mc.get_auth().reset(auth->clone()); + } auto inserted = pending_cons.insert(std::make_pair(peer, std::move(mc))); ldout(cct, 10) << "picked mon." << monmap.get_name(rank) << " con " << conn @@ -725,7 +735,7 @@ return inserted.first->second; } -void MonClient::_add_conns(uint64_t global_id) +void MonClient::_add_conns() { // collect the next batch of candidates who are listed right next to the ones // already tried @@ -778,7 +788,7 @@ n = ranks.size(); } for (unsigned i = 0; i < n; i++) { - _add_conn(ranks[i], global_id); + _add_conn(ranks[i]); tried.insert(ranks[i]); } } @@ -878,7 +888,7 @@ _resend_mon_commands(); send_log(true); if (active_con) { - std::swap(auth, active_con->get_auth()); + auth = std::move(active_con->get_auth()); if (global_id && global_id != active_con->get_global_id()) { lderr(cct) << __func__ << " global_id changed from " << global_id << " to " << active_con->get_global_id() << dendl; @@ -1796,9 +1806,6 @@ return -EACCES; } - if (auth) { - auth.reset(); - } int r = _init_auth(*method, entity_name, want_keys, keyring, true); ceph_assert(r == 0); @@ -1919,12 +1926,6 @@ uint32_t want_keys, RotatingKeyRing* keyring) { - if (auth && (int)m->protocol == auth->get_protocol()) { - // good, negotiation completed - auth->reset(); - return 0; - } - int r = _init_auth(m->protocol, entity_name, want_keys, keyring, false); if (r == -ENOTSUP) { if (m->result == -ENOTSUP) { @@ -1943,9 +1944,15 @@ RotatingKeyRing* keyring, bool msgr2) { - ldout(cct,10) << __func__ << " method " << method << dendl; - auth.reset( - AuthClientHandler::create(cct, method, keyring)); + ldout(cct, 10) << __func__ << " method " << method << dendl; + if (auth && auth->get_protocol() == (int)method) { + ldout(cct, 10) << __func__ << " already have auth, reseting" << dendl; + auth->reset(); + return 0; + } + + ldout(cct, 10) << __func__ << " creating new auth" << dendl; + auth.reset(AuthClientHandler::create(cct, method, keyring)); if (!auth) { ldout(cct, 10) << " no handler for protocol " << method << dendl; return -ENOTSUP; diff -Nru ceph-15.2.8/src/mon/MonClient.h ceph-15.2.11/src/mon/MonClient.h --- ceph-15.2.8/src/mon/MonClient.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/MonClient.h 2021-04-19 13:47:30.000000000 +0000 @@ -314,9 +314,9 @@ void _finish_hunting(int auth_err); void _finish_auth(int auth_err); void _reopen_session(int rank = -1); - MonConnection& _add_conn(unsigned rank, uint64_t global_id); + MonConnection& _add_conn(unsigned rank); + void _add_conns(); void _un_backoff(); - void _add_conns(uint64_t global_id); void _send_mon_message(MessageRef m); std::map::iterator _find_pending_con( diff -Nru ceph-15.2.8/src/mon/Monitor.cc ceph-15.2.11/src/mon/Monitor.cc --- ceph-15.2.8/src/mon/Monitor.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/Monitor.cc 2021-04-19 13:47:30.000000000 +0000 @@ -3336,18 +3336,20 @@ if (!_allowed_command(session, service, prefix, cmdmap, param_str_map, mon_cmd)) { dout(1) << __func__ << " access denied" << dendl; - (cmd_is_rw ? audit_clog->info() : audit_clog->debug()) - << "from='" << session->name << " " << session->addrs << "' " - << "entity='" << session->entity_name << "' " - << "cmd=" << m->cmd << ": access denied"; + if (prefix != "config set" && prefix != "config-key set") + (cmd_is_rw ? audit_clog->info() : audit_clog->debug()) + << "from='" << session->name << " " << session->addrs << "' " + << "entity='" << session->entity_name << "' " + << "cmd=" << m->cmd << ": access denied"; reply_command(op, -EACCES, "access denied", 0); return; } - (cmd_is_rw ? audit_clog->info() : audit_clog->debug()) - << "from='" << session->name << " " << session->addrs << "' " - << "entity='" << session->entity_name << "' " - << "cmd=" << m->cmd << ": dispatch"; + if (prefix != "config set" && prefix != "config-key set") + (cmd_is_rw ? audit_clog->info() : audit_clog->debug()) + << "from='" << session->name << " " << session->addrs << "' " + << "entity='" << session->entity_name << "' " + << "cmd=" << m->cmd << ": dispatch"; // compat kludge for legacy clients trying to tell commands that are // new. see bottom of MonCommands.h. we need to handle both (1) @@ -4338,9 +4340,13 @@ if (s->auth_handler) { s->entity_name = s->auth_handler->get_entity_name(); + s->global_id = s->auth_handler->get_global_id(); + s->global_id_status = s->auth_handler->get_global_id_status(); } - dout(20) << " entity " << s->entity_name - << " caps " << s->caps.get_str() << dendl; + dout(20) << " entity_name " << s->entity_name + << " global_id " << s->global_id + << " (" << s->global_id_status + << ") caps " << s->caps.get_str() << dendl; if ((is_synchronizing() || (!s->authenticated && !exited_quorum.is_zero())) && @@ -4391,6 +4397,34 @@ return; } + // global_id_status == NONE: all sessions for auth_none and krb, + // mon <-> mon sessions (including proxied sessions) for cephx + ceph_assert(s->global_id_status == global_id_status_t::NONE || + s->global_id_status == global_id_status_t::NEW_OK || + s->global_id_status == global_id_status_t::NEW_NOT_EXPOSED || + s->global_id_status == global_id_status_t::RECLAIM_OK || + s->global_id_status == global_id_status_t::RECLAIM_INSECURE); + + // let mon_getmap through for "ping" (which doesn't reconnect) + // and "tell" (which reconnects but doesn't attempt to preserve + // its global_id and stays in NEW_NOT_EXPOSED, retrying until + // ->send_attempts reaches 0) + if (cct->_conf->auth_expose_insecure_global_id_reclaim && + s->global_id_status == global_id_status_t::NEW_NOT_EXPOSED && + op->get_req()->get_type() != CEPH_MSG_MON_GET_MAP) { + dout(5) << __func__ << " " << op->get_req()->get_source_inst() + << " may omit old_ticket on reconnects, discarding " + << *op->get_req() << " and forcing reconnect" << dendl; + ceph_assert(s->con && !s->proxy_con); + s->con->mark_down(); + { + std::lock_guard l(session_map_lock); + remove_session(s); + } + op->mark_zap(); + return; + } + switch (op->get_req()->get_type()) { case CEPH_MSG_MON_GET_MAP: handle_mon_get_map(op); @@ -6076,7 +6110,7 @@ } ret = key_server.build_session_auth_info( - service_id, auth_ticket_info.ticket, info, secret, (uint64_t)-1); + service_id, auth_ticket_info.ticket, secret, (uint64_t)-1, info); if (ret < 0) { dout(0) << __func__ << " failed to build mon session_auth_info " << cpp_strerror(ret) << dendl; @@ -6250,14 +6284,14 @@ // are supported by the client if we require it. for msgr2 that // is not necessary. + bool is_new_global_id = false; if (!con->peer_global_id) { con->peer_global_id = authmon()->_assign_global_id(); if (!con->peer_global_id) { dout(1) << __func__ << " failed to assign global_id" << dendl; return -EBUSY; } - dout(10) << __func__ << " assigned global_id " << con->peer_global_id - << dendl; + is_new_global_id = true; } // set up partial session @@ -6267,11 +6301,10 @@ r = s->auth_handler->start_session( entity_name, - auth_meta->get_connection_secret_length(), + con->peer_global_id, + is_new_global_id, reply, - &con->peer_caps_info, - &auth_meta->session_key, - &auth_meta->connection_secret); + &con->peer_caps_info); } else { priv = con->get_priv(); if (!priv) { @@ -6284,7 +6317,6 @@ p, auth_meta->get_connection_secret_length(), reply, - &con->peer_global_id, &con->peer_caps_info, &auth_meta->session_key, &auth_meta->connection_secret); diff -Nru ceph-15.2.8/src/mon/Monitor.h ceph-15.2.11/src/mon/Monitor.h --- ceph-15.2.8/src/mon/Monitor.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/Monitor.h 2021-04-19 13:47:30.000000000 +0000 @@ -56,6 +56,7 @@ #include "mon/MonOpRequest.h" #include "common/WorkQueue.h" +using namespace TOPNSPC::common; #define CEPH_MON_PROTOCOL 13 /* cluster internal */ @@ -839,7 +840,13 @@ ss << "session dropped for command "; } } - ss << "cmd='" << m->cmd << "': finished"; + cmdmap_t cmdmap; + stringstream ds; + string prefix; + cmdmap_from_json(m->cmd, &cmdmap, ds); + cmd_getval(cmdmap, "prefix", prefix); + if (prefix != "config set" && prefix != "config-key set") + ss << "cmd='" << m->cmd << "': finished"; mon->audit_clog->info() << ss.str(); mon->reply_command(op, rc, rs, rdata, version); diff -Nru ceph-15.2.8/src/mon/OSDMonitor.cc ceph-15.2.11/src/mon/OSDMonitor.cc --- ceph-15.2.8/src/mon/OSDMonitor.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/OSDMonitor.cc 2021-04-19 13:47:30.000000000 +0000 @@ -10803,6 +10803,18 @@ err = parse_erasure_code_profile(profile, &profile_map, &ss); if (err) goto reply; + if (auto found = profile_map.find("crush-failure-domain"); + found != profile_map.end()) { + const auto& failure_domain = found->second; + int failure_domain_type = osdmap.crush->get_type_id(failure_domain); + if (failure_domain_type < 0) { + ss << "erasure-code-profile " << profile_map + << " contains an invalid failure-domain " << std::quoted(failure_domain); + err = -EINVAL; + goto reply; + } + } + if (profile_map.find("plugin") == profile_map.end()) { ss << "erasure-code-profile " << profile_map << " must contain a plugin entry" << std::endl; diff -Nru ceph-15.2.8/src/mon/Paxos.cc ceph-15.2.11/src/mon/Paxos.cc --- ceph-15.2.8/src/mon/Paxos.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/Paxos.cc 2021-04-19 13:47:30.000000000 +0000 @@ -1336,7 +1336,6 @@ finish_contexts(g_ceph_context, committing_finishers, -ECANCELED); if (logger) g_ceph_context->get_perfcounters_collection()->remove(logger); - delete logger; } void Paxos::leader_init() diff -Nru ceph-15.2.8/src/mon/Paxos.h ceph-15.2.11/src/mon/Paxos.h --- ceph-15.2.8/src/mon/Paxos.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/Paxos.h 2021-04-19 13:47:30.000000000 +0000 @@ -1045,7 +1045,7 @@ * @param name A name for the paxos service. It serves as the naming space * of the underlying persistent storage for this service. */ - Paxos(Monitor *m, const string &name) + Paxos(Monitor *m, const string &name) : mon(m), logger(NULL), paxos_name(name), @@ -1065,6 +1065,10 @@ clock_drift_warned(0), trimming(false) { } + ~Paxos() { + delete logger; + } + const string get_name() const { return paxos_name; } diff -Nru ceph-15.2.8/src/mon/Session.h ceph-15.2.11/src/mon/Session.h --- ceph-15.2.8/src/mon/Session.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mon/Session.h 2021-04-19 13:47:30.000000000 +0000 @@ -64,6 +64,8 @@ AuthServiceHandler *auth_handler = nullptr; EntityName entity_name; + uint64_t global_id = 0; + global_id_status_t global_id_status = global_id_status_t::NONE; ConnectionRef proxy_con; uint64_t proxy_tid = 0; @@ -123,6 +125,8 @@ f->dump_bool("open", !closed); f->dump_object("caps", caps); f->dump_bool("authenticated", authenticated); + f->dump_unsigned("global_id", global_id); + f->dump_stream("global_id_status") << global_id_status; f->dump_unsigned("osd_epoch", osd_epoch); f->dump_string("remote_host", remote_host); } diff -Nru ceph-15.2.8/src/msg/async/ProtocolV2.cc ceph-15.2.11/src/msg/async/ProtocolV2.cc --- ceph-15.2.8/src/msg/async/ProtocolV2.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/msg/async/ProtocolV2.cc 2021-04-19 13:47:30.000000000 +0000 @@ -749,7 +749,7 @@ if (unlikely(pre_auth.enabled) && r >= 0) { pre_auth.rxbuf.append(*next.node); ceph_assert(!cct->_conf->ms_die_on_bug || - pre_auth.rxbuf.length() < 10000000); + pre_auth.rxbuf.length() < 20000000); } next.r = r; run_continuation(next); @@ -759,7 +759,7 @@ if (unlikely(pre_auth.enabled) && r >= 0) { pre_auth.rxbuf.append(*next.node); ceph_assert(!cct->_conf->ms_die_on_bug || - pre_auth.rxbuf.length() < 10000000); + pre_auth.rxbuf.length() < 20000000); } next.r = r; return &next; @@ -791,7 +791,7 @@ if (unlikely(pre_auth.enabled)) { pre_auth.txbuf.append(buffer); ceph_assert(!cct->_conf->ms_die_on_bug || - pre_auth.txbuf.length() < 10000000); + pre_auth.txbuf.length() < 20000000); } ssize_t r = diff -Nru ceph-15.2.8/src/mypy.ini ceph-15.2.11/src/mypy.ini --- ceph-15.2.8/src/mypy.ini 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/mypy.ini 2021-04-19 13:47:30.000000000 +0000 @@ -5,7 +5,7 @@ warn_incomplete_stub = True check_untyped_defs = True show_error_context = True -[mypy-cephadm.services.*] +[mypy-cephadm.*] disallow_untyped_defs = True diff -Nru ceph-15.2.8/src/ocf/rbd.in ceph-15.2.11/src/ocf/rbd.in --- ceph-15.2.8/src/ocf/rbd.in 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/ocf/rbd.in 2021-04-19 13:47:30.000000000 +0000 @@ -41,6 +41,12 @@ RBD device name + + + Name of the RADOS pool namespace where the RBD has been created + + RADOS pool namespace name + Name of the RADOS pool where the RBD has been created @@ -108,9 +114,7 @@ EOF } -# rbd command wrapper: builds an option string for invoking RBD based -# on resource parameters, and invokes rbd through ocf_run. -do_rbd() { +get_rbd_options() { local rbd_options if [ -n "${OCF_RESKEY_cephconf}" ]; then @@ -120,25 +124,36 @@ rbd_options="$rbd_options -m ${OCF_RESKEY_mon}" fi + echo "${rbd_options}" +} + + +# rbd command wrapper: builds an option string for invoking RBD based +# on resource parameters, and invokes rbd through ocf_run. +do_rbd() { + local rbd_options="$(get_rbd_options)" + ocf_run rbd $rbd_options $@ } # Convenience function that uses "rbd device list" to retrieve the # mapped device name from the pool, RBD name, and snapshot. find_rbd_dev() { + local rbd_options="$(get_rbd_options)" local sedpat # Example output from "rbd device list" (tab separated): - # id pool image snap device - # 0 rbd test - /dev/rbd0 + # id pool namespace image snap device + # 0 rbd test - /dev/rbd0 + # 1 rbd ns1 test - /dev/rbd1 # Build the sed pattern, substituting "-" for the snapshot name if # it's unset - sedpat="[0-9]\+[ \t]\+${OCF_RESKEY_pool}[ \t]\+${OCF_RESKEY_name}[ \t]\+${OCF_RESKEY_snap:--}[ \t]\+\(/dev/rbd[0-9]\+\).*" + sedpat="[0-9]\+[ \t]\+${OCF_RESKEY_pool}[ \t]\+${OCF_RESKEY_pool_namespace}[ \t]\+${OCF_RESKEY_name}[ \t]\+${OCF_RESKEY_snap:--}[ \t]\+\(/dev/rbd[0-9]\+\).*" # Run "rbd device list", filter out the header line, then try to # extract the device name - rbd device list | tail -n +2 | sed -n -e "s,$sedpat,\1,p" + rbd $rbd_options device list | tail -n +2 | sed -n -e "s,$sedpat,\1,p" } rbd_validate_all() { @@ -206,9 +221,13 @@ rbd_map_options="$rbd_map_options --keyfile ${OCF_RESKEY_secret}" fi - rbd_name="${OCF_RESKEY_pool}/${OCF_RESKEY_name}" + rbd_name="${OCF_RESKEY_pool}" + if [ -n "${OCF_RESKEY_pool_namespace}" ]; then + rbd_name="${rbd_name}/${OCF_RESKEY_pool_namespace}" + fi + rbd_name="${rbd_name}/${OCF_RESKEY_name}" if [ -n "${OCF_RESKEY_snap}" ]; then - rbd_name="$rbd_name@${OCF_RESKEY_snap}" + rbd_name="${rbd_name}@${OCF_RESKEY_snap}" fi do_rbd device map $rbd_name $rbd_map_options || exit $OCF_ERR_GENERIC diff -Nru ceph-15.2.8/src/os/bluestore/AvlAllocator.cc ceph-15.2.11/src/os/bluestore/AvlAllocator.cc --- ceph-15.2.8/src/os/bluestore/AvlAllocator.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/AvlAllocator.cc 2021-04-19 13:47:30.000000000 +0000 @@ -240,7 +240,15 @@ max_size < range_size_alloc_threshold || free_pct < range_size_alloc_free_pct) { *cursor = 0; - start = _block_picker(range_size_tree, cursor, size, unit); + do { + start = _block_picker(range_size_tree, cursor, size, unit); + if (start != -1ULL || !force_range_size_alloc) { + break; + } + // try to collect smaller extents as we could fail to retrieve + // that large block due to misaligned extents + size = p2align(size >> 1, unit); + } while (size >= unit); } else { start = _block_picker(range_tree, cursor, size, unit); } diff -Nru ceph-15.2.8/src/os/bluestore/BlueFS.cc ceph-15.2.11/src/os/bluestore/BlueFS.cc --- ceph-15.2.8/src/os/bluestore/BlueFS.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/BlueFS.cc 2021-04-19 13:47:30.000000000 +0000 @@ -68,6 +68,9 @@ "Dump internal statistics for bluefs." ""); ceph_assert(r == 0); + r = admin_socket->register_command("bluefs debug_inject_read_zeros", hook, + "Injects 8K zeros into next BlueFS read. Debug only."); + ceph_assert(r == 0); } } return hook; @@ -114,6 +117,8 @@ bluefs->dump_block_extents(ss); bluefs->dump_volume_selector(ss); out.append(ss); + } else if (command == "bluefs debug_inject_read_zeros") { + bluefs->inject_read_zeros++; } else { errss << "Invalid command" << std::endl; return -ENOSYS; @@ -234,6 +239,10 @@ b.add_u64_counter(l_bluefs_read_prefetch_bytes, "read_prefetch_bytes", "Bytes requested in prefetch read mode", NULL, PerfCountersBuilder::PRIO_USEFUL, unit_t(UNIT_BYTES)); + b.add_u64(l_bluefs_read_zeros_candidate, "read_zeros_candidate", + "How many times bluefs read found page with all 0s"); + b.add_u64(l_bluefs_read_zeros_errors, "read_zeros_errors", + "How many times bluefs read found transient page with all 0s"); logger = b.create_perf_counters(); cct->get_perfcounters_collection()->add(logger); @@ -625,6 +634,146 @@ block_unused_too_granular.clear(); } +int BlueFS::read(uint8_t ndev, uint64_t off, uint64_t len, + ceph::buffer::list *pbl, IOContext *ioc, bool buffered) +{ + dout(10) << __func__ << " dev " << int(ndev) + << ": 0x" << std::hex << off << "~" << len << std::dec + << (buffered ? " buffered" : "") + << dendl; + int r; + bufferlist bl; + r = bdev[ndev]->read(off, len, &bl, ioc, buffered); + if (r != 0) { + return r; + } + uint64_t block_size = bdev[ndev]->get_block_size(); + if (inject_read_zeros) { + if (len >= block_size * 2) { + derr << __func__ << " injecting error, zeros at " + << int(ndev) << ": 0x" << std::hex << (off + len / 2) + << "~" << (block_size * 2) << std::dec << dendl; + //use beginning, replace 8K in the middle with zeros, use tail + bufferlist temp; + bl.splice(0, len / 2 - block_size, &temp); + temp.append_zero(block_size * 2); + bl.splice(block_size * 2, len / 2 - block_size, &temp); + bl = temp; + inject_read_zeros--; + } + } + //make a check if there is a block with all 0 + uint64_t to_check_len = len; + uint64_t skip = p2nphase(off, block_size); + if (skip >= to_check_len) { + return r; + } + auto it = bl.begin(skip); + to_check_len -= skip; + bool all_zeros = false; + while (all_zeros == false && to_check_len >= block_size) { + // checking 0s step + unsigned block_left = block_size; + unsigned avail; + const char* data; + all_zeros = true; + while (all_zeros && block_left > 0) { + avail = it.get_ptr_and_advance(block_left, &data); + block_left -= avail; + all_zeros = mem_is_zero(data, avail); + } + // skipping step + while (block_left > 0) { + avail = it.get_ptr_and_advance(block_left, &data); + block_left -= avail; + } + to_check_len -= block_size; + } + if (all_zeros) { + logger->inc(l_bluefs_read_zeros_candidate, 1); + bufferlist bl_reread; + r = bdev[ndev]->read(off, len, &bl_reread, ioc, buffered); + if (r != 0) { + return r; + } + // check if both read gave the same + if (!bl.contents_equal(bl_reread)) { + // report problems to log, but continue, maybe it will be good now... + derr << __func__ << " initial read of " << int(ndev) + << ": 0x" << std::hex << off << "~" << len + << std::dec << ": different then re-read " << dendl; + logger->inc(l_bluefs_read_zeros_errors, 1); + } + // use second read will be better if is different + pbl->append(bl_reread); + } else { + pbl->append(bl); + } + return r; +} + +int BlueFS::read_random(uint8_t ndev, uint64_t off, uint64_t len, char *buf, bool buffered) +{ + dout(10) << __func__ << " dev " << int(ndev) + << ": 0x" << std::hex << off << "~" << len << std::dec + << (buffered ? " buffered" : "") + << dendl; + int r; + r = bdev[ndev]->read_random(off, len, buf, buffered); + if (r != 0) { + return r; + } + uint64_t block_size = bdev[ndev]->get_block_size(); + if (inject_read_zeros) { + if (len >= block_size * 2) { + derr << __func__ << " injecting error, zeros at " + << int(ndev) << ": 0x" << std::hex << (off + len / 2) + << "~" << (block_size * 2) << std::dec << dendl; + //zero middle 8K + memset(buf + len / 2 - block_size, 0, block_size * 2); + inject_read_zeros--; + } + } + //make a check if there is a block with all 0 + uint64_t to_check_len = len; + const char* data = buf; + uint64_t skip = p2nphase(off, block_size); + if (skip >= to_check_len) { + return r; + } + to_check_len -= skip; + data += skip; + + bool all_zeros = false; + while (all_zeros == false && to_check_len >= block_size) { + if (mem_is_zero(data, block_size)) { + // at least one block is all zeros + all_zeros = true; + break; + } + data += block_size; + to_check_len -= block_size; + } + if (all_zeros) { + logger->inc(l_bluefs_read_zeros_candidate, 1); + std::unique_ptr data_reread(new char[len]); + r = bdev[ndev]->read_random(off, len, &data_reread[0], buffered); + if (r != 0) { + return r; + } + // check if both read gave the same + if (memcmp(buf, &data_reread[0], len) != 0) { + derr << __func__ << " initial read of " << int(ndev) + << ": 0x" << std::hex << off << "~" << len + << std::dec << ": different then re-read " << dendl; + logger->inc(l_bluefs_read_zeros_errors, 1); + // second read is probably better + memcpy(buf, &data_reread[0], len); + } + } + return r; +} + int BlueFS::mount() { dout(1) << __func__ << dendl; @@ -1882,7 +2031,7 @@ } } -int BlueFS::_read_random( +int64_t BlueFS::_read_random( FileReader *h, ///< [in] read from here uint64_t off, ///< [in] offset uint64_t len, ///< [in] this many bytes @@ -1890,7 +2039,7 @@ { auto* buf = &h->buf; - int ret = 0; + int64_t ret = 0; dout(10) << __func__ << " h " << h << " 0x" << std::hex << off << "~" << len << std::dec << " from " << h->file->fnode << dendl; @@ -1918,11 +2067,19 @@ auto p = h->file->fnode.seek(off, &x_off); ceph_assert(p != h->file->fnode.extents.end()); uint64_t l = std::min(p->length - x_off, len); + //hard cap to 1GB + l = std::min(l, uint64_t(1) << 30); dout(20) << __func__ << " read random 0x" << std::hex << x_off << "~" << l << std::dec << " of " << *p << dendl; - int r = bdev[p->bdev]->read_random(p->offset + x_off, l, out, - cct->_conf->bluefs_buffered_io); + int r; + if (!cct->_conf->bluefs_check_for_zeros) { + r = bdev[p->bdev]->read_random(p->offset + x_off, l, out, + cct->_conf->bluefs_buffered_io); + } else { + r = read_random(p->bdev, p->offset + x_off, l, out, + cct->_conf->bluefs_buffered_io); + } ceph_assert(r == 0); off += l; len -= l; @@ -1936,7 +2093,7 @@ } } else { auto left = buf->get_buf_remaining(off); - int r = std::min(len, left); + int64_t r = std::min(len, left); logger->inc(l_bluefs_read_random_buffer_count, 1); logger->inc(l_bluefs_read_random_buffer_bytes, r); dout(20) << __func__ << " left 0x" << std::hex << left @@ -1967,7 +2124,7 @@ return ret; } -int BlueFS::_read( +int64_t BlueFS::_read( FileReader *h, ///< [in] read from here FileReaderBuffer *buf, ///< [in] reader state uint64_t off, ///< [in] offset @@ -2003,7 +2160,7 @@ if (outbl) outbl->clear(); - int ret = 0; + int64_t ret = 0; std::shared_lock s_lock(h->lock); while (len > 0) { size_t left; @@ -2027,6 +2184,8 @@ super.block_size); want = std::max(want, buf->max_prefetch); uint64_t l = std::min(p->length - x_off, want); + //hard cap to 1GB + l = std::min(l, uint64_t(1) << 30); uint64_t eof_offset = round_up_to(h->file->fnode.size, super.block_size); if (!h->ignore_eof && buf->bl_off + l > eof_offset) { @@ -2035,8 +2194,14 @@ dout(20) << __func__ << " fetching 0x" << std::hex << x_off << "~" << l << std::dec << " of " << *p << dendl; - int r = bdev[p->bdev]->read(p->offset + x_off, l, &buf->bl, ioc[p->bdev], - cct->_conf->bluefs_buffered_io); + int r; + if (!cct->_conf->bluefs_check_for_zeros) { + r = bdev[p->bdev]->read(p->offset + x_off, l, &buf->bl, ioc[p->bdev], + cct->_conf->bluefs_buffered_io); + } else { + r = read(p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev], + cct->_conf->bluefs_buffered_io); + } ceph_assert(r == 0); } u_lock.unlock(); @@ -2048,7 +2213,7 @@ dout(20) << __func__ << " left 0x" << std::hex << left << " len 0x" << len << std::dec << dendl; - int r = std::min(len, left); + int64_t r = std::min(len, left); if (outbl) { bufferlist t; t.substr_of(buf->bl, off - buf->bl_off, r); @@ -2072,7 +2237,6 @@ ret += r; buf->pos += r; } - dout(20) << __func__ << " got " << ret << dendl; ceph_assert(!outbl || (int)outbl->length() == ret); --h->file->num_reading; diff -Nru ceph-15.2.8/src/os/bluestore/BlueFS.h ceph-15.2.11/src/os/bluestore/BlueFS.h --- ceph-15.2.8/src/os/bluestore/BlueFS.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/BlueFS.h 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ #include #include +#include #include "bluefs_types.h" #include "BlockDevice.h" @@ -51,6 +52,8 @@ l_bluefs_read_bytes, l_bluefs_read_prefetch_count, l_bluefs_read_prefetch_bytes, + l_bluefs_read_zeros_candidate, + l_bluefs_read_zeros_errors, l_bluefs_last, }; @@ -199,11 +202,15 @@ // to use buffer_appender exclusively here (e.g., it's notion of // offset will remain accurate). void append(const char *buf, size_t len) { + uint64_t l0 = buffer.length(); + ceph_assert(l0 + len <= std::numeric_limits::max()); buffer_appender.append(buf, len); } // note: used internally only, for ino 1 or 0. - void append(bufferlist& bl) { + void append(ceph::buffer::list& bl) { + uint64_t l0 = buffer.length(); + ceph_assert(l0 + bl.length() <= std::numeric_limits::max()); buffer.claim_append(bl); } @@ -328,6 +335,8 @@ class SocketHook; SocketHook* asok_hook = nullptr; + // used to trigger zeros into read (debug / verify) + std::atomic inject_read_zeros{0}; void _init_logger(); void _shutdown_logger(); @@ -394,14 +403,14 @@ int _preallocate(FileRef f, uint64_t off, uint64_t len); int _truncate(FileWriter *h, uint64_t off); - int _read( + int64_t _read( FileReader *h, ///< [in] read from here FileReaderBuffer *buf, ///< [in] reader state uint64_t offset, ///< [in] offset size_t len, ///< [in] this many bytes bufferlist *outbl, ///< [out] optional: reference the result here char *out); ///< [out] optional: or copy it here - int _read_random( + int64_t _read_random( FileReader *h, ///< [in] read from here uint64_t offset, ///< [in] offset uint64_t len, ///< [in] this many bytes @@ -560,6 +569,27 @@ int r = _flush(h, force, l); ceph_assert(r == 0); } + + void append_try_flush(FileWriter *h, const char* buf, size_t len) { + size_t max_size = 1ull << 30; // cap to 1GB + while (len > 0) { + bool need_flush = true; + auto l0 = h->buffer.length(); + if (l0 < max_size) { + size_t l = std::min(len, max_size - l0); + h->append(buf, l); + buf += l; + len -= l; + need_flush = h->buffer.length() >= cct->_conf->bluefs_min_flush_size; + } + if (need_flush) { + flush(h, true); + // make sure we've made any progress with flush hence the + // loop doesn't iterate forever + ceph_assert(h->buffer.length() < max_size); + } + } + } void flush_range(FileWriter *h, uint64_t offset, uint64_t length) { std::lock_guard l(lock); _flush_range(h, offset, length); @@ -570,14 +600,14 @@ _maybe_compact_log(l); return r; } - int read(FileReader *h, FileReaderBuffer *buf, uint64_t offset, size_t len, + int64_t read(FileReader *h, FileReaderBuffer *buf, uint64_t offset, size_t len, bufferlist *outbl, char *out) { // no need to hold the global lock here; we only touch h and // h->file, and read vs write or delete is already protected (via // atomics and asserts). return _read(h, buf, offset, len, outbl, out); } - int read_random(FileReader *h, uint64_t offset, size_t len, + int64_t read_random(FileReader *h, uint64_t offset, size_t len, char *out) { // no need to hold the global lock here; we only touch h and // h->file, and read vs write or delete is already protected (via @@ -607,6 +637,13 @@ const PerfCounters* get_perf_counters() const { return logger; } + +private: + // Wrappers for BlockDevice::read(...) and BlockDevice::read_random(...) + // They are used for checking if read values are all 0, and reread if so. + int read(uint8_t ndev, uint64_t off, uint64_t len, + ceph::buffer::list *pbl, IOContext *ioc, bool buffered); + int read_random(uint8_t ndev, uint64_t off, uint64_t len, char *buf, bool buffered); }; class OriginalVolumeSelector : public BlueFSVolumeSelector { diff -Nru ceph-15.2.8/src/os/bluestore/BlueRocksEnv.cc ceph-15.2.11/src/os/bluestore/BlueRocksEnv.cc --- ceph-15.2.8/src/os/bluestore/BlueRocksEnv.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/BlueRocksEnv.cc 2021-04-19 13:47:30.000000000 +0000 @@ -47,7 +47,7 @@ // // REQUIRES: External synchronization rocksdb::Status Read(size_t n, rocksdb::Slice* result, char* scratch) override { - int r = fs->read(h, &h->buf, h->buf.pos, n, NULL, scratch); + int64_t r = fs->read(h, &h->buf, h->buf.pos, n, NULL, scratch); ceph_assert(r >= 0); *result = rocksdb::Slice(scratch, r); return rocksdb::Status::OK(); @@ -95,7 +95,7 @@ // Safe for concurrent use by multiple threads. rocksdb::Status Read(uint64_t offset, size_t n, rocksdb::Slice* result, char* scratch) const override { - int r = fs->read_random(h, offset, n, scratch); + int64_t r = fs->read_random(h, offset, n, scratch); ceph_assert(r >= 0); *result = rocksdb::Slice(scratch, r); return rocksdb::Status::OK(); @@ -171,7 +171,7 @@ }*/ rocksdb::Status Append(const rocksdb::Slice& data) override { - h->append(data.data(), data.size()); + fs->append_try_flush(h, data.data(), data.size()); return rocksdb::Status::OK(); } diff -Nru ceph-15.2.8/src/os/bluestore/BlueStore.cc ceph-15.2.11/src/os/bluestore/BlueStore.cc --- ceph-15.2.8/src/os/bluestore/BlueStore.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/BlueStore.cc 2021-04-19 13:47:30.000000000 +0000 @@ -698,6 +698,16 @@ virtual void upper_bound(const ghobject_t &oid) = 0; virtual void next() = 0; + virtual int cmp(const ghobject_t &oid) const = 0; + + bool is_ge(const ghobject_t &oid) const { + return cmp(oid) >= 0; + } + + bool is_lt(const ghobject_t &oid) const { + return cmp(oid) < 0; + } + protected: KeyValueDB::Iterator m_it; }; @@ -741,6 +751,15 @@ get_oid(); } + int cmp(const ghobject_t &oid) const override { + ceph_assert(valid()); + + string key; + get_object_key(m_cct, oid, &key); + + return m_it->key().compare(key); + } + private: CephContext *m_cct; ghobject_t m_oid; @@ -816,6 +835,18 @@ } } + int cmp(const ghobject_t &oid) const override { + ceph_assert(valid()); + + if (this->oid() < oid) { + return -1; + } + if (this->oid() > oid) { + return 1; + } + return 0; + } + private: std::map m_chunk; std::map::iterator m_chunk_iter; @@ -1097,7 +1128,14 @@ --num_pinned; dout(20) << __func__ << this << " " << " " << " " << o->oid << " unpinned" << dendl; } - + void _unpin_and_rm(BlueStore::Onode* o) override + { + o->pop_cache(); + ceph_assert(num_pinned); + --num_pinned; + ceph_assert(num); + --num; + } void _trim_to(uint64_t new_size) override { if (new_size >= lru.size()) { @@ -1947,12 +1985,12 @@ cache->_trim(); } -bool BlueStore::OnodeSpace::map_any(std::function f) +bool BlueStore::OnodeSpace::map_any(std::function f) { std::lock_guard l(cache->lock); ldout(cache->cct, 20) << __func__ << dendl; for (auto& i : onode_map) { - if (f(i.second)) { + if (f(i.second.get())) { return true; } } @@ -2360,7 +2398,7 @@ BlobRef& b) { OldExtent* oe = new OldExtent(lo, o, l, b); b->put_ref(c.get(), o, l, &(oe->r)); - oe->blob_empty = b->get_referenced_bytes() == 0; + oe->blob_empty = !b->is_referenced(); return oe; } @@ -3516,34 +3554,47 @@ // decremented. And another 'putting' thread on the instance will release it. // void BlueStore::Onode::get() { - if (++nref == 2) { - c->get_onode_cache()->pin(this, [&]() { - bool was_pinned = pinned; - pinned = nref >= 2; - // additional increment for newly pinned instance - bool r = !was_pinned && pinned; - if (r) { - ++nref; - } - return cached && r; - }); + if (++nref >= 2 && !pinned) { + OnodeCacheShard* ocs = c->get_onode_cache(); + std::lock_guard l(ocs->lock); + bool was_pinned = pinned; + pinned = nref >= 2; + // additional increment for newly pinned instance + bool r = !was_pinned && pinned; + if (r) { + ++nref; + } + if (cached && r) { + ocs->_pin(this); + } } } void BlueStore::Onode::put() { - if (--nref == 2) { - c->get_onode_cache()->unpin(this, [&]() { - bool was_pinned = pinned; - pinned = pinned && nref > 2; // intentionally use > not >= as we have - // +1 due to pinned state - bool r = was_pinned && !pinned; - // additional decrement for newly unpinned instance - if (r) { - --nref; - } - return cached && r; - }); + int n = --nref; + if (n == 2) { + OnodeCacheShard* ocs = c->get_onode_cache(); + std::lock_guard l(ocs->lock); + bool need_unpin = pinned; + pinned = pinned && nref > 2; // intentionally use > not >= as we have + // +1 due to pinned state + need_unpin = need_unpin && !pinned; + if (cached && need_unpin) { + if (exists) { + ocs->_unpin(this); + } else { + ocs->_unpin_and_rm(this); + // remove will also decrement nref and delete Onode + c->onode_map._remove(oid); + } + } + // additional decrement for newly unpinned instance + // should be the last action since Onode can be released + // at any point after this decrement + if (need_unpin) { + n = --nref; + } } - if (nref == 0) { + if (n == 0) { delete this; } } @@ -3992,7 +4043,7 @@ p = onode_map.onode_map.erase(p); dest->onode_map.onode_map[o->oid] = o; - if (get_onode_cache() != dest->get_onode_cache()) { + if (o->cached) { get_onode_cache()->move_pinned(dest->get_onode_cache(), o.get()); } o->c = dest; @@ -4931,8 +4982,15 @@ "Average omap iterator lower_bound call latency"); b.add_time_avg(l_bluestore_omap_next_lat, "omap_next_lat", "Average omap iterator next call latency"); + b.add_time_avg(l_bluestore_omap_get_keys_lat, "omap_get_keys_lat", + "Average omap get_keys call latency"); + b.add_time_avg(l_bluestore_omap_get_values_lat, "omap_get_values_lat", + "Average omap get_values call latency"); b.add_time_avg(l_bluestore_clist_lat, "clist_lat", "Average collection listing latency"); + b.add_time_avg(l_bluestore_remove_lat, "remove_lat", + "Average removal latency"); + logger = b.create_perf_counters(); cct->get_perfcounters_collection()->add(logger); } @@ -5713,6 +5771,14 @@ if (bluefs_layout.shared_bdev == BlueFS::BDEV_SLOW) { string options = cct->_conf->bluestore_rocksdb_options; + string options_annex = cct->_conf->bluestore_rocksdb_options_annex; + if (!options_annex.empty()) { + if (!options.empty() && + *options.rbegin() != ',') { + options += ','; + } + options += options_annex; + } rocksdb::Options rocks_opts; int r = RocksDBStore::ParseOptionsFromStringStatic( @@ -5915,6 +5981,7 @@ ceph_assert(!(create && read_only)); string fn = path + "/db"; string options; + string options_annex; stringstream err; std::shared_ptr merge_op(new Int64ArrayMergeOperator); @@ -6063,6 +6130,14 @@ if (kv_backend == "rocksdb") { options = cct->_conf->bluestore_rocksdb_options; + options_annex = cct->_conf->bluestore_rocksdb_options_annex; + if (!options_annex.empty()) { + if (!options.empty() && + *options.rbegin() != ',') { + options += ','; + } + options += options_annex; + } map cf_map; cct->_conf.with_val("bluestore_rocksdb_cfs", @@ -7759,6 +7834,34 @@ } } // for (auto& i : ref_map) + { + auto &sbm = o->extent_map.spanning_blob_map; + size_t broken = 0; + BlobRef first_broken; + for (auto it = sbm.begin(); it != sbm.end();) { + auto it1 = it++; + if (ref_map.count(it1->second) == 0) { + if (!broken) { + first_broken = it1->second; + ++errors; + } + broken++; + if (repairer) { + sbm.erase(it1); + } + } + } + if (broken) { + derr << "fsck error: " << oid << " - " << broken + << " zombie spanning blob(s) found, the first one: " + << *first_broken << dendl; + if(repairer) { + auto txn = repairer->fix_spanning_blobs(db); + _record_onode(o, txn); + } + } + } + if (o->onode.has_omap()) { _fsck_check_object_omap(depth, o, ctx); } @@ -9298,6 +9401,30 @@ db->submit_transaction_sync(txn); } +void BlueStore::inject_zombie_spanning_blob(coll_t cid, ghobject_t oid, + int16_t blob_id) +{ + OnodeRef o; + CollectionRef c = _get_collection(cid); + ceph_assert(c); + { + std::unique_lock l{ c->lock }; // just to avoid internal asserts + o = c->get_onode(oid, false); + ceph_assert(o); + o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE); + } + + BlobRef b = c->new_blob(); + b->id = blob_id; + o->extent_map.spanning_blob_map[blob_id] = b; + + KeyValueDB::Transaction txn; + txn = db->get_transaction(); + + _record_onode(o, txn); + db->submit_transaction_sync(txn); +} + void BlueStore::collect_metadata(map *pm) { dout(10) << __func__ << dendl; @@ -9574,7 +9701,7 @@ while (p != removed_colls.end()) { CollectionRef c = *p; dout(10) << __func__ << " " << c << " " << c->cid << dendl; - if (c->onode_map.map_any([&](OnodeRef o) { + if (c->onode_map.map_any([&](Onode* o) { ceph_assert(!o->exists); if (o->flushing_count.load()) { dout(10) << __func__ << " " << c << " " << c->cid << " " << o->oid @@ -10776,14 +10903,14 @@ } dout(20) << __func__ << " pend " << pend << dendl; while (true) { - if (!it->valid() || it->oid() >= pend) { + if (!it->valid() || it->is_ge(pend)) { if (!it->valid()) dout(20) << __func__ << " iterator not valid (end of db?)" << dendl; else dout(20) << __func__ << " oid " << it->oid() << " >= " << pend << dendl; if (temp) { if (end.hobj.is_temp()) { - if (it->valid() && it->oid() < coll_range_temp_end) { + if (it->valid() && it->is_lt(coll_range_temp_end)) { *pnext = it->oid(); set_next = true; } @@ -10799,7 +10926,7 @@ dout(30) << __func__ << " pend " << pend << dendl; continue; } - if (it->valid() && it->oid() < coll_range_end) { + if (it->valid() && it->is_lt(coll_range_end)) { *pnext = it->oid(); set_next = true; } @@ -10959,6 +11086,7 @@ dout(15) << __func__ << " " << c->get_cid() << " oid " << oid << dendl; if (!c->exists) return -ENOENT; + auto start1 = mono_clock::now(); std::shared_lock l(c->lock); int r = 0; OnodeRef o = c->get_onode(oid, false); @@ -10990,6 +11118,12 @@ } } out: + c->store->log_latency( + __func__, + l_bluestore_omap_get_keys_lat, + mono_clock::now() - start1, + c->store->cct->_conf->bluestore_log_omap_iterator_age); + dout(10) << __func__ << " " << c->get_cid() << " oid " << oid << " = " << r << dendl; return r; @@ -11007,6 +11141,7 @@ if (!c->exists) return -ENOENT; std::shared_lock l(c->lock); + auto start1 = mono_clock::now(); int r = 0; string final_key; OnodeRef o = c->get_onode(oid, false); @@ -11034,6 +11169,12 @@ } } out: + c->store->log_latency( + __func__, + l_bluestore_omap_get_values_lat, + mono_clock::now() - start1, + c->store->cct->_conf->bluestore_log_omap_iterator_age); + dout(10) << __func__ << " " << c->get_cid() << " oid " << oid << " = " << r << dendl; return r; @@ -12078,7 +12219,25 @@ ceph_assert(!kv_sync_started); kv_sync_started = true; kv_cond.notify_all(); + + auto t0 = mono_clock::now(); + timespan twait = ceph::make_timespan(0); + size_t kv_submitted = 0; + while (true) { + auto period = cct->_conf->bluestore_kv_sync_util_logging_s; + auto observation_period = + ceph::make_timespan(period); + auto elapsed = mono_clock::now() - t0; + if (period && elapsed >= observation_period) { + dout(5) << __func__ << " utilization: idle " + << twait << " of " << elapsed + << ", submitted: " << kv_submitted + < kv_submitting; @@ -12181,6 +12343,7 @@ for (auto txc : kv_committing) { throttle.log_state_latency(*txc, logger, l_bluestore_state_kv_queued_lat); if (txc->state == TransContext::STATE_KV_QUEUED) { + ++kv_submitted; _txc_apply_kv(txc, false); --txc->osr->kv_committing_serially; } else { @@ -13823,12 +13986,23 @@ if (wi.compressed) { final_length = wi.compressed_bl.length(); csum_length = final_length; + unsigned csum_order = ctz(csum_length); l = &wi.compressed_bl; dblob.set_compressed(wi.blob_length, wi.compressed_len); + if (csum != Checksummer::CSUM_NONE) { + dout(20) << __func__ << " initialize csum setting for compressed blob " << *b + << " csum_type " << Checksummer::get_csum_type_string(csum) + << " csum_order " << csum_order + << " csum_length 0x" << std::hex << csum_length + << " blob_length 0x" << wi.blob_length + << " compressed_length 0x" << wi.compressed_len << std::dec + << dendl; + dblob.init_csum(csum, csum_order, csum_length); + } } else if (wi.new_blob) { + unsigned csum_order; // initialize newly created blob only ceph_assert(dblob.is_mutable()); - unsigned csum_order; if (l->length() != wi.blob_length) { // hrm, maybe we could do better here, but let's not bother. dout(20) << __func__ << " forcing csum_order to block_size_order " @@ -14551,7 +14725,23 @@ dout(15) << __func__ << " " << c->cid << " " << o->oid << " onode " << o.get() << " txc "<< txc << dendl; + + auto start_time = mono_clock::now(); int r = _do_remove(txc, c, o); + log_latency_fn( + __func__, + l_bluestore_remove_lat, + mono_clock::now() - start_time, + cct->_conf->bluestore_log_op_age, + [&](const ceph::timespan& lat) { + ostringstream ostr; + ostr << ", lat = " << timespan_str(lat) + << " cid =" << c->cid + << " oid =" << o->oid; + return ostr.str(); + } + ); + dout(10) << __func__ << " " << c->cid << " " << o->oid << " = " << r << dendl; return r; } @@ -15105,7 +15295,7 @@ } size_t nonexistent_count = 0; ceph_assert((*c)->exists); - if ((*c)->onode_map.map_any([&](OnodeRef o) { + if ((*c)->onode_map.map_any([&](Onode* o) { if (o->exists) { dout(1) << __func__ << " " << o->oid << " " << o << " exists in onode_map" << dendl; @@ -15986,6 +16176,15 @@ return true; } +KeyValueDB::Transaction BlueStoreRepairer::fix_spanning_blobs(KeyValueDB* db) +{ + if (!fix_onode_txn) { + fix_onode_txn = db->get_transaction(); + } + ++to_repair_cnt; + return fix_onode_txn; +} + bool BlueStoreRepairer::preprocess_misreference(KeyValueDB *db) { if (misreferenced_extents.size()) { @@ -16021,6 +16220,10 @@ db->submit_transaction_sync(fix_misreferences_txn); fix_misreferences_txn = nullptr; } + if (fix_onode_txn) { + db->submit_transaction_sync(fix_onode_txn); + fix_onode_txn = nullptr; + } if (fix_shared_blob_txn) { db->submit_transaction_sync(fix_shared_blob_txn); fix_shared_blob_txn = nullptr; diff -Nru ceph-15.2.8/src/os/bluestore/BlueStore.h ceph-15.2.11/src/os/bluestore/BlueStore.h --- ceph-15.2.8/src/os/bluestore/BlueStore.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/BlueStore.h 2021-04-19 13:47:30.000000000 +0000 @@ -135,7 +135,10 @@ l_bluestore_omap_upper_bound_lat, l_bluestore_omap_lower_bound_lat, l_bluestore_omap_next_lat, + l_bluestore_omap_get_keys_lat, + l_bluestore_omap_get_values_lat, l_bluestore_clist_lat, + l_bluestore_remove_lat, l_bluestore_last }; @@ -1068,7 +1071,7 @@ bool cached; ///< Onode is logically in the cache /// (it can be pinned and hence physically out /// of it at the moment though) - bool pinned; ///< Onode is pinned + std::atomic_bool pinned; ///< Onode is pinned /// (or should be pinned when cached) ExtentMap extent_map; @@ -1211,20 +1214,7 @@ PerfCounters *logger); virtual void _add(Onode* o, int level) = 0; virtual void _rm(Onode* o) = 0; - - void pin(Onode* o, std::function validator) { - std::lock_guard l(lock); - if (validator()) { - _pin(o); - } - } - - void unpin(Onode* o, std::function validator) { - std::lock_guard l(lock); - if (validator()) { - _unpin(o); - } - } + virtual void _unpin_and_rm(Onode* o) = 0; virtual void move_pinned(OnodeCacheShard *to, Onode *o) = 0; virtual void add_stats(uint64_t *onodes, uint64_t *pinned_onodes) = 0; @@ -1285,8 +1275,8 @@ /// forward lookups mempool::bluestore_cache_meta::unordered_map onode_map; - friend class Collection; // for split_cache() - + friend struct Collection; // for split_cache() + friend struct Onode; // for put() friend struct LruOnodeCacheShard; void _remove(const ghobject_t& oid); public: @@ -1307,7 +1297,7 @@ void dump(CephContext *cct); /// return true if f true for any item - bool map_any(std::function f); + bool map_any(std::function f); }; class OpSequencer; @@ -2883,6 +2873,7 @@ void inject_misreference(coll_t cid1, ghobject_t oid1, coll_t cid2, ghobject_t oid2, uint64_t offset); + void inject_zombie_spanning_blob(coll_t cid, ghobject_t oid, int16_t blob_id); // resets global per_pool_omap in DB void inject_legacy_omap(); // resets per_pool_omap | pgmeta_omap for onode @@ -3530,6 +3521,7 @@ FreelistManager* fm, uint64_t offset, uint64_t len); bool fix_bluefs_extents(std::atomic& out_of_sync_flag); + KeyValueDB::Transaction fix_spanning_blobs(KeyValueDB* db); void init(uint64_t total_space, uint64_t lres_tracking_unit_size); @@ -3568,6 +3560,7 @@ KeyValueDB::Transaction fix_shared_blob_txn; KeyValueDB::Transaction fix_misreferences_txn; + KeyValueDB::Transaction fix_onode_txn; StoreSpaceTracker space_usage_tracker; diff -Nru ceph-15.2.8/src/os/bluestore/fastbmap_allocator_impl.cc ceph-15.2.11/src/os/bluestore/fastbmap_allocator_impl.cc --- ceph-15.2.8/src/os/bluestore/fastbmap_allocator_impl.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/fastbmap_allocator_impl.cc 2021-04-19 13:47:30.000000000 +0000 @@ -678,6 +678,9 @@ int64_t pos = l0_pos_start; slot_t bits = (slot_t)1 << (pos % d0); size_t idx = pos / d0; + if (idx >= l0.size()) { + return pos; + } slot_t* val_s = l0.data() + idx; int64_t pos_e = p2roundup(pos + 1, d0); diff -Nru ceph-15.2.8/src/os/bluestore/fastbmap_allocator_impl.h ceph-15.2.11/src/os/bluestore/fastbmap_allocator_impl.h --- ceph-15.2.8/src/os/bluestore/fastbmap_allocator_impl.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/fastbmap_allocator_impl.h 2021-04-19 13:47:30.000000000 +0000 @@ -708,7 +708,7 @@ return; } if (hint != 0) { - last_pos = (hint / d) < l2.size() ? p2align(hint, d) : 0; + last_pos = (hint / (d * l2_granularity)) < l2.size() ? p2align(hint / l2_granularity, d) : 0; } auto l2_pos = last_pos; auto last_pos0 = last_pos; diff -Nru ceph-15.2.8/src/os/bluestore/HybridAllocator.cc ceph-15.2.11/src/os/bluestore/HybridAllocator.cc --- ceph-15.2.8/src/os/bluestore/HybridAllocator.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/HybridAllocator.cc 2021-04-19 13:47:30.000000000 +0000 @@ -204,7 +204,7 @@ bmap_alloc = new BitmapAllocator(cct, get_capacity(), get_block_size(), - get_name()); + get_name() + ".fallback"); } bmap_alloc->init_add_free(start, size); } diff -Nru ceph-15.2.8/src/os/bluestore/KernelDevice.cc ceph-15.2.11/src/os/bluestore/KernelDevice.cc --- ceph-15.2.8/src/os/bluestore/KernelDevice.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/os/bluestore/KernelDevice.cc 2021-04-19 13:47:30.000000000 +0000 @@ -74,12 +74,25 @@ int KernelDevice::_lock() { dout(10) << __func__ << " " << fd_directs[WRITE_LIFE_NOT_SET] << dendl; - int r = ::flock(fd_directs[WRITE_LIFE_NOT_SET], LOCK_EX | LOCK_NB); - if (r < 0) { - derr << __func__ << " flock failed on " << path << dendl; - return -errno; + utime_t sleeptime; + sleeptime.set_from_double(cct->_conf->bdev_flock_retry_interval); + + // When the block changes, systemd-udevd will open the block, + // read some information and close it. Then a failure occurs here. + // So we need to try again here. + for (int i = 0; i < cct->_conf->bdev_flock_retry + 1; i++) { + int r = ::flock(fd_directs[WRITE_LIFE_NOT_SET], LOCK_EX | LOCK_NB); + if (r < 0 && errno == EAGAIN) { + dout(1) << __func__ << " flock busy on " << path << dendl; + sleeptime.sleep(); + } else if (r < 0) { + derr << __func__ << " flock failed on " << path << dendl; + break; + } else { + return 0; + } } - return 0; + return -errno; } int KernelDevice::open(const string& p) diff -Nru ceph-15.2.8/src/osd/PeeringState.cc ceph-15.2.11/src/osd/PeeringState.cc --- ceph-15.2.8/src/osd/PeeringState.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/osd/PeeringState.cc 2021-04-19 13:47:30.000000000 +0000 @@ -6304,7 +6304,10 @@ : my_base(ctx), NamedState(context< PeeringMachine >().state_history, "Started/ToDelete/Deleting") { + start = ceph::mono_clock::now(); + context< PeeringMachine >().log_enter(state_name); + DECLARE_LOCALS; ps->deleting = true; ObjectStore::Transaction &t = context().get_cur_transaction(); @@ -6325,7 +6328,8 @@ const DeleteSome& evt) { DECLARE_LOCALS; - pl->do_delete_work(context().get_cur_transaction()); + next = pl->do_delete_work(context().get_cur_transaction(), + next); return discard_event(); } @@ -6335,6 +6339,9 @@ DECLARE_LOCALS; ps->deleting = false; pl->cancel_local_background_io_reservation(); + psdout(20) << "Deleting::" << __func__ << this <<" finished in " + << ceph::mono_clock::now() - start + << dendl; } /*--------GetInfo---------*/ diff -Nru ceph-15.2.8/src/osd/PeeringState.h ceph-15.2.11/src/osd/PeeringState.h --- ceph-15.2.8/src/osd/PeeringState.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/osd/PeeringState.h 2021-04-19 13:47:30.000000000 +0000 @@ -379,7 +379,8 @@ /// Notification of removal complete, t must be populated to complete removal virtual void on_removal(ObjectStore::Transaction &t) = 0; /// Perform incremental removal work - virtual void do_delete_work(ObjectStore::Transaction &t) = 0; + virtual ghobject_t do_delete_work(ObjectStore::Transaction &t, + ghobject_t _next) = 0; // ======================= PG Merge ========================= virtual void clear_ready_to_merge() = 0; @@ -1220,6 +1221,8 @@ boost::statechart::custom_reaction< DeleteSome >, boost::statechart::transition > reactions; + ghobject_t next; + ceph::mono_clock::time_point start; explicit Deleting(my_context ctx); boost::statechart::result react(const DeleteSome &evt); void exit(); diff -Nru ceph-15.2.8/src/osd/PG.cc ceph-15.2.11/src/osd/PG.cc --- ceph-15.2.8/src/osd/PG.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/osd/PG.cc 2021-04-19 13:47:30.000000000 +0000 @@ -3812,7 +3812,8 @@ delete this; } -void PG::do_delete_work(ObjectStore::Transaction &t) +ghobject_t PG::do_delete_work(ObjectStore::Transaction &t, + ghobject_t _next) { dout(10) << __func__ << dendl; @@ -3838,25 +3839,45 @@ osd->sleep_timer.add_event_at(delete_schedule_time, delete_requeue_callback); dout(20) << __func__ << " Delete scheduled at " << delete_schedule_time << dendl; - return; + return _next; } } delete_needs_sleep = true; + ghobject_t next; + vector olist; int max = std::min(osd->store->get_ideal_list_max(), (int)cct->_conf->osd_target_transaction_size); - ghobject_t next; + osd->store->collection_list( ch, - next, + _next, ghobject_t::get_max(), max, &olist, &next); dout(20) << __func__ << " " << olist << dendl; + // make sure we've removed everything + // by one more listing from the beginning + if (_next != ghobject_t() && olist.empty()) { + next = ghobject_t(); + osd->store->collection_list( + ch, + next, + ghobject_t::get_max(), + max, + &olist, + &next); + if (!olist.empty()) { + dout(0) << __func__ << " additional unexpected onode list" + <<" (new onodes has appeared since PG removal started" + << olist << dendl; + } + } + OSDriver::OSTransaction _t(osdriver.get_transaction(&t)); int64_t num = 0; for (auto& oid : olist) { @@ -3879,7 +3900,6 @@ Context *fin = new C_DeleteMore(this, get_osdmap_epoch()); t.register_on_commit(fin); } else { - dout(20) << __func__ << " finished" << dendl; if (cct->_conf->osd_inject_failure_on_pg_removal) { _exit(1); } @@ -3914,6 +3934,7 @@ osd->logger->dec(l_osd_pg_removing); } } + return next; } int PG::pg_stat_adjust(osd_stat_t *ns) diff -Nru ceph-15.2.8/src/osd/PG.h ceph-15.2.11/src/osd/PG.h --- ceph-15.2.8/src/osd/PG.h 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/osd/PG.h 2021-04-19 13:47:30.000000000 +0000 @@ -469,7 +469,8 @@ return std::make_unique(this, &t); } - void do_delete_work(ObjectStore::Transaction &t) override; + ghobject_t do_delete_work(ObjectStore::Transaction &t, + ghobject_t _next) override; void clear_ready_to_merge() override; void set_not_ready_to_merge_target(pg_t pgid, pg_t src) override; diff -Nru ceph-15.2.8/src/osdc/ObjectCacher.cc ceph-15.2.11/src/osdc/ObjectCacher.cc --- ceph-15.2.8/src/osdc/ObjectCacher.cc 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/osdc/ObjectCacher.cc 2021-04-19 13:47:30.000000000 +0000 @@ -559,6 +559,7 @@ ceph_assert(ceph_mutex_is_locked(oc->lock)); ldout(oc->cct, 10) << "truncate " << *this << " to " << s << dendl; + std::list waiting_for_read; while (!data.empty()) { BufferHead *bh = data.rbegin()->second; if (bh->end() <= s) @@ -573,11 +574,18 @@ // remove bh entirely ceph_assert(bh->start() >= s); - ceph_assert(bh->waitfor_read.empty()); + for ([[maybe_unused]] auto& [off, ctxs] : bh->waitfor_read) { + waiting_for_read.splice(waiting_for_read.end(), ctxs); + } + bh->waitfor_read.clear(); replace_journal_tid(bh, 0); oc->bh_remove(this, bh); delete bh; } + if (!waiting_for_read.empty()) { + ldout(oc->cct, 10) << "restarting reads post-truncate" << dendl; + } + finish_contexts(oc->cct, waiting_for_read, 0); } void ObjectCacher::Object::discard(loff_t off, loff_t len, @@ -596,6 +604,7 @@ complete = false; } + std::list waiting_for_read; map::const_iterator p = data_lower_bound(off); while (p != data.end()) { BufferHead *bh = p->second; @@ -633,12 +642,19 @@ // we should mark all Rx bh to zero continue; } else { - ceph_assert(bh->waitfor_read.empty()); + for ([[maybe_unused]] auto& [off, ctxs] : bh->waitfor_read) { + waiting_for_read.splice(waiting_for_read.end(), ctxs); + } + bh->waitfor_read.clear(); } oc->bh_remove(this, bh); delete bh; } + if (!waiting_for_read.empty()) { + ldout(oc->cct, 10) << "restarting reads post-discard" << dendl; + } + finish_contexts(oc->cct, waiting_for_read, 0); /* restart reads */ } diff -Nru ceph-15.2.8/src/pybind/cephfs/cephfs.pyx ceph-15.2.11/src/pybind/cephfs/cephfs.pyx --- ceph-15.2.8/src/pybind/cephfs/cephfs.pyx 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/cephfs/cephfs.pyx 2021-04-19 13:47:30.000000000 +0000 @@ -1482,7 +1482,7 @@ ret = ceph_readlink(self.cluster, _path, buf, _size) if ret < 0: raise make_ex(ret, "error in readlink") - return buf + return buf[:ret] finally: free(buf) diff -Nru ceph-15.2.8/src/pybind/ceph_volume_client.py ceph-15.2.11/src/pybind/ceph_volume_client.py --- ceph-15.2.8/src/pybind/ceph_volume_client.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/ceph_volume_client.py 2021-04-19 13:47:30.000000000 +0000 @@ -167,10 +167,10 @@ )) ret, outb, outs = self._volume_client.fs.mds_command( "%s" % self.gid, - [json.dumps({ + json.dumps({ "prefix": "session evict", "filters": self._client_spec - })], "") + }), "") log.debug("mds_command: complete {0} {1}".format(ret, outs)) # If we get a clean response, great, it's gone from that rank. @@ -216,6 +216,7 @@ * 3 - Allow volumes to be created without RADOS namespace isolation * 4 - Added get_object_and_version, put_object_versioned method to CephFSVolumeClient * 5 - Disallow authorize API for users not created by CephFSVolumeClient + * 6 - The 'volumes' key in auth-metadata-file is changed to 'subvolumes'. """ @@ -239,7 +240,7 @@ """ # Current version - version = 5 + version = 6 # Where shall we create our volumes? POOL_PREFIX = "fsvolume_" @@ -335,7 +336,10 @@ for auth_id in auth_ids: with self._auth_lock(auth_id): auth_meta = self._auth_metadata_get(auth_id) - if not auth_meta or not auth_meta['volumes']: + # Update 'volumes' key (old style auth metadata file) to 'subvolumes' key + if auth_meta and 'volumes' in auth_meta: + auth_meta['subvolumes'] = auth_meta.pop('volumes') + if not auth_meta or not auth_meta['subvolumes']: # Clean up auth meta file self.fs.unlink(self._auth_metadata_path(auth_id)) continue @@ -351,7 +355,7 @@ """ remove_volumes = [] - for volume, volume_data in auth_meta['volumes'].items(): + for volume, volume_data in auth_meta['subvolumes'].items(): if not volume_data['dirty']: continue @@ -377,6 +381,8 @@ # VMeta update looks clean. Ceph auth update must have been # clean. if vol_meta['auths'][auth_id] == want_auth: + auth_meta['subvolumes'][volume]['dirty'] = False + self._auth_metadata_set(auth_id, auth_meta) continue readonly = access_level == 'r' @@ -395,13 +401,13 @@ # Recovered from partial auth updates for the auth ID's access # to a volume. - auth_meta['volumes'][volume]['dirty'] = False + auth_meta['subvolumes'][volume]['dirty'] = False self._auth_metadata_set(auth_id, auth_meta) for volume in remove_volumes: - del auth_meta['volumes'][volume] + del auth_meta['subvolumes'][volume] - if not auth_meta['volumes']: + if not auth_meta['subvolumes']: # Clean up auth meta file self.fs.unlink(self._auth_metadata_path(auth_id)) return @@ -895,7 +901,7 @@ decode the metadata, and 'version', the CephFSVolumeClient version that encoded the metadata. """ - data['compat_version'] = 1 + data['compat_version'] = 6 data['version'] = self.version return self._metadata_set(self._auth_metadata_path(auth_id), data) @@ -1003,9 +1009,9 @@ # Existing meta, or None, to be updated auth_meta = self._auth_metadata_get(auth_id) - # volume data to be inserted + # subvolume data to be inserted volume_path_str = str(volume_path) - volume = { + subvolume = { volume_path_str : { # The access level at which the auth_id is authorized to # access the volume. @@ -1028,9 +1034,13 @@ auth_meta = { 'dirty': True, 'tenant_id': tenant_id.__str__() if tenant_id else None, - 'volumes': volume + 'subvolumes': subvolume } else: + # Update 'volumes' key (old style auth metadata file) to 'subvolumes' key + if 'volumes' in auth_meta: + auth_meta['subvolumes'] = auth_meta.pop('volumes') + # Disallow tenants to share auth IDs if auth_meta['tenant_id'].__str__() != tenant_id.__str__(): msg = "auth ID: {0} is already in use".format(auth_id) @@ -1044,7 +1054,7 @@ tenant=auth_meta['tenant_id'] )) auth_meta['dirty'] = True - auth_meta['volumes'].update(volume) + auth_meta['subvolumes'].update(subvolume) self._auth_metadata_set(auth_id, auth_meta) @@ -1052,7 +1062,7 @@ key = self._authorize_volume(volume_path, auth_id, readonly, existing_caps) auth_meta['dirty'] = False - auth_meta['volumes'][volume_path_str]['dirty'] = False + auth_meta['subvolumes'][volume_path_str]['dirty'] = False self._auth_metadata_set(auth_id, auth_meta) if tenant_id: @@ -1209,8 +1219,12 @@ # Existing meta, or None, to be updated auth_meta = self._auth_metadata_get(auth_id) + # Update 'volumes' key (old style auth metadata file) to 'subvolumes' key + if auth_meta and 'volumes' in auth_meta: + auth_meta['subvolumes'] = auth_meta.pop('volumes') + volume_path_str = str(volume_path) - if (auth_meta is None) or (not auth_meta['volumes']): + if (auth_meta is None) or (not auth_meta['subvolumes']): log.warning("deauthorized called for already-removed auth" "ID '{auth_id}' for volume ID '{volume}'".format( auth_id=auth_id, volume=volume_path.volume_id @@ -1219,7 +1233,7 @@ self.fs.unlink(self._auth_metadata_path(auth_id)) return - if volume_path_str not in auth_meta['volumes']: + if volume_path_str not in auth_meta['subvolumes']: log.warning("deauthorized called for already-removed auth" "ID '{auth_id}' for volume ID '{volume}'".format( auth_id=auth_id, volume=volume_path.volume_id @@ -1230,16 +1244,16 @@ self._recover_auth_meta(auth_id, auth_meta) auth_meta['dirty'] = True - auth_meta['volumes'][volume_path_str]['dirty'] = True + auth_meta['subvolumes'][volume_path_str]['dirty'] = True self._auth_metadata_set(auth_id, auth_meta) self._deauthorize_volume(volume_path, auth_id) # Filter out the volume we're deauthorizing - del auth_meta['volumes'][volume_path_str] + del auth_meta['subvolumes'][volume_path_str] # Clean up auth meta file - if not auth_meta['volumes']: + if not auth_meta['subvolumes']: self.fs.unlink(self._auth_metadata_path(auth_id)) return diff -Nru ceph-15.2.8/src/pybind/mgr/balancer/module.py ceph-15.2.11/src/pybind/mgr/balancer/module.py --- ceph-15.2.8/src/pybind/mgr/balancer/module.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/balancer/module.py 2021-04-19 13:47:30.000000000 +0000 @@ -1006,10 +1006,8 @@ random.shuffle(adjusted_pools) pool_dump = osdmap_dump.get('pools', []) for pool in adjusted_pools: - num_pg = 0 for p in pool_dump: if p['pool_name'] == pool: - num_pg = p['pg_num'] pool_id = p['pool'] break @@ -1024,7 +1022,7 @@ if s['state_name'] == 'active+clean': num_pg_active_clean += s['count'] break - available = left - (num_pg - num_pg_active_clean) + available = min(left, num_pg_active_clean) did = plan.osdmap.calc_pg_upmaps(inc, max_deviation, available, [pool]) total_did += did left -= did diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/inventory.py ceph-15.2.11/src/pybind/mgr/cephadm/inventory.py --- ceph-15.2.8/src/pybind/mgr/cephadm/inventory.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/inventory.py 2021-04-19 13:47:30.000000000 +0000 @@ -9,7 +9,7 @@ import orchestrator from ceph.deployment import inventory from ceph.deployment.service_spec import ServiceSpec -from cephadm.utils import str_to_datetime, datetime_to_str +from ceph.utils import str_to_datetime, datetime_to_str, datetime_now from orchestrator import OrchestratorError, HostSpec, OrchestratorEvent if TYPE_CHECKING: @@ -23,12 +23,20 @@ class Inventory: + """ + The inventory stores a HostSpec for all hosts persistently. + """ + def __init__(self, mgr: 'CephadmOrchestrator'): self.mgr = mgr # load inventory i = self.mgr.get_store('inventory') if i: self._inventory: Dict[str, dict] = json.loads(i) + # handle old clusters missing 'hostname' key from hostspec + for k, v in self._inventory.items(): + if 'hostname' not in v: + v['hostname'] = k else: self._inventory = dict() logger.debug('Loaded inventory %s' % self._inventory) @@ -39,25 +47,25 @@ def __contains__(self, host: str) -> bool: return host in self._inventory - def assert_host(self, host): + def assert_host(self, host: str) -> None: if host not in self._inventory: raise OrchestratorError('host %s does not exist' % host) - def add_host(self, spec: HostSpec): + def add_host(self, spec: HostSpec) -> None: self._inventory[spec.hostname] = spec.to_json() self.save() - def rm_host(self, host: str): + def rm_host(self, host: str) -> None: self.assert_host(host) del self._inventory[host] self.save() - def set_addr(self, host, addr): + def set_addr(self, host: str, addr: str) -> None: self.assert_host(host) self._inventory[host]['addr'] = addr self.save() - def add_label(self, host, label): + def add_label(self, host: str, label: str) -> None: self.assert_host(host) if 'labels' not in self._inventory[host]: @@ -66,7 +74,7 @@ self._inventory[host]['labels'].append(label) self.save() - def rm_label(self, host, label): + def rm_label(self, host: str, label: str) -> None: self.assert_host(host) if 'labels' not in self._inventory[host]: @@ -75,7 +83,7 @@ self._inventory[host]['labels'].remove(label) self.save() - def get_addr(self, host) -> str: + def get_addr(self, host: str) -> str: self.assert_host(host) return self._inventory[host].get('addr', host) @@ -87,7 +95,7 @@ else: yield h - def spec_from_dict(self, info) -> HostSpec: + def spec_from_dict(self, info: dict) -> HostSpec: hostname = info['hostname'] return HostSpec( hostname, @@ -99,7 +107,7 @@ def all_specs(self) -> List[HostSpec]: return list(map(self.spec_from_dict, self._inventory.values())) - def save(self): + def save(self) -> None: self.mgr.set_store('inventory', json.dumps(self._inventory)) @@ -134,7 +142,7 @@ self.spec_preview[spec.service_name()] = spec return None self.specs[spec.service_name()] = spec - self.spec_created[spec.service_name()] = datetime.datetime.utcnow() + self.spec_created[spec.service_name()] = datetime_now() self.mgr.set_store( SPEC_STORE_PREFIX + spec.service_name(), json.dumps({ @@ -166,12 +174,44 @@ class HostCache(): + """ + HostCache stores different things: + + 1. `daemons`: Deployed daemons O(daemons) + + They're part of the configuration nowadays and need to be + persistent. The name "daemon cache" is unfortunately a bit misleading. + Like for example we really need to know where daemons are deployed on + hosts that are offline. + + 2. `devices`: ceph-volume inventory cache O(hosts) + + As soon as this is populated, it becomes more or less read-only. + + 3. `networks`: network interfaces for each host. O(hosts) + + This is needed in order to deploy MONs. As this is mostly read-only. + + 4. `last_etc_ceph_ceph_conf` O(hosts) + + Stores the last refresh time for the /etc/ceph/ceph.conf. Used + to avoid deploying new configs when failing over to a new mgr. + + 5. `scheduled_daemon_actions`: O(daemons) + + Used to run daemon actions after deploying a daemon. We need to + store it persistently, in order to stay consistent across + MGR failovers. + """ + def __init__(self, mgr): # type: (CephadmOrchestrator) -> None self.mgr: CephadmOrchestrator = mgr self.daemons = {} # type: Dict[str, Dict[str, orchestrator.DaemonDescription]] self.last_daemon_update = {} # type: Dict[str, datetime.datetime] self.devices = {} # type: Dict[str, List[inventory.Device]] + self.facts = {} # type: Dict[str, Dict[str, Any]] + self.last_facts_update = {} # type: Dict[str, datetime.datetime] self.osdspec_previews = {} # type: Dict[str, List[Dict[str, Any]]] self.networks = {} # type: Dict[str, Dict[str, List[str]]] self.last_device_update = {} # type: Dict[str, datetime.datetime] @@ -244,15 +284,20 @@ def update_host_daemons(self, host, dm): # type: (str, Dict[str, orchestrator.DaemonDescription]) -> None self.daemons[host] = dm - self.last_daemon_update[host] = datetime.datetime.utcnow() + self.last_daemon_update[host] = datetime_now() + + def update_host_facts(self, host, facts): + # type: (str, Dict[str, Dict[str, Any]]) -> None + self.facts[host] = facts + self.last_facts_update[host] = datetime.datetime.utcnow() def update_host_devices_networks(self, host, dls, nets): # type: (str, List[inventory.Device], Dict[str,List[str]]) -> None self.devices[host] = dls self.networks[host] = nets - self.last_device_update[host] = datetime.datetime.utcnow() + self.last_device_update[host] = datetime_now() - def update_daemon_config_deps(self, host, name, deps, stamp): + def update_daemon_config_deps(self, host: str, name: str, deps: List[str], stamp: datetime.datetime) -> None: self.daemon_config_deps[host][name] = { 'deps': deps, 'last_config': stamp, @@ -260,7 +305,7 @@ def update_last_host_check(self, host): # type: (str) -> None - self.last_host_check[host] = datetime.datetime.utcnow() + self.last_host_check[host] = datetime_now() def prime_empty_host(self, host): # type: (str) -> None @@ -291,7 +336,7 @@ del self.last_device_update[host] self.mgr.event.set() - def distribute_new_registry_login_info(self): + def distribute_new_registry_login_info(self) -> None: self.registry_login_queue = set(self.mgr.inventory.keys()) def save_host(self, host: str) -> None: @@ -305,17 +350,21 @@ j['last_daemon_update'] = datetime_to_str(self.last_daemon_update[host]) if host in self.last_device_update: j['last_device_update'] = datetime_to_str(self.last_device_update[host]) - for name, dd in self.daemons[host].items(): - j['daemons'][name] = dd.to_json() - for d in self.devices[host]: - j['devices'].append(d.to_json()) - j['networks'] = self.networks[host] - for name, depi in self.daemon_config_deps[host].items(): - j['daemon_config_deps'][name] = { - 'deps': depi.get('deps', []), - 'last_config': datetime_to_str(depi['last_config']), - } - if self.osdspec_previews[host]: + if host in self.daemons: + for name, dd in self.daemons[host].items(): + j['daemons'][name] = dd.to_json() + if host in self.devices: + for d in self.devices[host]: + j['devices'].append(d.to_json()) + if host in self.networks: + j['networks'] = self.networks[host] + if host in self.daemon_config_deps: + for name, depi in self.daemon_config_deps[host].items(): + j['daemon_config_deps'][name] = { + 'deps': depi.get('deps', []), + 'last_config': datetime_to_str(depi['last_config']), + } + if host in self.osdspec_previews and self.osdspec_previews[host]: j['osdspec_previews'] = self.osdspec_previews[host] if host in self.last_host_check: @@ -323,7 +372,7 @@ if host in self.last_etc_ceph_ceph_conf: j['last_etc_ceph_ceph_conf'] = datetime_to_str(self.last_etc_ceph_ceph_conf[host]) - if self.scheduled_daemon_actions.get(host, {}): + if host in self.scheduled_daemon_actions: j['scheduled_daemon_actions'] = self.scheduled_daemon_actions[host] self.mgr.set_store(HOST_CACHE_PREFIX + host, json.dumps(j)) @@ -334,6 +383,10 @@ del self.daemons[host] if host in self.devices: del self.devices[host] + if host in self.facts: + del self.facts[host] + if host in self.last_facts_update: + del self.last_facts_update[host] if host in self.osdspec_previews: del self.osdspec_previews[host] if host in self.loading_osdspec_preview: @@ -373,7 +426,7 @@ raise orchestrator.OrchestratorError(f'Unable to find {daemon_name} daemon(s)') def get_daemons_with_volatile_status(self) -> Iterator[Tuple[str, Dict[str, orchestrator.DaemonDescription]]]: - def alter(host, dd_orig: orchestrator.DaemonDescription) -> orchestrator.DaemonDescription: + def alter(host: str, dd_orig: orchestrator.DaemonDescription) -> orchestrator.DaemonDescription: dd = copy(dd_orig) if host in self.mgr.offline_hosts: dd.status = -1 @@ -410,7 +463,7 @@ r.append(name) return r - def get_daemon_last_config_deps(self, host, name) -> Tuple[Optional[List[str]], Optional[datetime.datetime]]: + def get_daemon_last_config_deps(self, host: str, name: str) -> Tuple[Optional[List[str]], Optional[datetime.datetime]]: if host in self.daemon_config_deps: if name in self.daemon_config_deps[host]: return self.daemon_config_deps[host][name].get('deps', []), \ @@ -425,12 +478,23 @@ if host in self.daemon_refresh_queue: self.daemon_refresh_queue.remove(host) return True - cutoff = datetime.datetime.utcnow() - datetime.timedelta( + cutoff = datetime_now() - datetime.timedelta( seconds=self.mgr.daemon_cache_timeout) if host not in self.last_daemon_update or self.last_daemon_update[host] < cutoff: return True return False + def host_needs_facts_refresh(self, host): + # type: (str) -> bool + if host in self.mgr.offline_hosts: + logger.debug(f'Host "{host}" marked as offline. Skipping gather facts refresh') + return False + cutoff = datetime.datetime.utcnow() - datetime.timedelta( + seconds=self.mgr.facts_cache_timeout) + if host not in self.last_facts_update or self.last_facts_update[host] < cutoff: + return True + return False + def host_had_daemon_refresh(self, host: str) -> bool: """ ... at least once. @@ -449,13 +513,13 @@ if host in self.device_refresh_queue: self.device_refresh_queue.remove(host) return True - cutoff = datetime.datetime.utcnow() - datetime.timedelta( + cutoff = datetime_now() - datetime.timedelta( seconds=self.mgr.device_cache_timeout) if host not in self.last_device_update or self.last_device_update[host] < cutoff: return True return False - def host_needs_osdspec_preview_refresh(self, host): + def host_needs_osdspec_preview_refresh(self, host: str) -> bool: if host in self.mgr.offline_hosts: logger.debug(f'Host "{host}" marked as offline. Skipping osdspec preview refresh') return False @@ -468,11 +532,11 @@ def host_needs_check(self, host): # type: (str) -> bool - cutoff = datetime.datetime.utcnow() - datetime.timedelta( + cutoff = datetime_now() - datetime.timedelta( seconds=self.mgr.host_check_interval) return host not in self.last_host_check or self.last_host_check[host] < cutoff - def host_needs_new_etc_ceph_ceph_conf(self, host: str): + def host_needs_new_etc_ceph_ceph_conf(self, host: str) -> bool: if not self.mgr.manage_etc_ceph_ceph_conf: return False if self.mgr.paused: @@ -490,10 +554,10 @@ # already up to date: return False - def update_last_etc_ceph_ceph_conf(self, host: str): + def update_last_etc_ceph_ceph_conf(self, host: str) -> None: if not self.mgr.last_monmap: return - self.last_etc_ceph_ceph_conf[host] = datetime.datetime.utcnow() + self.last_etc_ceph_ceph_conf[host] = datetime_now() def host_needs_registry_login(self, host: str) -> bool: if host in self.mgr.offline_hosts: @@ -508,12 +572,12 @@ assert host in self.daemons self.daemons[host][dd.name()] = dd - def rm_daemon(self, host, name): + def rm_daemon(self, host: str, name: str) -> None: if host in self.daemons: if name in self.daemons[host]: del self.daemons[host][name] - def daemon_cache_filled(self): + def daemon_cache_filled(self) -> bool: """ i.e. we have checked the daemons for each hosts at least once. excluding offline hosts. @@ -524,7 +588,7 @@ return all((self.host_had_daemon_refresh(h) or h in self.mgr.offline_hosts) for h in self.get_hosts()) - def schedule_daemon_action(self, host: str, daemon_name: str, action: str): + def schedule_daemon_action(self, host: str, daemon_name: str, action: str) -> None: priorities = { 'start': 1, 'restart': 2, @@ -542,14 +606,14 @@ self.scheduled_daemon_actions[host] = {} self.scheduled_daemon_actions[host][daemon_name] = action - def rm_scheduled_daemon_action(self, host: str, daemon_name: str): + def rm_scheduled_daemon_action(self, host: str, daemon_name: str) -> None: if host in self.scheduled_daemon_actions: if daemon_name in self.scheduled_daemon_actions[host]: del self.scheduled_daemon_actions[host][daemon_name] if not self.scheduled_daemon_actions[host]: del self.scheduled_daemon_actions[host] - def get_scheduled_daemon_action(self, host, daemon) -> Optional[str]: + def get_scheduled_daemon_action(self, host: str, daemon: str) -> Optional[str]: return self.scheduled_daemon_actions.get(host, {}).get(daemon) @@ -573,26 +637,26 @@ # limit to five events for now. self.events[event.kind_subject()] = self.events[event.kind_subject()][-5:] - def for_service(self, spec: ServiceSpec, level, message) -> None: - e = OrchestratorEvent(datetime.datetime.utcnow(), 'service', + def for_service(self, spec: ServiceSpec, level: str, message: str) -> None: + e = OrchestratorEvent(datetime_now(), 'service', spec.service_name(), level, message) self.add(e) - def from_orch_error(self, e: OrchestratorError): + def from_orch_error(self, e: OrchestratorError) -> None: if e.event_subject is not None: self.add(OrchestratorEvent( - datetime.datetime.utcnow(), + datetime_now(), e.event_subject[0], e.event_subject[1], "ERROR", str(e) )) - def for_daemon(self, daemon_name, level, message): - e = OrchestratorEvent(datetime.datetime.utcnow(), 'daemon', daemon_name, level, message) + def for_daemon(self, daemon_name: str, level: str, message: str) -> None: + e = OrchestratorEvent(datetime_now(), 'daemon', daemon_name, level, message) self.add(e) - def for_daemon_from_exception(self, daemon_name, e: Exception): + def for_daemon_from_exception(self, daemon_name: str, e: Exception) -> None: self.for_daemon( daemon_name, "ERROR", @@ -617,8 +681,8 @@ for k_s in unknowns: del self.events[k_s] - def get_for_service(self, name) -> List[OrchestratorEvent]: + def get_for_service(self, name: str) -> List[OrchestratorEvent]: return self.events.get('service:' + name, []) - def get_for_daemon(self, name) -> List[OrchestratorEvent]: + def get_for_daemon(self, name: str) -> List[OrchestratorEvent]: return self.events.get('daemon:' + name, []) diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/migrations.py ceph-15.2.11/src/pybind/mgr/cephadm/migrations.py --- ceph-15.2.8/src/pybind/mgr/cephadm/migrations.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/migrations.py 2021-04-19 13:47:30.000000000 +0000 @@ -36,20 +36,20 @@ # let's try to shortcut things here. self.migrate() - def set(self, val): + def set(self, val: int) -> None: self.mgr.set_module_option('migration_current', val) self.mgr.migration_current = val - def is_migration_ongoing(self): + def is_migration_ongoing(self) -> bool: return self.mgr.migration_current != LAST_MIGRATION - def verify_no_migration(self): + def verify_no_migration(self) -> None: if self.is_migration_ongoing(): # this is raised in module.serve() raise OrchestratorError( "cephadm migration still ongoing. Please wait, until the migration is complete.") - def migrate(self): + def migrate(self) -> None: if self.mgr.migration_current == 0: if self.migrate_0_1(): self.set(1) diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/module.py ceph-15.2.11/src/pybind/mgr/cephadm/module.py --- ceph-15.2.8/src/pybind/mgr/cephadm/module.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/module.py 2021-04-19 13:47:30.000000000 +0000 @@ -26,7 +26,8 @@ from ceph.deployment.drive_group import DriveGroupSpec from ceph.deployment.service_spec import \ NFSServiceSpec, ServiceSpec, PlacementSpec, assert_valid_host, \ - CustomContainerSpec + CustomContainerSpec, HostPlacementSpec +from ceph.utils import str_to_datetime, datetime_to_str, datetime_now from cephadm.serve import CephadmServe from cephadm.services.cephadmservice import CephadmDaemonSpec @@ -44,15 +45,14 @@ from .services.container import CustomContainerService from .services.iscsi import IscsiService from .services.nfs import NFSService -from .services.osd import RemoveUtil, OSDQueue, OSDService, OSD, NotFoundError +from .services.osd import RemoveUtil, OSDRemovalQueue, OSDService, OSD, NotFoundError from .services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \ NodeExporterService from .schedule import HostAssignment from .inventory import Inventory, SpecStore, HostCache, EventStore from .upgrade import CEPH_UPGRADE_ORDER, CephadmUpgrade from .template import TemplateMgr -from .utils import forall_hosts, CephadmNoImage, cephadmNoImage, \ - str_to_datetime, datetime_to_str +from .utils import forall_hosts, CephadmNoImage, cephadmNoImage try: import remoto @@ -60,7 +60,7 @@ # (https://github.com/alfredodeza/remoto/pull/56) lands from distutils.version import StrictVersion if StrictVersion(remoto.__version__) <= StrictVersion('1.2'): - def remoto_has_connection(self): + def remoto_has_connection(self: Any) -> bool: return self.gateway.hasreceiver() from remoto.backends import BaseConnection @@ -88,13 +88,11 @@ ConnectTimeout=30 """ -CEPH_DATEFMT = '%Y-%m-%dT%H:%M:%S.%fZ' - CEPH_TYPES = set(CEPH_UPGRADE_ORDER) class CephadmCompletion(orchestrator.Completion[T]): - def evaluate(self): + def evaluate(self) -> None: self.finalize(None) @@ -105,7 +103,7 @@ """ @wraps(f) - def wrapper(*args, **kwargs): + def wrapper(*args: Any, **kwargs: Any) -> CephadmCompletion: return CephadmCompletion(on_complete=lambda _: f(*args, **kwargs)) return wrapper @@ -144,6 +142,12 @@ 'desc': 'seconds to cache service (daemon) inventory', }, { + 'name': 'facts_cache_timeout', + 'type': 'secs', + 'default': 1 * 60, + 'desc': 'seconds to cache host facts data', + }, + { 'name': 'host_check_interval', 'type': 'secs', 'default': 10 * 60, @@ -169,7 +173,7 @@ }, { 'name': 'container_image_grafana', - 'default': 'docker.io/ceph/ceph-grafana:6.6.2', + 'default': 'docker.io/ceph/ceph-grafana:6.7.4', 'desc': 'Prometheus container image', }, { @@ -275,7 +279,7 @@ } ] - def __init__(self, *args, **kwargs): + def __init__(self, *args: Any, **kwargs: Any): super(CephadmOrchestrator, self).__init__(*args, **kwargs) self._cluster_fsid = self.get('mon_map')['fsid'] self.last_monmap: Optional[datetime.datetime] = None @@ -294,6 +298,7 @@ self.ssh_config_file = None # type: Optional[str] self.device_cache_timeout = 0 self.daemon_cache_timeout = 0 + self.facts_cache_timeout = 0 self.host_check_interval = 0 self.mode = '' self.container_image_base = '' @@ -307,7 +312,7 @@ self.allow_ptrace = False self.container_init = False self.prometheus_alerts_path = '' - self.migration_current = None + self.migration_current: Optional[int] = None self.config_dashboard = True self.manage_etc_ceph_ceph_conf = True self.registry_url: Optional[str] = None @@ -337,7 +342,7 @@ self.upgrade = CephadmUpgrade(self) - self.health_checks = {} + self.health_checks: Dict[str, dict] = {} self.all_progress_references = list() # type: List[orchestrator.ProgressReference] @@ -346,9 +351,8 @@ self.cache = HostCache(self) self.cache.load() - self.rm_util = RemoveUtil(self) - self.to_remove_osds = OSDQueue() - self.rm_util.load_from_store() + self.to_remove_osds = OSDRemovalQueue(self) + self.to_remove_osds.load_from_store() self.spec_store = SpecStore(self) self.spec_store.load() @@ -401,9 +405,9 @@ self.template = TemplateMgr(self) - self.requires_post_actions = set() + self.requires_post_actions: Set[str] = set() - def shutdown(self): + def shutdown(self) -> None: self.log.debug('shutdown') self._worker_pool.close() self._worker_pool.join() @@ -414,22 +418,25 @@ assert service_type in ServiceSpec.KNOWN_SERVICE_TYPES return self.cephadm_services[service_type] - def _kick_serve_loop(self): + def _kick_serve_loop(self) -> None: self.log.debug('_kick_serve_loop') self.event.set() # function responsible for logging single host into custom registry - def _registry_login(self, host, url, username, password): + def _registry_login(self, host: str, url: Optional[str], username: Optional[str], password: Optional[str]) -> Optional[str]: self.log.debug(f"Attempting to log host {host} into custom registry @ {url}") # want to pass info over stdin rather than through normal list of args - args_str = ("{\"url\": \"" + url + "\", \"username\": \"" + username + "\", " - " \"password\": \"" + password + "\"}") + args_str = json.dumps({ + 'url': url, + 'username': username, + 'password': password, + }) out, err, code = self._run_cephadm( host, 'mon', 'registry-login', ['--registry-json', '-'], stdin=args_str, error_ok=True) if code: return f"Host {host} failed to login to {url} as {username} with given password" - return + return None def serve(self) -> None: """ @@ -441,7 +448,7 @@ serve = CephadmServe(self) serve.serve() - def set_container_image(self, entity: str, image): + def set_container_image(self, entity: str, image: str) -> None: self.check_mon_command({ 'prefix': 'config set', 'name': 'container_image', @@ -449,7 +456,7 @@ 'who': entity, }) - def config_notify(self): + def config_notify(self) -> None: """ This method is called whenever one of our config options is changed. @@ -469,13 +476,12 @@ self.event.set() - def notify(self, notify_type, notify_id): + def notify(self, notify_type: str, notify_id: Optional[str]) -> None: if notify_type == "mon_map": # get monmap mtime so we can refresh configs when mons change monmap = self.get('mon_map') - self.last_monmap = datetime.datetime.strptime( - monmap['modified'], CEPH_DATEFMT) - if self.last_monmap and self.last_monmap > datetime.datetime.utcnow(): + self.last_monmap = str_to_datetime(monmap['modified']) + if self.last_monmap and self.last_monmap > datetime_now(): self.last_monmap = None # just in case clocks are skewed if getattr(self, 'manage_etc_ceph_ceph_conf', False): # getattr, due to notify() being called before config_notify() @@ -483,7 +489,7 @@ if notify_type == "pg_summary": self._trigger_osd_removal() - def _trigger_osd_removal(self): + def _trigger_osd_removal(self) -> None: data = self.get("osd_stats") for osd in data.get('osd_stats', []): if osd.get('num_pgs') == 0: @@ -493,9 +499,9 @@ self.log.debug(f"Found empty osd. Starting removal process") # if the osd that is now empty is also part of the removal queue # start the process - self.rm_util.process_removal_queue() + self._kick_serve_loop() - def pause(self): + def pause(self) -> None: if not self.paused: self.log.info('Paused') self.set_store('pause', 'true') @@ -503,7 +509,7 @@ # wake loop so we update the health status self._kick_serve_loop() - def resume(self): + def resume(self) -> None: if self.paused: self.log.info('Resumed') self.paused = False @@ -548,7 +554,7 @@ continue return name - def _reconfig_ssh(self): + def _reconfig_ssh(self) -> None: temp_files = [] # type: list ssh_options = [] # type: List[str] @@ -599,7 +605,7 @@ self._reset_cons() - def validate_ssh_config_content(self, ssh_config): + def validate_ssh_config_content(self, ssh_config: Optional[str]) -> None: if ssh_config is None or len(ssh_config.strip()) == 0: raise OrchestratorValidationError('ssh_config cannot be empty') # StrictHostKeyChecking is [yes|no] ? @@ -610,38 +616,38 @@ if 'ask' in s.lower(): raise OrchestratorValidationError(f'ssh_config cannot contain: \'{s}\'') - def validate_ssh_config_fname(self, ssh_config_fname): + def validate_ssh_config_fname(self, ssh_config_fname: str) -> None: if not os.path.isfile(ssh_config_fname): raise OrchestratorValidationError("ssh_config \"{}\" does not exist".format( ssh_config_fname)) - def _reset_con(self, host): + def _reset_con(self, host: str) -> None: conn, r = self._cons.get(host, (None, None)) if conn: self.log.debug('_reset_con close %s' % host) conn.exit() del self._cons[host] - def _reset_cons(self): + def _reset_cons(self) -> None: for host, conn_and_r in self._cons.items(): self.log.debug('_reset_cons close %s' % host) conn, r = conn_and_r conn.exit() self._cons = {} - def offline_hosts_remove(self, host): + def offline_hosts_remove(self, host: str) -> None: if host in self.offline_hosts: self.offline_hosts.remove(host) @staticmethod - def can_run(): + def can_run() -> Tuple[bool, str]: if remoto is not None: return True, "" else: return False, "loading remoto library:{}".format( remoto_import_error) - def available(self): + def available(self) -> Tuple[bool, str]: """ The cephadm orchestrator is always available. """ @@ -652,7 +658,7 @@ return False, 'SSH keys not set. Use `ceph cephadm set-priv-key` and `ceph cephadm set-pub-key` or `ceph cephadm generate-key`' return True, '' - def process(self, completions): + def process(self, completions: List[CephadmCompletion]) -> None: """ Does nothing, as completions are processed in another thread. """ @@ -666,7 +672,7 @@ @orchestrator._cli_write_command( prefix='cephadm set-ssh-config', desc='Set the ssh_config file (use -i )') - def _set_ssh_config(self, inbuf=None): + def _set_ssh_config(self, inbuf: Optional[str] = None) -> Tuple[int, str, str]: """ Set an ssh_config file provided from stdin """ @@ -681,7 +687,7 @@ @orchestrator._cli_write_command( prefix='cephadm clear-ssh-config', desc='Clear the ssh_config file') - def _clear_ssh_config(self): + def _clear_ssh_config(self) -> Tuple[int, str, str]: """ Clear the ssh_config file provided from stdin """ @@ -695,7 +701,7 @@ prefix='cephadm get-ssh-config', desc='Returns the ssh config as used by cephadm' ) - def _get_ssh_config(self): + def _get_ssh_config(self) -> HandleCommandResult: if self.ssh_config_file: self.validate_ssh_config_fname(self.ssh_config_file) with open(self.ssh_config_file) as f: @@ -708,7 +714,7 @@ @orchestrator._cli_write_command( 'cephadm generate-key', desc='Generate a cluster SSH key (if not present)') - def _generate_key(self): + def _generate_key(self) -> Tuple[int, str, str]: if not self.ssh_pub or not self.ssh_key: self.log.info('Generating ssh key...') tmp_dir = TemporaryDirectory() @@ -736,7 +742,7 @@ @orchestrator._cli_write_command( 'cephadm set-priv-key', desc='Set cluster SSH private key (use -i )') - def _set_priv_key(self, inbuf=None): + def _set_priv_key(self, inbuf: Optional[str] = None) -> Tuple[int, str, str]: if inbuf is None or len(inbuf) == 0: return -errno.EINVAL, "", "empty private ssh key provided" if inbuf == self.ssh_key: @@ -749,7 +755,7 @@ @orchestrator._cli_write_command( 'cephadm set-pub-key', desc='Set cluster SSH public key (use -i )') - def _set_pub_key(self, inbuf=None): + def _set_pub_key(self, inbuf: Optional[str] = None) -> Tuple[int, str, str]: if inbuf is None or len(inbuf) == 0: return -errno.EINVAL, "", "empty public ssh key provided" if inbuf == self.ssh_pub: @@ -762,7 +768,7 @@ @orchestrator._cli_write_command( 'cephadm clear-key', desc='Clear cluster SSH key') - def _clear_key(self): + def _clear_key(self) -> Tuple[int, str, str]: self.set_store('ssh_identity_key', None) self.set_store('ssh_identity_pub', None) self._reconfig_ssh() @@ -772,7 +778,7 @@ @orchestrator._cli_read_command( 'cephadm get-pub-key', desc='Show SSH public key for connecting to cluster hosts') - def _get_pub_key(self): + def _get_pub_key(self) -> Tuple[int, str, str]: if self.ssh_pub: return 0, self.ssh_pub, '' else: @@ -781,14 +787,14 @@ @orchestrator._cli_read_command( 'cephadm get-user', desc='Show user for SSHing to cluster hosts') - def _get_user(self): + def _get_user(self) -> Tuple[int, str, str]: return 0, self.ssh_user, '' @orchestrator._cli_read_command( 'cephadm set-user', 'name=user,type=CephString', 'Set user for SSHing to cluster hosts, passwordless sudo will be needed for non-root users') - def set_ssh_user(self, user): + def set_ssh_user(self, user: str) -> Tuple[int, str, str]: current_user = self.ssh_user if user == current_user: return 0, "value unchanged", "" @@ -816,12 +822,13 @@ "name=username,type=CephString,req=false " "name=password,type=CephString,req=false", 'Set custom registry login info by providing url, username and password or json file with login info (-i )') - def registry_login(self, url=None, username=None, password=None, inbuf=None): + def registry_login(self, url: Optional[str] = None, username: Optional[str] = None, password: Optional[str] = None, inbuf: Optional[str] = None) -> Tuple[int, str, str]: # if password not given in command line, get it through file input if not (url and username and password) and (inbuf is None or len(inbuf) == 0): return -errno.EINVAL, "", ("Invalid arguments. Please provide arguments " "or -i ") elif not (url and username and password): + assert isinstance(inbuf, str) login_info = json.loads(inbuf) if "url" in login_info and "username" in login_info and "password" in login_info: url = login_info["url"] @@ -859,7 +866,7 @@ 'name=host,type=CephString ' 'name=addr,type=CephString,req=false', 'Check whether we can access and manage a remote host') - def check_host(self, host, addr=None): + def check_host(self, host: str, addr: Optional[str] = None) -> Tuple[int, str, str]: try: out, err, code = self._run_cephadm(host, cephadmNoImage, 'check-host', ['--expect-hostname', host], @@ -877,14 +884,14 @@ for item in self.health_checks['CEPHADM_HOST_CHECK_FAILED']['detail']: if item.startswith('host %s ' % host): self.event.set() - return 0, '%s (%s) ok' % (host, addr), err + return 0, '%s (%s) ok' % (host, addr), '\n'.join(err) @orchestrator._cli_read_command( 'cephadm prepare-host', 'name=host,type=CephString ' 'name=addr,type=CephString,req=false', 'Prepare a remote host for use with cephadm') - def _prepare_host(self, host, addr=None): + def _prepare_host(self, host: str, addr: Optional[str] = None) -> Tuple[int, str, str]: out, err, code = self._run_cephadm(host, cephadmNoImage, 'prepare-host', ['--expect-hostname', host], addr=addr, @@ -897,7 +904,7 @@ for item in self.health_checks['CEPHADM_HOST_CHECK_FAILED']['detail']: if item.startswith('host %s ' % host): self.event.set() - return 0, '%s (%s) ok' % (host, addr), err + return 0, '%s (%s) ok' % (host, addr), '\n'.join(err) @orchestrator._cli_write_command( prefix='cephadm set-extra-ceph-conf', @@ -905,7 +912,7 @@ "Mainly a workaround, till `config generate-minimal-conf` generates\n" "a complete ceph.conf.\n\n" "Warning: this is a dangerous operation.") - def _set_extra_ceph_conf(self, inbuf=None) -> HandleCommandResult: + def _set_extra_ceph_conf(self, inbuf: Optional[str] = None) -> HandleCommandResult: if inbuf: # sanity check. cp = ConfigParser() @@ -913,7 +920,7 @@ self.set_store("extra_ceph_conf", json.dumps({ 'conf': inbuf, - 'last_modified': datetime_to_str(datetime.datetime.utcnow()) + 'last_modified': datetime_to_str(datetime_now()) })) self.log.info('Set extra_ceph_conf') self._kick_serve_loop() @@ -936,7 +943,8 @@ try: j = json.loads(data) except ValueError: - self.log.exception('unable to laod extra_ceph_conf') + msg = 'Unable to load extra_ceph_conf: Cannot decode JSON' + self.log.exception('%s: \'%s\'', msg, data) return CephadmOrchestrator.ExtraCephConf('', None) return CephadmOrchestrator.ExtraCephConf(j['conf'], str_to_datetime(j['last_modified'])) @@ -946,7 +954,8 @@ return False return conf.last_modified > dt - def _get_connection(self, host: str): + def _get_connection(self, host: str) -> Tuple['remoto.backends.BaseConnection', + 'remoto.backends.LegacyModuleExecute']: """ Setup a connection for running commands on remote host. """ @@ -973,7 +982,7 @@ return conn, r - def _executable_path(self, conn, executable): + def _executable_path(self, conn: 'remoto.backends.BaseConnection', executable: str) -> str: """ Remote validator that accepts a connection object to ensure that a certain executable is available returning its full path if so. @@ -1019,7 +1028,10 @@ self._reset_con(host) user = self.ssh_user if self.mode == 'root' else 'cephadm' - msg = f'''Failed to connect to {host} ({addr}). + if str(e).startswith("Can't communicate"): + msg = str(e) + else: + msg = f'''Failed to connect to {host} ({addr}). Please make sure that the host is reachable and accepts connections using the cephadm SSH key To add the cephadm SSH key to the host: @@ -1213,7 +1225,7 @@ return "Removed host '{}'".format(host) @trivial_completion - def update_host_addr(self, host, addr) -> str: + def update_host_addr(self, host: str, addr: str) -> str: self.inventory.set_addr(host, addr) self._reset_con(host) self.event.set() # refresh stray health check @@ -1232,19 +1244,19 @@ return list(self.inventory.all_specs()) @trivial_completion - def add_host_label(self, host, label) -> str: + def add_host_label(self, host: str, label: str) -> str: self.inventory.add_label(host, label) self.log.info('Added label %s to host %s' % (label, host)) return 'Added label %s to host %s' % (label, host) @trivial_completion - def remove_host_label(self, host, label) -> str: + def remove_host_label(self, host: str, label: str) -> str: self.inventory.rm_label(host, label) self.log.info('Removed label %s to host %s' % (label, host)) return 'Removed label %s from host %s' % (label, host) @trivial_completion - def host_ok_to_stop(self, hostname: str): + def host_ok_to_stop(self, hostname: str) -> str: if hostname not in self.cache.get_hosts(): raise OrchestratorError(f'Cannot find host "{hostname}"') @@ -1275,7 +1287,7 @@ config += '\n\n' + extra.strip() + '\n' return config - def _invalidate_daemons_and_kick_serve(self, filter_host=None): + def _invalidate_daemons_and_kick_serve(self, filter_host: Optional[str] = None) -> None: if filter_host: self.cache.invalidate_host_daemons(filter_host) else: @@ -1400,25 +1412,15 @@ return result @trivial_completion - def service_action(self, action, service_name) -> List[str]: - args = [] - for host, dm in self.cache.daemons.items(): - for name, d in dm.items(): - if d.matches_service(service_name): - args.append((d.daemon_type, d.daemon_id, - d.hostname, action)) + def service_action(self, action: str, service_name: str) -> List[str]: + dds: List[DaemonDescription] = self.cache.get_daemons_by_service(service_name) self.log.info('%s service %s' % (action.capitalize(), service_name)) - return self._daemon_actions(args) - - @forall_hosts - def _daemon_actions(self, daemon_type, daemon_id, host, action) -> str: - with set_exception_subject('daemon', DaemonDescription( - daemon_type=daemon_type, - daemon_id=daemon_id - ).name()): - return self._daemon_action(daemon_type, daemon_id, host, action) + return [ + self._schedule_daemon_action(dd.name(), action) + for dd in dds + ] - def _daemon_action(self, daemon_type, daemon_id, host, action, image=None) -> str: + def _daemon_action(self, daemon_type: str, daemon_id: str, host: str, action: str, image: Optional[str] = None) -> str: daemon_spec: CephadmDaemonSpec = CephadmDaemonSpec( host=host, daemon_id=daemon_id, @@ -1454,7 +1456,7 @@ self.events.for_daemon(name, 'INFO', msg) return msg - def _daemon_action_set_image(self, action: str, image: Optional[str], daemon_type: str, daemon_id: str): + def _daemon_action_set_image(self, action: str, image: Optional[str], daemon_type: str, daemon_id: str) -> None: if image is not None: if action != 'redeploy': raise OrchestratorError( @@ -1488,7 +1490,7 @@ def daemon_is_self(self, daemon_type: str, daemon_id: str) -> bool: return daemon_type == 'mgr' and daemon_id == self.get_mgr_id() - def _schedule_daemon_action(self, daemon_name: str, action: str): + def _schedule_daemon_action(self, daemon_name: str, action: str) -> str: dd = self.cache.get_daemon(daemon_name) if action == 'redeploy' and self.daemon_is_self(dd.daemon_type, dd.daemon_id) \ and not self.mgr_service.mgr_map_has_standby(): @@ -1513,7 +1515,7 @@ return self._remove_daemons(args) @trivial_completion - def remove_service(self, service_name) -> str: + def remove_service(self, service_name: str) -> str: self.log.info('Remove service %s' % service_name) self._trigger_preview_refresh(service_name=service_name) found = self.spec_store.rm(service_name) @@ -1525,7 +1527,7 @@ return f'Failed to remove service. <{service_name}> was not found.' @trivial_completion - def get_inventory(self, host_filter: Optional[orchestrator.InventoryFilter] = None, refresh=False) -> List[orchestrator.InventoryHost]: + def get_inventory(self, host_filter: Optional[orchestrator.InventoryFilter] = None, refresh: bool = False) -> List[orchestrator.InventoryHost]: """ Return the storage inventory of hosts matching the given filter. @@ -1554,7 +1556,7 @@ return result @trivial_completion - def zap_device(self, host, path) -> str: + def zap_device(self, host: str, path: str) -> str: self.log.info('Zap device %s:%s' % (host, path)) out, err, code = self._run_cephadm( host, 'osd', 'ceph-volume', @@ -1580,7 +1582,7 @@ See templates/blink_device_light_cmd.j2 """ @forall_hosts - def blink(host, dev, path): + def blink(host: str, dev: str, path: str) -> str: cmd_line = self.template.render('blink_device_light_cmd.j2', { 'on': on, @@ -1659,7 +1661,7 @@ def _preview_osdspecs(self, osdspecs: Optional[List[DriveGroupSpec]] = None - ): + ) -> dict: if not osdspecs: return {'n/a': [{'error': True, 'message': 'No OSDSpec or matching hosts found.'}]} @@ -1667,9 +1669,9 @@ if not matching_hosts: return {'n/a': [{'error': True, 'message': 'No OSDSpec or matching hosts found.'}]} - # Is any host still loading previews + # Is any host still loading previews or still in the queue to be previewed pending_hosts = {h for h in self.cache.loading_osdspec_preview if h in matching_hosts} - if pending_hosts: + if pending_hosts or any(item in self.cache.osdspec_previews_refresh_queue for item in matching_hosts): # Report 'pending' when any of the matching hosts is still loading previews (flag is True) return {'n/a': [{'error': True, 'message': 'Preview data is being generated.. ' @@ -1686,7 +1688,7 @@ previews_for_specs.update({host: osd_reports}) return previews_for_specs - def _calc_daemon_deps(self, daemon_type, daemon_id): + def _calc_daemon_deps(self, daemon_type: str, daemon_id: str) -> List[str]: need = { 'prometheus': ['mgr', 'alertmanager', 'node-exporter'], 'grafana': ['prometheus'], @@ -1700,7 +1702,7 @@ def _create_daemon(self, daemon_spec: CephadmDaemonSpec, - reconfig=False, + reconfig: bool = False, osd_uuid_map: Optional[Dict[str, Any]] = None, ) -> str: @@ -1711,7 +1713,7 @@ ).service_id(), overwrite=True): image = '' - start_time = datetime.datetime.utcnow() + start_time = datetime_now() ports: List[int] = daemon_spec.ports if daemon_spec.ports else [] if daemon_spec.daemon_type == 'container': @@ -1798,10 +1800,10 @@ return msg @forall_hosts - def _remove_daemons(self, name, host) -> str: + def _remove_daemons(self, name: str, host: str) -> str: return self._remove_daemon(name, host) - def _remove_daemon(self, name, host) -> str: + def _remove_daemon(self, name: str, host: str) -> str: """ Remove a daemon """ @@ -1828,14 +1830,17 @@ return "Removed {} from host '{}'".format(name, host) - def _check_pool_exists(self, pool, service_name): + def _check_pool_exists(self, pool: str, service_name: str) -> None: logger.info(f'Checking pool "{pool}" exists for service {service_name}') if not self.rados.pool_exists(pool): raise OrchestratorError(f'Cannot find pool "{pool}" for ' f'service {service_name}') - def _add_daemon(self, daemon_type, spec, - create_func: Callable[..., CephadmDaemonSpec], config_func=None) -> List[str]: + def _add_daemon(self, + daemon_type: str, + spec: ServiceSpec, + create_func: Callable[..., CephadmDaemonSpec], + config_func: Optional[Callable] = None) -> List[str]: """ Add (and place) a daemon. Require explicit host placement. Do not schedule, and do not apply the related scheduling limitations. @@ -1849,9 +1854,14 @@ spec.placement.hosts, count, create_func, config_func) - def _create_daemons(self, daemon_type, spec, daemons, - hosts, count, - create_func: Callable[..., CephadmDaemonSpec], config_func=None) -> List[str]: + def _create_daemons(self, + daemon_type: str, + spec: ServiceSpec, + daemons: List[DaemonDescription], + hosts: List[HostPlacementSpec], + count: int, + create_func: Callable[..., CephadmDaemonSpec], + config_func: Optional[Callable] = None) -> List[str]: if count > len(hosts): raise OrchestratorError('too few hosts: want %d, have %s' % ( count, hosts)) @@ -1886,14 +1896,14 @@ daemons.append(sd) @forall_hosts - def create_func_map(*args): + def create_func_map(*args: Any) -> str: daemon_spec = create_func(*args) return self._create_daemon(daemon_spec) return create_func_map(args) @trivial_completion - def apply_mon(self, spec) -> str: + def apply_mon(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -1917,7 +1927,7 @@ return self._apply_service_spec(cast(ServiceSpec, spec)) - def _plan(self, spec: ServiceSpec): + def _plan(self, spec: ServiceSpec) -> dict: if spec.service_type == 'osd': return {'service_name': spec.service_name(), 'service_type': spec.service_type, @@ -1998,7 +2008,7 @@ return results @trivial_completion - def apply_mgr(self, spec) -> str: + def apply_mgr(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -2010,11 +2020,11 @@ return self._apply(spec) @trivial_completion - def add_rgw(self, spec) -> List[str]: + def add_rgw(self, spec: ServiceSpec) -> List[str]: return self._add_daemon('rgw', spec, self.rgw_service.prepare_create, self.rgw_service.config) @trivial_completion - def apply_rgw(self, spec) -> str: + def apply_rgw(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -2023,23 +2033,23 @@ return self._add_daemon('iscsi', spec, self.iscsi_service.prepare_create, self.iscsi_service.config) @trivial_completion - def apply_iscsi(self, spec) -> str: + def apply_iscsi(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion - def add_rbd_mirror(self, spec) -> List[str]: + def add_rbd_mirror(self, spec: ServiceSpec) -> List[str]: return self._add_daemon('rbd-mirror', spec, self.rbd_mirror_service.prepare_create) @trivial_completion - def apply_rbd_mirror(self, spec) -> str: + def apply_rbd_mirror(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion - def add_nfs(self, spec) -> List[str]: + def add_nfs(self, spec: ServiceSpec) -> List[str]: return self._add_daemon('nfs', spec, self.nfs_service.prepare_create, self.nfs_service.config) @trivial_completion - def apply_nfs(self, spec) -> str: + def apply_nfs(self, spec: ServiceSpec) -> str: return self._apply(spec) def _get_dashboard_url(self): @@ -2047,11 +2057,11 @@ return self.get('mgr_map').get('services', {}).get('dashboard', '') @trivial_completion - def add_prometheus(self, spec) -> List[str]: + def add_prometheus(self, spec: ServiceSpec) -> List[str]: return self._add_daemon('prometheus', spec, self.prometheus_service.prepare_create) @trivial_completion - def apply_prometheus(self, spec) -> str: + def apply_prometheus(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -2061,7 +2071,7 @@ self.node_exporter_service.prepare_create) @trivial_completion - def apply_node_exporter(self, spec) -> str: + def apply_node_exporter(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -2071,7 +2081,7 @@ self.crash_service.prepare_create) @trivial_completion - def apply_crash(self, spec) -> str: + def apply_crash(self, spec: ServiceSpec) -> str: return self._apply(spec) @trivial_completion @@ -2101,7 +2111,7 @@ def apply_container(self, spec: ServiceSpec) -> str: return self._apply(spec) - def _get_container_image_info(self, image_name) -> ContainerInspectInfo: + def _get_container_image_info(self, image_name: str) -> ContainerInspectInfo: # pick a random host... host = None for host_name in self.inventory.keys(): @@ -2130,12 +2140,12 @@ self.log.debug(f'image {image_name} -> {r}') return r except (ValueError, KeyError) as _: - msg = 'Failed to pull %s on %s: %s' % (image_name, host, '\n'.join(out)) - self.log.exception(msg) + msg = 'Failed to pull %s on %s: Cannot decode JSON' % (image_name, host) + self.log.exception('%s: \'%s\'' % (msg, '\n'.join(out))) raise OrchestratorError(msg) @trivial_completion - def upgrade_check(self, image, version) -> str: + def upgrade_check(self, image: str, version: str) -> str: if version: target_name = self.container_image_base + ':v' + version elif image: @@ -2145,7 +2155,7 @@ image_info = self._get_container_image_info(target_name) self.log.debug(f'image info {image} -> {image_info}') - r = { + r: dict = { 'target_name': target_name, 'target_id': image_info.image_id, 'target_version': image_info.ceph_version, @@ -2172,7 +2182,7 @@ return self.upgrade.upgrade_status() @trivial_completion - def upgrade_start(self, image, version) -> str: + def upgrade_start(self, image: str, version: str) -> str: return self.upgrade.upgrade_start(image, version) @trivial_completion @@ -2212,8 +2222,8 @@ force=force, hostname=daemon.hostname, fullname=daemon.name(), - process_started_at=datetime.datetime.utcnow(), - remove_util=self.rm_util)) + process_started_at=datetime_now(), + remove_util=self.to_remove_osds.rm_util)) except NotFoundError: return f"Unable to find OSDs: {osd_ids}" @@ -2222,7 +2232,7 @@ return "Scheduled OSD(s) for removal" @trivial_completion - def stop_remove_osds(self, osd_ids: List[str]): + def stop_remove_osds(self, osd_ids: List[str]) -> str: """ Stops a `removal` process for a List of OSDs. This will revert their weight and remove it from the osds_to_remove queue @@ -2230,7 +2240,7 @@ for osd_id in osd_ids: try: self.to_remove_osds.rm(OSD(osd_id=int(osd_id), - remove_util=self.rm_util)) + remove_util=self.to_remove_osds.rm_util)) except (NotFoundError, KeyError): return f'Unable to find OSD in the queue: {osd_id}' @@ -2239,7 +2249,7 @@ return "Stopped OSD(s) removal" @trivial_completion - def remove_osds_status(self): + def remove_osds_status(self) -> List[OSD]: """ The CLI call to retrieve an osd removal report """ diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/remotes.py ceph-15.2.11/src/pybind/mgr/cephadm/remotes.py --- ceph-15.2.8/src/pybind/mgr/cephadm/remotes.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/remotes.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,8 +1,9 @@ # ceph-deploy ftw import os -import errno -import tempfile -import shutil +try: + from typing import Optional +except ImportError: + pass PYTHONS = ['python3', 'python2', 'python'] PATH = [ @@ -16,6 +17,7 @@ def choose_python(): + # type: () -> Optional[str] for e in PYTHONS: for b in PATH: p = os.path.join(b, e) diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/schedule.py ceph-15.2.11/src/pybind/mgr/cephadm/schedule.py --- ceph-15.2.8/src/pybind/mgr/cephadm/schedule.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/schedule.py 2021-04-19 13:47:30.000000000 +0000 @@ -36,7 +36,7 @@ 2) Select from list up to :count """ - def __init__(self, spec): + def __init__(self, spec: ServiceSpec): super(SimpleScheduler, self).__init__(spec) def place(self, host_pool, count=None): @@ -74,7 +74,7 @@ def get_hostnames(self) -> List[str]: return [h.hostname for h in self.hosts] - def validate(self): + def validate(self) -> None: self.spec.validate() if self.spec.placement.count == 0: @@ -186,7 +186,7 @@ # remove duplicates before returning return list(dict.fromkeys(active_hosts)) - def prefer_hosts_with_active_daemons(self, hosts: List[HostPlacementSpec], count) -> List[HostPlacementSpec]: + def prefer_hosts_with_active_daemons(self, hosts: List[HostPlacementSpec], count: int) -> List[HostPlacementSpec]: # try to prefer host with active daemon if possible active_hosts = self.get_hosts_with_active_daemon(hosts) if len(active_hosts) != 0 and count > 0: diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/serve.py ceph-15.2.11/src/pybind/mgr/cephadm/serve.py --- ceph-15.2.8/src/pybind/mgr/cephadm/serve.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/serve.py 2021-04-19 13:47:30.000000000 +0000 @@ -2,7 +2,7 @@ import json import logging from collections import defaultdict -from typing import TYPE_CHECKING, Optional, List, Callable, cast, Set, Dict +from typing import TYPE_CHECKING, Optional, List, Callable, cast, Set, Dict, Union, Any try: import remoto @@ -12,11 +12,12 @@ from ceph.deployment import inventory from ceph.deployment.drive_group import DriveGroupSpec from ceph.deployment.service_spec import ServiceSpec, HostPlacementSpec, RGWSpec +from ceph.utils import str_to_datetime, datetime_now import orchestrator from cephadm.schedule import HostAssignment from cephadm.upgrade import CEPH_UPGRADE_ORDER -from cephadm.utils import forall_hosts, cephadmNoImage, str_to_datetime, is_repo_digest +from cephadm.utils import forall_hosts, cephadmNoImage, is_repo_digest, CephadmNoImage from orchestrator import OrchestratorError if TYPE_CHECKING: @@ -63,7 +64,7 @@ self._update_paused_health() if not self.mgr.paused: - self.mgr.rm_util.process_removal_queue() + self.mgr.to_remove_osds.process_removal_queue() self.mgr.migration.migrate() if self.mgr.migration.is_migration_ongoing(): @@ -84,13 +85,13 @@ self._serve_sleep() self.log.debug("serve exit") - def _serve_sleep(self): + def _serve_sleep(self) -> None: sleep_interval = 600 self.log.debug('Sleeping for %d seconds', sleep_interval) ret = self.mgr.event.wait(sleep_interval) self.mgr.event.clear() - def _update_paused_health(self): + def _update_paused_health(self) -> None: if self.mgr.paused: self.mgr.health_checks['CEPHADM_PAUSED'] = { 'severity': 'warning', @@ -109,7 +110,8 @@ failures = [] @forall_hosts - def refresh(host): + def refresh(host: str) -> None: + if self.mgr.cache.host_needs_check(host): r = self._check_host(host) if r is not None: @@ -133,6 +135,12 @@ if r: failures.append(r) + if self.mgr.cache.host_needs_facts_refresh(host): + self.log.info(('refreshing %s facts' % host)) + r = self._refresh_facts(host) + if r: + failures.append(r) + if self.mgr.cache.host_needs_osdspec_preview_refresh(host): self.log.debug(f"refreshing OSDSpec previews for {host}") r = self._refresh_host_osdspec_previews(host) @@ -148,9 +156,14 @@ refresh(self.mgr.cache.get_hosts()) health_changed = False - if 'CEPHADM_HOST_CHECK_FAILED' in self.mgr.health_checks: - del self.mgr.health_checks['CEPHADM_HOST_CHECK_FAILED'] - health_changed = True + for k in [ + 'CEPHADM_HOST_CHECK_FAILED', + 'CEPHADM_FAILED_DAEMON', + 'CEPHADM_REFRESH_FAILED', + ]: + if k in self.mgr.health_checks: + del self.mgr.health_checks[k] + health_changed = True if bad_hosts: self.mgr.health_checks['CEPHADM_HOST_CHECK_FAILED'] = { 'severity': 'warning', @@ -167,15 +180,26 @@ 'detail': failures, } health_changed = True - elif 'CEPHADM_REFRESH_FAILED' in self.mgr.health_checks: - del self.mgr.health_checks['CEPHADM_REFRESH_FAILED'] + failed_daemons = [] + for dd in self.mgr.cache.get_daemons(): + if dd.status < 0: + failed_daemons.append('daemon %s on %s is in %s state' % ( + dd.name(), dd.hostname, dd.status_desc + )) + if failed_daemons: + self.mgr.health_checks['CEPHADM_FAILED_DAEMON'] = { + 'severity': 'warning', + 'summary': '%d failed cephadm daemon(s)' % len(failed_daemons), + 'count': len(failed_daemons), + 'detail': failed_daemons, + } health_changed = True if health_changed: self.mgr.set_health_checks(self.mgr.health_checks) - def _check_host(self, host): + def _check_host(self, host: str) -> Optional[str]: if host not in self.mgr.inventory: - return + return None self.log.debug(' checking %s' % host) try: out, err, code = self.mgr._run_cephadm( @@ -192,17 +216,13 @@ except Exception as e: self.log.debug(' host %s failed check' % host) return 'host %s failed check: %s' % (host, e) + return None - def _refresh_host_daemons(self, host) -> Optional[str]: + def _refresh_host_daemons(self, host: str) -> Optional[str]: try: - out, err, code = self.mgr._run_cephadm( - host, 'mon', 'ls', [], no_fsid=True) - if code: - return 'host %s cephadm ls returned %d: %s' % ( - host, code, err) - except Exception as e: - return 'host %s scrape failed: %s' % (host, e) - ls = json.loads(''.join(out)) + ls = self._run_cephadm_json(host, 'mon', 'ls', [], no_fsid=True) + except OrchestratorError as e: + return str(e) dm = {} for d in ls: if not d['style'].startswith('cephadm'): @@ -212,7 +232,7 @@ if '.' not in d['name']: continue sd = orchestrator.DaemonDescription() - sd.last_refresh = datetime.datetime.utcnow() + sd.last_refresh = datetime_now() for k in ['created', 'started', 'last_configured', 'last_deployed']: v = d.get(k, None) if v: @@ -246,45 +266,47 @@ self.mgr.cache.save_host(host) return None - def _refresh_host_devices(self, host) -> Optional[str]: + def _refresh_facts(self, host: str) -> Optional[str]: try: - out, err, code = self.mgr._run_cephadm( - host, 'osd', - 'ceph-volume', - ['--', 'inventory', '--format=json', '--filter-for-batch']) - if code: - return 'host %s ceph-volume inventory returned %d: %s' % ( - host, code, err) - except Exception as e: - return 'host %s ceph-volume inventory failed: %s' % (host, e) - devices = json.loads(''.join(out)) + val = self._run_cephadm_json(host, cephadmNoImage, 'gather-facts', [], no_fsid=True) + except OrchestratorError as e: + return str(e) + + self.mgr.cache.update_host_facts(host, val) + + return None + + def _refresh_host_devices(self, host: str) -> Optional[str]: try: - out, err, code = self.mgr._run_cephadm( - host, 'mon', - 'list-networks', - [], - no_fsid=True) - if code: - return 'host %s list-networks returned %d: %s' % ( - host, code, err) - except Exception as e: - return 'host %s list-networks failed: %s' % (host, e) - networks = json.loads(''.join(out)) + try: + devices = self._run_cephadm_json(host, 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json', '--filter-for-batch']) + except OrchestratorError as e: + if 'unrecognized arguments: --filter-for-batch' in str(e): + devices = self._run_cephadm_json(host, 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json']) + else: + raise + + networks = self._run_cephadm_json(host, 'mon', 'list-networks', [], no_fsid=True) + except OrchestratorError as e: + return str(e) + self.log.debug('Refreshed host %s devices (%d) networks (%s)' % ( host, len(devices), len(networks))) - devices = inventory.Devices.from_json(devices) - self.mgr.cache.update_host_devices_networks(host, devices.devices, networks) + ret = inventory.Devices.from_json(devices) + self.mgr.cache.update_host_devices_networks(host, ret.devices, networks) self.update_osdspec_previews(host) self.mgr.cache.save_host(host) return None - def _refresh_host_osdspec_previews(self, host) -> bool: + def _refresh_host_osdspec_previews(self, host: str) -> Optional[str]: self.update_osdspec_previews(host) self.mgr.cache.save_host(host) self.log.debug(f'Refreshed OSDSpec previews for host <{host}>') - return True + return None - def update_osdspec_previews(self, search_host: str = ''): + def update_osdspec_previews(self, search_host: str = '') -> None: # Set global 'pending' flag for host self.mgr.cache.loading_osdspec_preview.add(search_host) previews = [] @@ -370,7 +392,7 @@ if self.mgr.warn_on_stray_daemons and daemon_detail: self.mgr.health_checks['CEPHADM_STRAY_DAEMON'] = { 'severity': 'warning', - 'summary': '%d stray daemons(s) not managed by cephadm' % ( + 'summary': '%d stray daemon(s) not managed by cephadm' % ( len(daemon_detail)), 'count': len(daemon_detail), 'detail': daemon_detail, @@ -393,7 +415,7 @@ return r - def _config_fn(self, service_type) -> Optional[Callable[[ServiceSpec], None]]: + def _config_fn(self, service_type: str) -> Optional[Callable[[ServiceSpec], None]]: fn = { 'mds': self.mgr.mds_service.config, 'rgw': self.mgr.rgw_service.config, @@ -615,7 +637,7 @@ self.mgr.requires_post_actions.remove(daemon_type) self.mgr._get_cephadm_service(daemon_type).daemon_check_post(daemon_descs) - def convert_tags_to_repo_digest(self): + def convert_tags_to_repo_digest(self) -> None: if not self.mgr.use_repo_digest: return settings = self.mgr.upgrade.get_distinct_container_image_settings() @@ -632,3 +654,26 @@ image_info = digests[container_image_ref] if image_info.repo_digest: self.mgr.set_container_image(entity, image_info.repo_digest) + + def _run_cephadm_json(self, + host: str, + entity: Union[CephadmNoImage, str], + command: str, + args: List[str], + no_fsid: Optional[bool] = False, + image: Optional[str] = "", + ) -> Any: + try: + out, err, code = self.mgr._run_cephadm( + host, entity, command, args, no_fsid=no_fsid, image=image) + if code: + raise OrchestratorError(f'host {host} `cephadm {command}` returned {code}: {err}') + except Exception as e: + raise OrchestratorError(f'host {host} `cephadm {command}` failed: {e}') + try: + return json.loads(''.join(out)) + except (ValueError, KeyError): + msg = f'host {host} `cephadm {command}` failed: Cannot decode JSON' + self.log.exception(f'{msg}: {"".join(out)}') + raise OrchestratorError(msg) + diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/services/cephadmservice.py ceph-15.2.11/src/pybind/mgr/cephadm/services/cephadmservice.py --- ceph-15.2.8/src/pybind/mgr/cephadm/services/cephadmservice.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/services/cephadmservice.py 2021-04-19 13:47:30.000000000 +0000 @@ -197,8 +197,8 @@ cmd_dicts = get_set_cmd_dicts(out.strip()) for cmd_dict in list(cmd_dicts): try: - logger.info('Setting Dashboard config for %s: command: %s', service_name, cmd_dict) - _, out, _ = self.mgr.check_mon_command(cmd_dict) + inbuf = cmd_dict.pop('inbuf', None) + _, out, _ = self.mgr.check_mon_command(cmd_dict, inbuf) except MonCommandFailed as e: logger.warning('Failed to set Dashboard config for %s: %s', service_name, e) @@ -608,13 +608,13 @@ 'entity': self.get_auth_entity(rgw_id), 'caps': ['mon', 'allow *', 'mgr', 'allow rw', - 'osd', 'allow rwx'], + 'osd', 'allow rwx tag rgw *=*'], }) return keyring def create_realm_zonegroup_zone(self, spec: RGWSpec, rgw_id: str) -> None: if utils.get_cluster_health(self.mgr) != 'HEALTH_OK': - raise OrchestratorError('Health not ok, will try agin when health ok') + raise OrchestratorError('Health not ok, will try again when health ok') # get keyring needed to run rados commands and strip out just the keyring keyring = self.get_keyring(rgw_id).split('key = ', 1)[1].rstrip() diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/services/iscsi.py ceph-15.2.11/src/pybind/mgr/cephadm/services/iscsi.py --- ceph-15.2.8/src/pybind/mgr/cephadm/services/iscsi.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/services/iscsi.py 2021-04-19 13:47:30.000000000 +0000 @@ -17,6 +17,7 @@ def config(self, spec: IscsiServiceSpec) -> None: assert self.TYPE == spec.service_type + assert spec.pool self.mgr._check_pool_exists(spec.pool, spec.service_name()) logger.info('Saving service %s spec with placement %s' % ( @@ -76,27 +77,39 @@ def get_set_cmd_dicts(out: str) -> List[dict]: gateways = json.loads(out)['gateways'] cmd_dicts = [] + spec = cast(IscsiServiceSpec, + self.mgr.spec_store.specs.get(daemon_descrs[0].service_name(), None)) + if spec.api_secure and spec.ssl_cert and spec.ssl_key: + cmd_dicts.append({ + 'prefix': 'dashboard set-iscsi-api-ssl-verification', + 'value': "false" + }) + else: + cmd_dicts.append({ + 'prefix': 'dashboard set-iscsi-api-ssl-verification', + 'value': "true" + }) for dd in daemon_descrs: spec = cast(IscsiServiceSpec, self.mgr.spec_store.specs.get(dd.service_name(), None)) if not spec: logger.warning('No ServiceSpec found for %s', dd) continue - if not all([spec.api_user, spec.api_password]): - reason = 'api_user or api_password is not specified in ServiceSpec' - logger.warning( - 'Unable to add iSCSI gateway to the Dashboard for %s: %s', dd, reason) - continue - host = self._inventory_get_addr(dd.hostname) - service_url = 'http://{}:{}@{}:{}'.format( - spec.api_user, spec.api_password, host, spec.api_port or '5000') - gw = gateways.get(host) + ip = utils.resolve_ip(dd.hostname) + protocol = "http" + if spec.api_secure and spec.ssl_cert and spec.ssl_key: + protocol = "https" + service_url = '{}://{}:{}@{}:{}'.format( + protocol, spec.api_user or 'admin', spec.api_password or 'admin', ip, spec.api_port or '5000') + gw = gateways.get(dd.hostname) if not gw or gw['service_url'] != service_url: - logger.info('Adding iSCSI gateway %s to Dashboard', service_url) + safe_service_url = '{}://{}:{}@{}:{}'.format( + protocol, '', '', ip, spec.api_port or '5000') + logger.info('Adding iSCSI gateway %s to Dashboard', safe_service_url) cmd_dicts.append({ 'prefix': 'dashboard iscsi-gateway-add', - 'service_url': service_url, - 'name': host + 'inbuf': service_url, + 'name': dd.hostname }) return cmd_dicts diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/services/nfs.py ceph-15.2.11/src/pybind/mgr/cephadm/services/nfs.py --- ceph-15.2.8/src/pybind/mgr/cephadm/services/nfs.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/services/nfs.py 2021-04-19 13:47:30.000000000 +0000 @@ -20,6 +20,7 @@ def config(self, spec: NFSServiceSpec) -> None: assert self.TYPE == spec.service_type + assert spec.pool self.mgr._check_pool_exists(spec.pool, spec.service_name()) logger.info('Saving service %s spec with placement %s' % ( diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/services/osd.py ceph-15.2.11/src/pybind/mgr/cephadm/services/osd.py --- ceph-15.2.8/src/pybind/mgr/cephadm/services/osd.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/services/osd.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,15 +1,17 @@ import json import logging +from threading import Lock from typing import List, Dict, Any, Set, Union, Tuple, cast, Optional, TYPE_CHECKING from ceph.deployment import translate from ceph.deployment.drive_group import DriveGroupSpec from ceph.deployment.drive_selection import DriveSelection from ceph.deployment.inventory import Device +from ceph.utils import datetime_to_str, str_to_datetime from datetime import datetime import orchestrator -from cephadm.utils import forall_hosts, datetime_to_str, str_to_datetime +from cephadm.utils import forall_hosts from orchestrator import OrchestratorError from mgr_module import MonCommandFailed @@ -27,17 +29,19 @@ def create_from_spec(self, drive_group: DriveGroupSpec) -> str: logger.debug(f"Processing DriveGroup {drive_group}") osd_id_claims = self.find_destroyed_osds() - logger.info(f"Found osd claims for drivegroup {drive_group.service_id} -> {osd_id_claims}") + if osd_id_claims: + logger.info( + f"Found osd claims for drivegroup {drive_group.service_id} -> {osd_id_claims}") @forall_hosts def create_from_spec_one(host: str, drive_selection: DriveSelection) -> Optional[str]: - logger.info('Applying %s on host %s...' % (drive_group.service_id, host)) cmd = self.driveselection_to_ceph_volume(drive_selection, osd_id_claims.get(host, [])) if not cmd: logger.debug("No data_devices, skipping DriveGroup: {}".format( drive_group.service_id)) return None + logger.info('Applying drive group %s on host %s...' % (drive_group.service_id, host)) env_vars: List[str] = [f"CEPH_VOLUME_OSDSPEC_AFFINITY={drive_group.service_id}"] ret_msg = self.create_single_host( host, cmd, replace_osd_ids=osd_id_claims.get(host, []), env_vars=env_vars @@ -71,7 +75,11 @@ '--format', 'json', ]) before_osd_uuid_map = self.mgr.get_osd_uuid_map(only_up=True) - osds_elems = json.loads('\n'.join(out)) + try: + osds_elems = json.loads('\n'.join(out)) + except ValueError: + logger.exception('Cannot decode JSON: \'%s\'' % '\n'.join(out)) + osds_elems = {} fsid = self.mgr._cluster_fsid osd_uuid_map = self.mgr.get_osd_uuid_map() created = [] @@ -201,7 +209,12 @@ # get preview data from ceph-volume out, err, code = self._run_ceph_volume_command(host, cmd) if out: - concat_out: Dict[str, Any] = json.loads(" ".join(out)) + try: + concat_out: Dict[str, Any] = json.loads(' '.join(out)) + except ValueError: + logger.exception('Cannot decode JSON: \'%s\'' % ' '.join(out)) + concat_out = {} + ret_all.append({'data': concat_out, 'osdspec': osdspec.service_id, 'host': host}) @@ -274,8 +287,8 @@ raise OrchestratorError(str(e)) try: tree = json.loads(out) - except json.decoder.JSONDecodeError: - logger.exception(f"Could not decode json -> {out}") + except ValueError: + logger.exception(f'Cannot decode JSON: \'{out}\'') return osd_host_map nodes = tree.get('nodes', {}) @@ -284,8 +297,8 @@ osd_host_map.update( {node.get('name'): [str(_id) for _id in node.get('children', list())]} ) - self.mgr.log.info( - f"Found osd claims -> {osd_host_map}") + if osd_host_map: + self.mgr.log.info(f"Found osd claims -> {osd_host_map}") return osd_host_map @@ -293,74 +306,6 @@ def __init__(self, mgr: "CephadmOrchestrator") -> None: self.mgr: "CephadmOrchestrator" = mgr - def process_removal_queue(self) -> None: - """ - Performs actions in the _serve() loop to remove an OSD - when criteria is met. - """ - - # make sure that we don't run on OSDs that are not in the cluster anymore. - self.cleanup() - - logger.debug( - f"{self.mgr.to_remove_osds.queue_size()} OSDs are scheduled " - f"for removal: {self.mgr.to_remove_osds.all_osds()}") - - # find osds that are ok-to-stop and not yet draining - ok_to_stop_osds = self.find_osd_stop_threshold(self.mgr.to_remove_osds.idling_osds()) - if ok_to_stop_osds: - # start draining those - _ = [osd.start_draining() for osd in ok_to_stop_osds] - - # Check all osds for their state and take action (remove, purge etc) - to_remove_osds = self.mgr.to_remove_osds.all_osds() - new_queue = set() - for osd in to_remove_osds: - if not osd.force: - # skip criteria - if not osd.is_empty: - logger.info(f"OSD <{osd.osd_id}> is not empty yet. Waiting a bit more") - new_queue.add(osd) - continue - - if not osd.safe_to_destroy(): - logger.info( - f"OSD <{osd.osd_id}> is not safe-to-destroy yet. Waiting a bit more") - new_queue.add(osd) - continue - - # abort criteria - if not osd.down(): - # also remove it from the remove_osd list and set a health_check warning? - raise orchestrator.OrchestratorError( - f"Could not set OSD <{osd.osd_id}> to 'down'") - - if osd.replace: - if not osd.destroy(): - raise orchestrator.OrchestratorError( - f"Could not destroy OSD <{osd.osd_id}>") - else: - if not osd.purge(): - raise orchestrator.OrchestratorError(f"Could not purge OSD <{osd.osd_id}>") - - if not osd.exists: - continue - self.mgr._remove_daemon(osd.fullname, osd.hostname) - logger.info(f"Successfully removed OSD <{osd.osd_id}> on {osd.hostname}") - logger.debug(f"Removing {osd.osd_id} from the queue.") - - # self.mgr.to_remove_osds could change while this is processing (osds get added from the CLI) - # The new set is: 'an intersection of all osds that are still not empty/removed (new_queue) and - # osds that were added while this method was executed' - self.mgr.to_remove_osds.intersection_update(new_queue) - self.save_to_store() - - def cleanup(self) -> None: - # OSDs can always be cleaned up manually. This ensures that we run on existing OSDs - not_in_cluster_osds = self.mgr.to_remove_osds.not_in_cluster() - for osd in not_in_cluster_osds: - self.mgr.to_remove_osds.remove(osd) - def get_osds_in_cluster(self) -> List[str]: osd_map = self.mgr.get_osdmap() return [str(x.get('osd')) for x in osd_map.dump().get('osds', [])] @@ -371,7 +316,12 @@ 'prefix': base_cmd, 'format': 'json' }) - return json.loads(out) + try: + ret = json.loads(out) + except ValueError: + logger.exception(f'Cannot decode JSON: \'{out}\'') + return {} + return ret def get_pg_count(self, osd_id: int, osd_df: Optional[dict] = None) -> int: if not osd_df: @@ -463,18 +413,6 @@ self.mgr.log.debug(f"cmd: {cmd_args.get('prefix')} returns: {out}") return True - def save_to_store(self) -> None: - osd_queue = [osd.to_json() for osd in self.mgr.to_remove_osds.all_osds()] - logger.debug(f"Saving {osd_queue} to store") - self.mgr.set_store('osd_remove_queue', json.dumps(osd_queue)) - - def load_from_store(self) -> None: - for k, v in self.mgr.get_store_prefix('osd_remove_queue').items(): - for osd in json.loads(v): - logger.debug(f"Loading osd ->{osd} from store") - osd_obj = OSD.from_json(osd, ctx=self) - self.mgr.to_remove_osds.add(osd_obj) - class NotFoundError(Exception): pass @@ -531,7 +469,7 @@ self.fullname = fullname # mgr obj to make mgr/mon calls - self.rm_util = remove_util + self.rm_util: RemoveUtil = remove_util def start(self) -> None: if self.started: @@ -633,13 +571,13 @@ return out @classmethod - def from_json(cls, inp: Optional[Dict[str, Any]], ctx: Optional[RemoveUtil] = None) -> Optional["OSD"]: + def from_json(cls, inp: Optional[Dict[str, Any]], rm_util: RemoveUtil) -> Optional["OSD"]: if not inp: return None for date_field in ['drain_started_at', 'drain_stopped_at', 'drain_done_at', 'process_started_at']: if inp.get(date_field): inp.update({date_field: str_to_datetime(inp.get(date_field, ''))}) - inp.update({'remove_util': ctx}) + inp.update({'remove_util': rm_util}) if 'nodename' in inp: hostname = inp.pop('nodename') inp['hostname'] = hostname @@ -657,45 +595,153 @@ return f"(osd_id={self.osd_id}, draining={self.draining})" -class OSDQueue(Set): +class OSDRemovalQueue(object): + + def __init__(self, mgr: "CephadmOrchestrator") -> None: + self.mgr: "CephadmOrchestrator" = mgr + self.osds: Set[OSD] = set() + self.rm_util = RemoveUtil(mgr) - def __init__(self) -> None: - super().__init__() + # locks multithreaded access to self.osds. Please avoid locking + # network calls, like mon commands. + self.lock = Lock() + + def process_removal_queue(self) -> None: + """ + Performs actions in the _serve() loop to remove an OSD + when criteria is met. + + we can't hold self.lock, as we're calling _remove_daemon in the loop + """ + + # make sure that we don't run on OSDs that are not in the cluster anymore. + self.cleanup() + + # find osds that are ok-to-stop and not yet draining + ok_to_stop_osds = self.rm_util.find_osd_stop_threshold(self.idling_osds()) + if ok_to_stop_osds: + # start draining those + _ = [osd.start_draining() for osd in ok_to_stop_osds] + + all_osds = self.all_osds() + + logger.debug( + f"{self.queue_size()} OSDs are scheduled " + f"for removal: {all_osds}") + + # Check all osds for their state and take action (remove, purge etc) + new_queue: Set[OSD] = set() + for osd in all_osds: # type: OSD + if not osd.force: + # skip criteria + if not osd.is_empty: + logger.info(f"OSD <{osd.osd_id}> is not empty yet. Waiting a bit more") + new_queue.add(osd) + continue + + if not osd.safe_to_destroy(): + logger.info( + f"OSD <{osd.osd_id}> is not safe-to-destroy yet. Waiting a bit more") + new_queue.add(osd) + continue + + # abort criteria + if not osd.down(): + # also remove it from the remove_osd list and set a health_check warning? + raise orchestrator.OrchestratorError( + f"Could not set OSD <{osd.osd_id}> to 'down'") + + if osd.replace: + if not osd.destroy(): + raise orchestrator.OrchestratorError( + f"Could not destroy OSD <{osd.osd_id}>") + else: + if not osd.purge(): + raise orchestrator.OrchestratorError(f"Could not purge OSD <{osd.osd_id}>") + + if not osd.exists: + continue + assert osd.fullname is not None + assert osd.hostname is not None + self.mgr._remove_daemon(osd.fullname, osd.hostname) + logger.info(f"Successfully removed OSD <{osd.osd_id}> on {osd.hostname}") + logger.debug(f"Removing {osd.osd_id} from the queue.") + + # self could change while this is processing (osds get added from the CLI) + # The new set is: 'an intersection of all osds that are still not empty/removed (new_queue) and + # osds that were added while this method was executed' + with self.lock: + self.osds.intersection_update(new_queue) + self._save_to_store() + + def cleanup(self) -> None: + # OSDs can always be cleaned up manually. This ensures that we run on existing OSDs + with self.lock: + for osd in self._not_in_cluster(): + self.osds.remove(osd) + + def _save_to_store(self) -> None: + osd_queue = [osd.to_json() for osd in self.osds] + logger.debug(f"Saving {osd_queue} to store") + self.mgr.set_store('osd_remove_queue', json.dumps(osd_queue)) + + def load_from_store(self) -> None: + with self.lock: + for k, v in self.mgr.get_store_prefix('osd_remove_queue').items(): + for osd in json.loads(v): + logger.debug(f"Loading osd ->{osd} from store") + osd_obj = OSD.from_json(osd, rm_util=self.rm_util) + if osd_obj is not None: + self.osds.add(osd_obj) def as_osd_ids(self) -> List[int]: - return [osd.osd_id for osd in self] + with self.lock: + return [osd.osd_id for osd in self.osds] def queue_size(self) -> int: - return len(self) + with self.lock: + return len(self.osds) def draining_osds(self) -> List["OSD"]: - return [osd for osd in self if osd.is_draining] + with self.lock: + return [osd for osd in self.osds if osd.is_draining] def idling_osds(self) -> List["OSD"]: - return [osd for osd in self if not osd.is_draining and not osd.is_empty] + with self.lock: + return [osd for osd in self.osds if not osd.is_draining and not osd.is_empty] def empty_osds(self) -> List["OSD"]: - return [osd for osd in self if osd.is_empty] + with self.lock: + return [osd for osd in self.osds if osd.is_empty] def all_osds(self) -> List["OSD"]: - return [osd for osd in self] + with self.lock: + return [osd for osd in self.osds] - def not_in_cluster(self) -> List["OSD"]: - return [osd for osd in self if not osd.exists] + def _not_in_cluster(self) -> List["OSD"]: + return [osd for osd in self.osds if not osd.exists] def enqueue(self, osd: "OSD") -> None: if not osd.exists: raise NotFoundError() - self.add(osd) + with self.lock: + self.osds.add(osd) osd.start() def rm(self, osd: "OSD") -> None: if not osd.exists: raise NotFoundError() osd.stop() - try: - logger.debug(f'Removing {osd} from the queue.') - self.remove(osd) - except KeyError: - logger.debug(f"Could not find {osd} in queue.") - raise KeyError + with self.lock: + try: + logger.debug(f'Removing {osd} from the queue.') + self.osds.remove(osd) + except KeyError: + logger.debug(f"Could not find {osd} in queue.") + raise KeyError + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, OSDRemovalQueue): + return False + with self.lock: + return self.osds == other.osds diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/template.py ceph-15.2.11/src/pybind/mgr/cephadm/template.py --- ceph-15.2.8/src/pybind/mgr/cephadm/template.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/template.py 2021-04-19 13:47:30.000000000 +0000 @@ -26,7 +26,7 @@ class Jinja2Engine(TemplateEngine): - def __init__(self): + def __init__(self) -> None: self.env = Environment( loader=PackageLoader('cephadm', 'templates'), autoescape=select_autoescape(['html', 'xml'], default_for_string=False), @@ -46,7 +46,7 @@ except j2_exceptions.TemplateNotFound as e: raise TemplateNotFoundError(e.message) - def render_plain(self, source, context): + def render_plain(self, source: str, context: Optional[dict]) -> str: try: template = self.env.from_string(source) if context is None: @@ -68,7 +68,7 @@ def render(self, name: str, context: Optional[dict] = None, - managed_context=True, + managed_context: bool = True, host: Optional[str] = None) -> str: """Render a string from a template with context. diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/fixtures.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/fixtures.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/fixtures.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/fixtures.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,10 +1,9 @@ -import datetime import time import fnmatch from contextlib import contextmanager from ceph.deployment.service_spec import PlacementSpec, ServiceSpec -from cephadm.module import CEPH_DATEFMT +from ceph.utils import datetime_to_str, datetime_now from cephadm.serve import CephadmServe try: @@ -55,7 +54,7 @@ store = {} if '_ceph_get/mon_map' not in store: m.mock_store_set('_ceph_get', 'mon_map', { - 'modified': datetime.datetime.utcnow().strftime(CEPH_DATEFMT), + 'modified': datetime_to_str(datetime_now()), 'fsid': 'foobar', }) for k, v in store.items(): diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_cephadm.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_cephadm.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_cephadm.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_cephadm.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,4 +1,3 @@ -import datetime import json from contextlib import contextmanager from unittest.mock import ANY @@ -7,7 +6,8 @@ from ceph.deployment.drive_group import DriveGroupSpec, DeviceSelection from cephadm.serve import CephadmServe -from cephadm.services.osd import OSD, OSDQueue +from cephadm.services.osd import OSD, OSDRemovalQueue +from cephadm.utils import CephadmNoImage try: from typing import Any, List @@ -20,12 +20,13 @@ NFSServiceSpec, IscsiServiceSpec, HostPlacementSpec, CustomContainerSpec from ceph.deployment.drive_selection.selector import DriveSelection from ceph.deployment.inventory import Devices, Device +from ceph.utils import datetime_to_str, datetime_now from orchestrator import ServiceDescription, DaemonDescription, InventoryHost, \ HostSpec, OrchestratorError from tests import mock from .fixtures import cephadm_module, wait, _run_cephadm, match_glob, with_host, \ with_cephadm_module, with_service, assert_rm_service -from cephadm.module import CephadmOrchestrator, CEPH_DATEFMT +from cephadm.module import CephadmOrchestrator """ TODOs: @@ -195,7 +196,7 @@ # Make sure, _check_daemons does a redeploy due to monmap change: cephadm_module._store['_ceph_get/mon_map'] = { - 'modified': datetime.datetime.utcnow().strftime(CEPH_DATEFMT), + 'modified': datetime_to_str(datetime_now()), 'fsid': 'foobar', } cephadm_module.notify('mon_map', None) @@ -214,7 +215,7 @@ # Make sure, _check_daemons does a redeploy due to monmap change: cephadm_module.mock_store_set('_ceph_get', 'mon_map', { - 'modified': datetime.datetime.utcnow().strftime(CEPH_DATEFMT), + 'modified': datetime_to_str(datetime_now()), 'fsid': 'foobar', }) cephadm_module.notify('mon_map', None) @@ -294,7 +295,7 @@ # Make sure, _check_daemons does a redeploy due to monmap change: cephadm_module.mock_store_set('_ceph_get', 'mon_map', { - 'modified': datetime.datetime.utcnow().strftime(CEPH_DATEFMT), + 'modified': datetime_to_str(datetime_now()), 'fsid': 'foobar', }) cephadm_module.notify('mon_map', None) @@ -305,7 +306,8 @@ with mock.patch("cephadm.module.CephadmOrchestrator.mon_command") as _mon_cmd: CephadmServe(cephadm_module)._check_daemons() _mon_cmd.assert_any_call( - {'prefix': 'dashboard set-grafana-api-url', 'value': 'https://test:3000'}) + {'prefix': 'dashboard set-grafana-api-url', 'value': 'https://test:3000'}, + None) @mock.patch("cephadm.module.CephadmOrchestrator._run_cephadm", _run_cephadm('[]')) def test_mon_add(self, cephadm_module): @@ -504,11 +506,11 @@ force=False, hostname='test', fullname='osd.0', - process_started_at=datetime.datetime.utcnow(), - remove_util=cephadm_module.rm_util + process_started_at=datetime_now(), + remove_util=cephadm_module.to_remove_osds.rm_util )) - cephadm_module.rm_util.process_removal_queue() - assert cephadm_module.to_remove_osds == OSDQueue() + cephadm_module.to_remove_osds.process_removal_queue() + assert cephadm_module.to_remove_osds == OSDRemovalQueue(cephadm_module) c = cephadm_module.remove_osds_status() out = wait(cephadm_module, c) @@ -816,19 +818,19 @@ raise Exception("boom: connection is dead") else: conn.fuse = True - return '{}', None, 0 + return '{}', [], 0 with mock.patch("remoto.Connection", side_effect=[Connection(), Connection(), Connection()]): with mock.patch("remoto.process.check", _check): with with_host(cephadm_module, 'test', refresh_hosts=False): code, out, err = cephadm_module.check_host('test') # First should succeed. - assert err is None + assert err is '' # On second it should attempt to reuse the connection, where the # connection is "down" so will recreate the connection. The old # code will blow up here triggering the BOOM! code, out, err = cephadm_module.check_host('test') - assert err is None + assert err is '' @mock.patch("cephadm.module.CephadmOrchestrator._get_connection") @mock.patch("remoto.process.check") @@ -865,7 +867,7 @@ # Make sure, _check_daemons does a redeploy due to monmap change: cephadm_module.mock_store_set('_ceph_get', 'mon_map', { - 'modified': datetime.datetime.utcnow().strftime(CEPH_DATEFMT), + 'modified': datetime_to_str(datetime_now()), 'fsid': 'foobar', }) cephadm_module.notify('mon_map', mock.MagicMock()) @@ -951,3 +953,31 @@ assert image == 'image@repo_digest' else: assert image == 'image' + + @mock.patch("cephadm.module.CephadmOrchestrator._run_cephadm") + def test_ceph_volume_no_filter_for_batch(self, _run_cephadm, cephadm_module: CephadmOrchestrator): + _run_cephadm.return_value = ('{}', '', 0) + + error_message = """cephadm exited with an error code: 1, stderr:/usr/bin/podman:stderr usage: ceph-volume inventory [-h] [--format {plain,json,json-pretty}] [path]/usr/bin/podman:stderr ceph-volume inventory: error: unrecognized arguments: --filter-for-batch +Traceback (most recent call last): + File "", line 6112, in + File "", line 1299, in _infer_fsid + File "", line 1382, in _infer_image + File "", line 3612, in command_ceph_volume + File "", line 1061, in call_throws""" + + with with_host(cephadm_module, 'test'): + _run_cephadm.reset_mock() + _run_cephadm.side_effect = OrchestratorError(error_message) + + s = CephadmServe(cephadm_module)._refresh_host_devices('test') + assert s == 'host test `cephadm ceph-volume` failed: ' + error_message + + assert _run_cephadm.mock_calls == [ + mock.call('test', 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json', '--filter-for-batch'], image='', + no_fsid=False), + mock.call('test', 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json'], image='', + no_fsid=False), + ] diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_migration.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_migration.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_migration.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_migration.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,12 +1,11 @@ import json -from datetime import datetime import pytest from ceph.deployment.service_spec import PlacementSpec, ServiceSpec, HostPlacementSpec +from ceph.utils import datetime_to_str, datetime_now from cephadm import CephadmOrchestrator from cephadm.inventory import SPEC_STORE_PREFIX -from cephadm.utils import DATEFMT from cephadm.tests.fixtures import _run_cephadm, cephadm_module, wait, with_host from orchestrator import OrchestratorError from cephadm.serve import CephadmServe @@ -48,8 +47,8 @@ # Sorry, for this hack, but I need to make sure, Migration thinks, # we have updated all daemons already. - cephadm_module.cache.last_daemon_update['host1'] = datetime.now() - cephadm_module.cache.last_daemon_update['host2'] = datetime.now() + cephadm_module.cache.last_daemon_update['host1'] = datetime_now() + cephadm_module.cache.last_daemon_update['host2'] = datetime_now() cephadm_module.migration_current = 0 cephadm_module.migration.migrate() @@ -72,7 +71,7 @@ 'hosts': ['host1'] } }, - 'created': datetime.utcnow().strftime(DATEFMT), + 'created': datetime_to_str(datetime_now()), }, sort_keys=True), ) @@ -103,7 +102,7 @@ 'count': 5, } }, - 'created': datetime.utcnow().strftime(DATEFMT), + 'created': datetime_to_str(datetime_now()), }, sort_keys=True), ) cephadm_module.set_store(SPEC_STORE_PREFIX + 'mon.wrong', json.dumps({ @@ -114,7 +113,7 @@ 'hosts': ['host1'] } }, - 'created': datetime.utcnow().strftime(DATEFMT), + 'created': datetime_to_str(datetime_now()), }, sort_keys=True), ) @@ -146,7 +145,7 @@ 'hosts': ['host1'] } }, - 'created': datetime.utcnow().strftime(DATEFMT), + 'created': datetime_to_str(datetime_now()), }, sort_keys=True), ) diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_osd_removal.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_osd_removal.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_osd_removal.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_osd_removal.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,6 +1,6 @@ import json -from cephadm.services.osd import RemoveUtil, OSDQueue, OSD +from cephadm.services.osd import RemoveUtil, OSDRemovalQueue, OSD import pytest from .fixtures import rm_util, osd_obj, cephadm_module from tests import mock @@ -73,7 +73,7 @@ rm_util._run_mon_cmd.assert_called_with( {'prefix': 'osd purge-actual', 'id': 1, 'yes_i_really_mean_it': True}) - def test_load(self, cephadm_module): + def test_load(self, cephadm_module, rm_util): data = json.dumps([ { "osd_id": 35, @@ -90,9 +90,11 @@ } ]) cephadm_module.set_store('osd_remove_queue', data) - cephadm_module.rm_util.load_from_store() + cephadm_module.to_remove_osds.load_from_store() - assert repr(cephadm_module.to_remove_osds) == 'OSDQueue({(osd_id=35, draining=True)})' + expected = OSDRemovalQueue(cephadm_module) + expected.osds.add(OSD(osd_id=35, remove_util=rm_util, draining=True)) + assert cephadm_module.to_remove_osds == expected class TestOSD: @@ -213,25 +215,25 @@ assert osd_obj.drain_status_human() == 'done, waiting for purge' -class TestOSDQueue: +class TestOSDRemovalQueue: def test_queue_size(self, osd_obj): - q = OSDQueue() + q = OSDRemovalQueue(mock.Mock()) assert q.queue_size() == 0 - q.add(osd_obj) + q.osds.add(osd_obj) assert q.queue_size() == 1 @mock.patch("cephadm.services.osd.OSD.start") @mock.patch("cephadm.services.osd.OSD.exists") def test_enqueue(self, exist, start, osd_obj): - q = OSDQueue() + q = OSDRemovalQueue(mock.Mock()) q.enqueue(osd_obj) osd_obj.start.assert_called_once() @mock.patch("cephadm.services.osd.OSD.stop") @mock.patch("cephadm.services.osd.OSD.exists") def test_rm_raise(self, exist, stop, osd_obj): - q = OSDQueue() + q = OSDRemovalQueue(mock.Mock()) with pytest.raises(KeyError): q.rm(osd_obj) osd_obj.stop.assert_called_once() @@ -239,7 +241,7 @@ @mock.patch("cephadm.services.osd.OSD.stop") @mock.patch("cephadm.services.osd.OSD.exists") def test_rm(self, exist, stop, osd_obj): - q = OSDQueue() - q.add(osd_obj) + q = OSDRemovalQueue(mock.Mock()) + q.osds.add(osd_obj) q.rm(osd_obj) osd_obj.stop.assert_called_once() diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_services.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_services.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_services.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_services.py 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ RbdMirrorService, CrashService, CephadmService, AuthEntity from cephadm.services.iscsi import IscsiService from cephadm.services.nfs import NFSService -from cephadm.services.osd import RemoveUtil, OSDQueue, OSDService, OSD, NotFoundError +from cephadm.services.osd import RemoveUtil, OSDRemovalQueue, OSDService, OSD, NotFoundError from cephadm.services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \ NodeExporterService @@ -18,7 +18,7 @@ self.config = '' self.check_mon_command = MagicMock(side_effect=self._check_mon_command) - def _check_mon_command(self, cmd_dict): + def _check_mon_command(self, cmd_dict, inbuf=None): prefix = cmd_dict.get('prefix') if prefix == 'get-cmd': return 0, self.config, '' diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_spec.py ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_spec.py --- ceph-15.2.8/src/pybind/mgr/cephadm/tests/test_spec.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/tests/test_spec.py 2021-04-19 13:47:30.000000000 +0000 @@ -273,7 +273,18 @@ # https://tracker.ceph.com/issues/44934 # Those are real user data from early octopus. # Please do not modify those JSON values. - assert dd_json == DaemonDescription.from_json(dd_json).to_json() + + # Convert datetime properties to old style. + # 2020-04-03T07:29:16.926292Z -> 2020-04-03T07:29:16.926292 + def convert_to_old_style_json(j): + for k in ['last_refresh', 'created', 'started', 'last_deployed', + 'last_configured']: + if k in j: + j[k] = j[k].rstrip('Z') + return j + + assert dd_json == convert_to_old_style_json( + DaemonDescription.from_json(dd_json).to_json()) @pytest.mark.parametrize("spec,dd,valid", diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/upgrade.py ceph-15.2.11/src/pybind/mgr/cephadm/upgrade.py --- ceph-15.2.8/src/pybind/mgr/cephadm/upgrade.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/upgrade.py 2021-04-19 13:47:30.000000000 +0000 @@ -49,7 +49,7 @@ } @classmethod - def from_json(cls, data) -> Optional['UpgradeState']: + def from_json(cls, data: dict) -> Optional['UpgradeState']: if data: return cls(**data) else: @@ -57,6 +57,12 @@ class CephadmUpgrade: + UPGRADE_ERRORS = [ + 'UPGRADE_NO_STANDBY_MGR', + 'UPGRADE_FAILED_PULL', + 'UPGRADE_REDEPLOY_DAEMON', + ] + def __init__(self, mgr: "CephadmOrchestrator"): self.mgr = mgr @@ -87,7 +93,7 @@ r.message = 'Upgrade paused' return r - def upgrade_start(self, image, version) -> str: + def upgrade_start(self, image: str, version: str) -> str: if self.mgr.mode != 'root': raise OrchestratorError('upgrade is not supported in %s mode' % ( self.mgr.mode)) @@ -186,13 +192,13 @@ return False def _clear_upgrade_health_checks(self) -> None: - for k in ['UPGRADE_NO_STANDBY_MGR', - 'UPGRADE_FAILED_PULL']: + for k in self.UPGRADE_ERRORS: if k in self.mgr.health_checks: del self.mgr.health_checks[k] self.mgr.set_health_checks(self.mgr.health_checks) - def _fail_upgrade(self, alert_id, alert) -> None: + def _fail_upgrade(self, alert_id: str, alert: dict) -> None: + assert alert_id in self.UPGRADE_ERRORS logger.error('Upgrade: Paused due to %s: %s' % (alert_id, alert['summary'])) if not self.upgrade_state: @@ -204,7 +210,7 @@ self.mgr.health_checks[alert_id] = alert self.mgr.set_health_checks(self.mgr.health_checks) - def _update_upgrade_progress(self, progress) -> None: + def _update_upgrade_progress(self, progress: float) -> None: if not self.upgrade_state: assert False, 'No upgrade in progress' @@ -329,13 +335,23 @@ return logger.info('Upgrade: Redeploying %s.%s' % (d.daemon_type, d.daemon_id)) - self.mgr._daemon_action( - d.daemon_type, - d.daemon_id, - d.hostname, - 'redeploy', - image=target_image - ) + try: + self.mgr._daemon_action( + d.daemon_type, + d.daemon_id, + d.hostname, + 'redeploy', + image=target_image + ) + except Exception as e: + self._fail_upgrade('UPGRADE_REDEPLOY_DAEMON', { + 'severity': 'warning', + 'summary': f'Upgrading daemon {d.name()} on host {d.hostname} failed.', + 'count': 1, + 'detail': [ + f'Upgrade daemon: {d.name()}: {e}' + ], + }) return if need_upgrade_self: diff -Nru ceph-15.2.8/src/pybind/mgr/cephadm/utils.py ceph-15.2.11/src/pybind/mgr/cephadm/utils.py --- ceph-15.2.8/src/pybind/mgr/cephadm/utils.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/cephadm/utils.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,10 +1,9 @@ import logging -import re import json -import datetime +import socket from enum import Enum from functools import wraps -from typing import Optional, Callable, TypeVar, List, NewType, TYPE_CHECKING +from typing import Callable, TypeVar, List, NewType, TYPE_CHECKING, Any from orchestrator import OrchestratorError if TYPE_CHECKING: @@ -15,8 +14,6 @@ ConfEntity = NewType('ConfEntity', str) -DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' - class CephadmNoImage(Enum): token = 1 @@ -41,7 +38,7 @@ def forall_hosts(f: Callable[..., T]) -> Callable[..., List[T]]: @wraps(f) - def forall_hosts_wrapper(*args) -> List[T]: + def forall_hosts_wrapper(*args: Any) -> List[T]: from cephadm.module import CephadmOrchestrator # Some weired logic to make calling functions with multiple arguments work. @@ -53,7 +50,7 @@ else: assert 'either f([...]) or self.f([...])' - def do_work(arg): + def do_work(arg: Any) -> T: if not isinstance(arg, tuple): arg = (arg, ) try: @@ -78,7 +75,9 @@ }) try: j = json.loads(out) - except Exception as e: + except ValueError: + msg = 'Failed to parse health status: Cannot decode JSON' + logger.exception('%s: \'%s\'' % (msg, out)) raise OrchestratorError('failed to parse health status') return j['status'] @@ -91,9 +90,8 @@ return '@' in image_name -def str_to_datetime(input: str) -> datetime.datetime: - return datetime.datetime.strptime(input, DATEFMT) - - -def datetime_to_str(dt: datetime.datetime) -> str: - return dt.strftime(DATEFMT) +def resolve_ip(hostname: str) -> str: + try: + return socket.getaddrinfo(hostname, None, flags=socket.AI_CANONNAME, type=socket.SOCK_STREAM)[0][4][0] + except socket.gaierror as e: + raise OrchestratorError(f"Cannot resolve ip for host {hostname}: {e}") diff -Nru ceph-15.2.8/src/pybind/mgr/ceph_module.pyi ceph-15.2.11/src/pybind/mgr/ceph_module.pyi --- ceph-15.2.8/src/pybind/mgr/ceph_module.pyi 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/ceph_module.pyi 2021-04-19 13:47:30.000000000 +0000 @@ -49,7 +49,7 @@ def _ceph_get_latest_counter(self, svc_type, svc_name, path):... def _ceph_get_metadata(self, svc_type, svc_id):... def _ceph_get_daemon_status(self, svc_type, svc_id):... - def _ceph_send_command(self, *args, **kwargs):... + def _ceph_send_command(self, result, svc_type, svc_id, command, tag, inbuf):... def _ceph_set_health_checks(self, checks):... def _ceph_get_mgr_id(self):... def _ceph_get_option(self, key):... diff -Nru ceph-15.2.8/src/pybind/mgr/crash/module.py ceph-15.2.11/src/pybind/mgr/crash/module.py --- ceph-15.2.8/src/pybind/mgr/crash/module.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/crash/module.py 2021-04-19 13:47:30.000000000 +0000 @@ -6,7 +6,7 @@ from collections import defaultdict from prettytable import PrettyTable import re -from threading import Event +from threading import Event, Lock DATEFMT = '%Y-%m-%dT%H:%M:%S.%f' @@ -36,6 +36,7 @@ def __init__(self, *args, **kwargs): super(Module, self).__init__(*args, **kwargs) self.crashes = None + self.crashes_lock = Lock() self.run = True self.event = Event() @@ -46,8 +47,9 @@ def serve(self): self.config_notify() while self.run: - self._refresh_health_checks() - self._prune(self.retain_interval) + with self.crashes_lock: + self._refresh_health_checks() + self._prune(self.retain_interval) wait = min(MAX_WAIT, max(self.warn_recent_interval / 100, MIN_WAIT)) self.event.wait(wait) self.event.clear() @@ -95,16 +97,17 @@ self.set_health_checks(health_checks) def handle_command(self, inbuf, command): - if not self.crashes: - self._load_crashes() - for cmd in self.COMMANDS: - if cmd['cmd'].startswith(command['prefix']): - handler = cmd['handler'] - break - if handler is None: - return errno.EINVAL, '', 'unknown command %s' % command['prefix'] + with self.crashes_lock: + if not self.crashes: + self._load_crashes() + for cmd in self.COMMANDS: + if cmd['cmd'].startswith(command['prefix']): + handler = cmd['handler'] + break + if handler is None: + return errno.EINVAL, '', 'unknown command %s' % command['prefix'] - return handler(self, command, inbuf) + return handler(self, command, inbuf) def time_from_string(self, timestr): # drop the 'Z' timezone indication, it's always UTC diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/cherrypy_backports.py ceph-15.2.11/src/pybind/mgr/dashboard/cherrypy_backports.py --- ceph-15.2.8/src/pybind/mgr/dashboard/cherrypy_backports.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/cherrypy_backports.py 2021-04-19 13:47:30.000000000 +0000 @@ -95,11 +95,16 @@ # Check if it's one of the known errors # Errors that are caught by PyOpenSSL, but thrown by # built-in ssl - _block_errors = ('unknown protocol', 'unknown ca', - 'unknown_ca', 'inappropriate fallback', + _block_errors = ('unknown protocol', 'unknown ca', 'unknown_ca', + 'unknown error', + 'https proxy request', 'inappropriate fallback', 'wrong version number', 'no shared cipher', 'certificate unknown', - 'ccs received early') + 'ccs received early', + 'certificate verify failed', # client cert w/o trusted CA + 'version too low', # caused by SSL3 connections + 'unsupported protocol', # caused by TLS1 connections + 'sslv3 alert bad certificate') for error_text in _block_errors: if error_text in e.args[1].lower(): # Accepted error, let's pass diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/constraints.txt ceph-15.2.11/src/pybind/mgr/dashboard/constraints.txt --- ceph-15.2.8/src/pybind/mgr/dashboard/constraints.txt 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/constraints.txt 2021-04-19 13:47:30.000000000 +0000 @@ -1,8 +1,7 @@ CherryPy==13.1.0 enum34==1.1.6 more-itertools==4.1.0 -PyJWT==1.6.4 -pyopenssl==17.5.0 +PyJWT==2.0.1 bcrypt==3.1.4 python3-saml==1.4.1 requests==2.20.0 diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/auth.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/auth.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/auth.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/auth.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,15 +1,21 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import +import http.cookies import logging -import cherrypy +import sys from . import ApiController, RESTController, \ - allow_empty_body + allow_empty_body, set_cookies from .. import mgr -from ..exceptions import DashboardException +from ..exceptions import InvalidCredentialsError, UserDoesNotExist from ..services.auth import AuthManager, JwtManager +from ..settings import Settings +# Python 3.8 introduced `samesite` attribute: +# https://docs.python.org/3/library/http.cookies.html#morsel-objects +if sys.version_info < (3, 8): + http.cookies.Morsel._reserved["samesite"] = "SameSite" # type: ignore # pylint: disable=W0212 logger = logging.getLogger('controllers.auth') @@ -19,33 +25,52 @@ """ Provide authenticates and returns JWT token. """ - def create(self, username, password): user_data = AuthManager.authenticate(username, password) user_perms, pwd_expiration_date, pwd_update_required = None, None, None - if user_data: - user_perms = user_data.get('permissions') - pwd_expiration_date = user_data.get('pwdExpirationDate', None) - pwd_update_required = user_data.get('pwdUpdateRequired', False) - - if user_perms is not None: - logger.debug('Login successful') - token = JwtManager.gen_token(username) - token = token.decode('utf-8') - cherrypy.response.headers['Authorization'] = "Bearer: {}".format(token) - return { - 'token': token, - 'username': username, - 'permissions': user_perms, - 'pwdExpirationDate': pwd_expiration_date, - 'sso': mgr.SSO_DB.protocol == 'saml2', - 'pwdUpdateRequired': pwd_update_required - } - - logger.debug('Login failed') - raise DashboardException(msg='Invalid credentials', - code='invalid_credentials', - component='auth') + max_attempt = Settings.ACCOUNT_LOCKOUT_ATTEMPTS + if max_attempt == 0 or mgr.ACCESS_CTRL_DB.get_attempt(username) < max_attempt: + if user_data: + user_perms = user_data.get('permissions') + pwd_expiration_date = user_data.get('pwdExpirationDate', None) + pwd_update_required = user_data.get('pwdUpdateRequired', False) + + if user_perms is not None: + url_prefix = 'https' if mgr.get_localized_module_option('ssl') else 'http' + logger.info('Login successful: %s', username) + mgr.ACCESS_CTRL_DB.reset_attempt(username) + mgr.ACCESS_CTRL_DB.save() + token = JwtManager.gen_token(username) + + # For backward-compatibility: PyJWT versions < 2.0.0 return bytes. + token = token.decode('utf-8') if isinstance(token, bytes) else token + + set_cookies(url_prefix, token) + return { + 'token': token, + 'username': username, + 'permissions': user_perms, + 'pwdExpirationDate': pwd_expiration_date, + 'sso': mgr.SSO_DB.protocol == 'saml2', + 'pwdUpdateRequired': pwd_update_required + } + mgr.ACCESS_CTRL_DB.increment_attempt(username) + mgr.ACCESS_CTRL_DB.save() + else: + try: + user = mgr.ACCESS_CTRL_DB.get_user(username) + user.enabled = False + mgr.ACCESS_CTRL_DB.save() + logging.warning('Maximum number of unsuccessful log-in attempts ' + '(%d) reached for ' + 'username "%s" so the account was blocked. ' + 'An administrator will need to re-enable the account', + max_attempt, username) + raise InvalidCredentialsError + except UserDoesNotExist: + raise InvalidCredentialsError + logger.info('Login failed: %s', username) + raise InvalidCredentialsError @RESTController.Collection('POST') @allow_empty_body diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/cephfs.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/cephfs.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/cephfs.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/cephfs.py 2021-04-19 13:47:30.000000000 +0000 @@ -290,10 +290,12 @@ client['type'] = "userspace" client['version'] = client['client_metadata']['ceph_version'] client['hostname'] = client['client_metadata']['hostname'] + client['root'] = client['client_metadata']['root'] elif "kernel_version" in client['client_metadata']: # pragma: no cover - no complexity client['type'] = "kernel" client['version'] = client['client_metadata']['kernel_version'] client['hostname'] = client['client_metadata']['hostname'] + client['root'] = client['client_metadata']['root'] else: # pragma: no cover - no complexity there client['type'] = "unknown" client['version'] = "" diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/cluster_configuration.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/cluster_configuration.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/cluster_configuration.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/cluster_configuration.py 2021-04-19 13:47:30.000000000 +0000 @@ -20,6 +20,9 @@ :return: list of config options extended by their current values """ config_dump = CephService.send_command('mon', 'config dump') + mgr_config = mgr.get('config') + config_dump.append({'name': 'fsid', 'section': 'mgr', 'value': mgr_config['fsid']}) + for config_dump_entry in config_dump: for i, elem in enumerate(options): if config_dump_entry['name'] == elem['name']: diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/docs.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/docs.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/docs.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/docs.py 2021-04-19 13:47:30.000000000 +0000 @@ -379,8 +379,11 @@ spec_url = "{}/docs/api.json".format(base) auth_header = cherrypy.request.headers.get('authorization') + auth_cookie = cherrypy.request.cookie['token'] jwt_token = "" - if auth_header is not None: + if auth_cookie is not None: + jwt_token = auth_cookie.value + elif auth_header is not None: scheme, params = auth_header.split(' ', 1) if scheme.lower() == 'bearer': jwt_token = params diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/erasure_code_profile.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/erasure_code_profile.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/erasure_code_profile.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/erasure_code_profile.py 2021-04-19 13:47:30.000000000 +0000 @@ -47,8 +47,8 @@ """ config = mgr.get('config') return { - # Because 'shec' is experimental it's not included - 'plugins': config['osd_erasure_code_plugins'].split() + ['shec'], + # Because 'shec' and 'clay' are experimental they're not included + 'plugins': config['osd_erasure_code_plugins'].split() + ['shec', 'clay'], 'directory': config['erasure_code_dir'], 'nodes': mgr.get('osd_map_tree')['nodes'], 'names': [name for name, _ in diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/grafana.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/grafana.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/grafana.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/grafana.py 2021-04-19 13:47:30.000000000 +0000 @@ -3,6 +3,7 @@ from . import (ApiController, BaseController, Endpoint, ReadPermission, UpdatePermission) +from .. import mgr from ..exceptions import DashboardException from ..grafana import GrafanaRestClient, push_local_dashboards from ..security import Scope @@ -11,11 +12,17 @@ @ApiController('/grafana', Scope.GRAFANA) class Grafana(BaseController): - @Endpoint() @ReadPermission def url(self): - response = {'instance': Settings.GRAFANA_API_URL} + grafana_url = mgr.get_module_option('GRAFANA_API_URL') + grafana_frontend_url = mgr.get_module_option('GRAFANA_FRONTEND_API_URL') + if grafana_frontend_url != '' and grafana_url == '': + url = '' + else: + url = (mgr.get_module_option('GRAFANA_FRONTEND_API_URL') + or mgr.get_module_option('GRAFANA_API_URL')).rstrip('/') + response = {'instance': url} return response @Endpoint() @@ -23,7 +30,7 @@ def validation(self, params): grafana = GrafanaRestClient() method = 'GET' - url = Settings.GRAFANA_API_URL.rstrip('/') + \ + url = str(Settings.GRAFANA_API_URL).rstrip('/') + \ '/api/dashboards/uid/' + params response = grafana.url_validation(method, url) return response diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/__init__.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/__init__.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/__init__.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/__init__.py 2021-04-19 13:47:30.000000000 +0000 @@ -964,3 +964,12 @@ except (AttributeError, KeyError): func._cp_config = {'tools.json_in.force': False} return func + + +def set_cookies(url_prefix, token): + cherrypy.response.cookie['token'] = token + if url_prefix == 'https': + cherrypy.response.cookie['token']['secure'] = True + cherrypy.response.cookie['token']['HttpOnly'] = True + cherrypy.response.cookie['token']['path'] = '/' + cherrypy.response.cookie['token']['SameSite'] = 'Strict' diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/osd.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/osd.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/osd.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/osd.py 2021-04-19 13:47:30.000000000 +0000 @@ -383,6 +383,17 @@ set(enabled_flags) - {'pauserd', 'pausewr'} | {'pause'}) return sorted(enabled_flags) + @staticmethod + def _update_flags(action, flags, ids=None): + if ids: + if flags: + ids = list(map(str, ids)) + CephService.send_command('mon', 'osd ' + action, who=ids, + flags=','.join(flags)) + else: + for flag in flags: + CephService.send_command('mon', 'osd ' + action, '', key=flag) + def list(self): return self._osd_flags() @@ -398,10 +409,56 @@ data = set(flags) added = data - enabled_flags removed = enabled_flags - data - for flag in added: - CephService.send_command('mon', 'osd set', '', key=flag) - for flag in removed: - CephService.send_command('mon', 'osd unset', '', key=flag) + + self._update_flags('set', added) + self._update_flags('unset', removed) + logger.info('Changed OSD flags: added=%s removed=%s', added, removed) return sorted(enabled_flags - removed | added) + + @Endpoint('PUT', 'individual') + @UpdatePermission + def set_individual(self, flags, ids): + """ + Updates flags (`noout`, `noin`, `nodown`, `noup`) for an individual + subset of OSDs. + """ + assert isinstance(flags, dict) + assert isinstance(ids, list) + assert all(isinstance(id, int) for id in ids) + + # These are to only flags that can be applied to an OSD individually. + all_flags = {'noin', 'noout', 'nodown', 'noup'} + added = set() + removed = set() + for flag, activated in flags.items(): + if flag in all_flags: + if activated is not None: + if activated: + added.add(flag) + else: + removed.add(flag) + + self._update_flags('set-group', added, ids) + self._update_flags('unset-group', removed, ids) + + logger.error('Changed individual OSD flags: added=%s removed=%s for ids=%s', + added, removed, ids) + + return {'added': sorted(added), + 'removed': sorted(removed), + 'ids': ids} + + @Endpoint('GET', 'individual') + @ReadPermission + def get_individual(self): + osd_map = mgr.get('osd_map')['osds'] + resp = [] + + for osd in osd_map: + resp.append({ + 'osd': osd['osd'], + 'flags': osd['state'] + }) + return resp diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/prometheus.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/prometheus.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/prometheus.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/prometheus.py 2021-04-19 13:47:30.000000000 +0000 @@ -29,20 +29,23 @@ def prometheus_proxy(self, method, path, params=None, payload=None): # type (str, str, dict, dict) return self._proxy(self._get_api_url(Settings.PROMETHEUS_API_HOST), - method, path, 'Prometheus', params, payload) + method, path, 'Prometheus', params, payload, + verify=Settings.PROMETHEUS_API_SSL_VERIFY) def alert_proxy(self, method, path, params=None, payload=None): # type (str, str, dict, dict) return self._proxy(self._get_api_url(Settings.ALERTMANAGER_API_HOST), - method, path, 'Alertmanager', params, payload) + method, path, 'Alertmanager', params, payload, + verify=Settings.ALERTMANAGER_API_SSL_VERIFY) def _get_api_url(self, host): return host.rstrip('/') + '/api/v1' - def _proxy(self, base_url, method, path, api_name, params=None, payload=None): - # type (str, str, str, str, dict, dict) + def _proxy(self, base_url, method, path, api_name, params=None, payload=None, verify=True): + # type (str, str, str, str, dict, dict, bool) try: - response = requests.request(method, base_url + path, params=params, json=payload) + response = requests.request(method, base_url + path, params=params, + json=payload, verify=verify) except Exception: raise DashboardException( "Could not reach {}'s API on {}".format(api_name, base_url), diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/rgw.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/rgw.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/rgw.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/rgw.py 2021-04-19 13:47:30.000000000 +0000 @@ -30,9 +30,23 @@ def status(self): status = {'available': False, 'message': None} try: + if not CephService.get_service_list('rgw'): + raise LookupError('No RGW service is running.') instance = RgwClient.admin_instance() # Check if the service is online. - if not instance.is_service_online(): # pragma: no cover - no complexity there + try: + is_online = instance.is_service_online() # pragma: no cover - no complexity there + except RequestException as e: + # Drop this instance because the RGW client seems not to + # exist anymore (maybe removed via orchestrator). Removing + # the instance from the cache will result in the correct + # error message next time when the backend tries to + # establish a new connection (-> 'No RGW found' instead + # of 'RGW REST API failed request ...'). + # Note, this only applies to auto-detected RGW clients. + RgwClient.drop_instance(instance.userid) + raise e + if not is_online: msg = 'Failed to connect to the Object Gateway\'s Admin Ops API.' raise RequestException(msg) # Ensure the API user ID is known by the RGW. diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/saml2.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/saml2.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/saml2.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/saml2.py 2021-04-19 13:47:30.000000000 +0000 @@ -16,7 +16,7 @@ from ..exceptions import UserDoesNotExist from ..services.auth import JwtManager from ..tools import prepare_url_prefix -from . import Controller, Endpoint, BaseController +from . import BaseController, Controller, Endpoint, allow_empty_body, set_cookies @Controller('/auth/saml2', secure=False) @@ -43,6 +43,7 @@ raise cherrypy.HTTPError(400, 'Single Sign-On is not configured.') @Endpoint('POST', path="") + @allow_empty_body def auth_response(self, **kwargs): Saml2._check_python_saml() req = Saml2._build_req(self._request, kwargs) @@ -70,6 +71,7 @@ token = JwtManager.gen_token(username) JwtManager.set_user(JwtManager.decode_token(token)) token = token.decode('utf-8') + set_cookies(url_prefix, token) raise cherrypy.HTTPRedirect("{}/#/login?access_token={}".format(url_prefix, token)) return { @@ -103,5 +105,6 @@ # pylint: disable=unused-argument Saml2._check_python_saml() JwtManager.reset_user() + cherrypy.response.cookie['token'] = {'expires': 0, 'max-age': 0} url_prefix = prepare_url_prefix(mgr.get_module_option('url_prefix', default='')) raise cherrypy.HTTPRedirect("{}/#/login".format(url_prefix)) diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/controllers/service.py ceph-15.2.11/src/pybind/mgr/dashboard/controllers/service.py --- ceph-15.2.8/src/pybind/mgr/dashboard/controllers/service.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/controllers/service.py 2021-04-19 13:47:30.000000000 +0000 @@ -1,15 +1,32 @@ -from typing import List, Optional +from typing import List, Optional, Dict import cherrypy -from . import ApiController, RESTController +from ceph.deployment.service_spec import ServiceSpec +from . import ApiController, RESTController, Task, Endpoint, ReadPermission +from . import CreatePermission, DeletePermission from .orchestrator import raise_if_no_orchestrator +from ..exceptions import DashboardException from ..security import Scope from ..services.orchestrator import OrchClient +from ..services.exception import handle_orchestrator_error + + +def service_task(name, metadata, wait_for=2.0): + return Task("service/{}".format(name), metadata, wait_for) @ApiController('/service', Scope.HOSTS) class Service(RESTController): + @Endpoint() + @ReadPermission + def known_types(self) -> List[str]: + """ + Get a list of known service types, e.g. 'alertmanager', + 'node-exporter', 'osd' or 'rgw'. + """ + return ServiceSpec.KNOWN_SERVICE_TYPES + @raise_if_no_orchestrator def list(self, service_name: Optional[str] = None) -> List[dict]: orch = OrchClient.instance() @@ -29,3 +46,31 @@ orch = OrchClient.instance() daemons = orch.services.list_daemons(service_name=service_name) return [d.to_json() for d in daemons] + + @CreatePermission + @raise_if_no_orchestrator + @handle_orchestrator_error('service') + @service_task('create', {'service_name': '{service_name}'}) + def create(self, service_spec: Dict, service_name: str): # pylint: disable=W0613 + """ + :param service_spec: The service specification as JSON. + :param service_name: The service name, e.g. 'alertmanager'. + :return: None + """ + try: + orch = OrchClient.instance() + orch.services.apply(service_spec) + except (ValueError, TypeError) as e: + raise DashboardException(e, component='service') + + @DeletePermission + @raise_if_no_orchestrator + @handle_orchestrator_error('service') + @service_task('delete', {'service_name': '{service_name}'}) + def delete(self, service_name: str): + """ + :param service_name: The service name, e.g. 'mds' or 'crash.foo'. + :return: None + """ + orch = OrchClient.instance() + orch.services.remove(service_name) diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/exceptions.py ceph-15.2.11/src/pybind/mgr/dashboard/exceptions.py --- ceph-15.2.8/src/pybind/mgr/dashboard/exceptions.py 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/exceptions.py 2021-04-19 13:47:30.000000000 +0000 @@ -45,6 +45,13 @@ return str(abs(self.errno)) if self.errno is not None else 'Error' +class InvalidCredentialsError(DashboardException): + def __init__(self): + super().__init__(msg='Invalid credentials', + code='invalid_credentials', + component='auth') + + # access control module exceptions class RoleAlreadyExists(Exception): def __init__(self, name): diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/images.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/images.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/images.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/images.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -9,6 +9,7 @@ before(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); // Need pool for image testing pools.navigateTo('create'); pools.create(poolName, 8, 'rbd'); @@ -25,6 +26,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); images.navigateTo(); }); @@ -68,6 +70,7 @@ before(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); // Need image for trash testing images.createImage(imageName, poolName, '1'); images.getFirstTableCell(imageName).should('exist'); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/iscsi.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/iscsi.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/iscsi.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/iscsi.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); iscsi.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/block/mirroring.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -7,6 +7,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); mirroring.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/configuration.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/configuration.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/configuration.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/configuration.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); configuration.navigateTo(); }); @@ -19,11 +20,7 @@ configuration.getExpandCollapseElement().click(); }); - it('should verify that selected footer increases when an entry is clicked', () => { - configuration.getTableSelectedCount().should('eq', 1); - }); - - it('should check that details table opens and tab is correct', () => { + it('should check that details table opens (w/o tab header)', () => { configuration.getStatusTables().should('be.visible'); configuration.getTabsCount().should('eq', 1); configuration.getTabText(0).should('eq', 'Details'); @@ -55,7 +52,7 @@ it('should show only modified configurations', () => { configuration.filterTable('Modified', 'yes'); - configuration.getTableFoundCount().should('eq', 1); + configuration.getTableFoundCount().should('eq', 2); }); it('should hide all modified configurations', () => { diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/crush-map.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/crush-map.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/crush-map.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/crush-map.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); crushmap.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/hosts.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/hosts.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/hosts.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/hosts.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); hosts.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/logs.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/logs.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/logs.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/logs.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -1,14 +1,11 @@ import { PoolPageHelper } from '../pools/pools.po'; -import { ConfigurationPageHelper } from './configuration.po'; import { LogsPageHelper } from './logs.po'; describe('Logs page', () => { const logs = new LogsPageHelper(); const pools = new PoolPageHelper(); - const configuration = new ConfigurationPageHelper(); const poolname = 'e2e_logs_test_pool'; - const configname = 'log_graylog_port'; const today = new Date(); let hour = today.getHours(); if (hour > 12) { @@ -18,6 +15,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); }); describe('breadcrumb and tab tests', () => { @@ -57,17 +55,4 @@ logs.checkAuditForPoolFunction(poolname, 'delete', hour, minute); }); }); - - describe('audit logs respond to editing configuration setting test', () => { - it('should change config settings and check audit logs reacted', () => { - configuration.navigateTo(); - configuration.edit(configname, ['global', '5']); - - logs.navigateTo(); - logs.checkAuditForConfigChange(configname, 'global', hour, minute); - - configuration.navigateTo(); - configuration.configClear(configname); - }); - }); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/mgr-modules.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/mgr-modules.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/mgr-modules.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/mgr-modules.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); mgrmodules.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/monitors.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/monitors.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/monitors.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/monitors.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); monitors.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/osds.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/osds.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/osds.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/cluster/osds.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); osds.navigateTo(); }); @@ -37,10 +38,6 @@ osds.getExpandCollapseElement().click(); }); - it('should verify that selected footer increases', () => { - osds.getTableSelectedCount().should('equal', 1); - }); - it('should show the correct text for the tab labels', () => { cy.get('#tabset-osd-details > div > tab').then(($tabs) => { const tabHeadings = $tabs.map((_i, e) => e.getAttribute('heading')).get(); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/filesystems/filesystems.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/filesystems/filesystems.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/filesystems/filesystems.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/filesystems/filesystems.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); filesystems.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/pools/pools.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -6,6 +6,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); pools.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -6,6 +6,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); buckets.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.po.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.po.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.po.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/buckets.po.ts 2021-04-19 13:47:30.000000000 +0000 @@ -68,7 +68,7 @@ cy.get('@versioningValueCell').should('have.text', this.versioningStateEnabled); // Disable versioning: - this.navigateEdit(name, false); + this.navigateEdit(name); cy.get('label[for=versioning]').click(); cy.get('input[id=versioning]').should('not.be.checked'); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/daemons.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/daemons.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/daemons.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/daemons.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -5,6 +5,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); daemons.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/users.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/users.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/users.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/rgw/users.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -6,6 +6,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); users.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/dashboard.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/dashboard.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/dashboard.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/dashboard.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -18,6 +18,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); dashboard.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/notification.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/notification.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/notification.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/notification.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -8,6 +8,7 @@ before(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); pools.navigateTo('create'); pools.create(poolName, 8); pools.edit_pool_pg(poolName, 4, false); @@ -15,12 +16,14 @@ after(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); pools.navigateTo(); pools.delete(poolName); }); beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); pools.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/role-mgmt.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/role-mgmt.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/role-mgmt.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/role-mgmt.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -6,6 +6,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); roleMgmt.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/user-mgmt.e2e-spec.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/user-mgmt.e2e-spec.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/user-mgmt.e2e-spec.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/integration/ui/user-mgmt.e2e-spec.ts 2021-04-19 13:47:30.000000000 +0000 @@ -6,6 +6,7 @@ beforeEach(() => { cy.login(); + Cypress.Cookies.preserveOnce('token'); userMgmt.navigateTo(); }); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/support/commands.ts ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/support/commands.ts --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/cypress/support/commands.ts 2020-12-16 17:29:50.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/cypress/support/commands.ts 2021-04-19 13:47:30.000000000 +0000 @@ -13,7 +13,6 @@ const fillAuth = () => { window.localStorage.setItem('dashboard_username', auth.username); - window.localStorage.setItem('access_token', auth.token); window.localStorage.setItem('dashboard_permissions', auth.permissions); window.localStorage.setItem('user_pwd_expiration_date', auth.pwdExpirationDate); window.localStorage.setItem('user_pwd_update_required', auth.pwdUpdateRequired); diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/1.9e79c41bbaed982a50af.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/1.9e79c41bbaed982a50af.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/1.9e79c41bbaed982a50af.js 2020-12-16 17:37:20.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/1.9e79c41bbaed982a50af.js 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+26A":function(l,n,e){"use strict";e.d(n,"a",(function(){return d}));var t=e("s7LF"),i=e("LvDl"),u=e("GyhO"),s=e("cp0P"),a=e("NJ9Y"),o=(e("XED3"),e("QFaf")),r=e("kvvV");e("kn/O");class d{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.pools=[],this.directions=[{key:"rx-tx",desc:"Bidirectional"},{key:"rx",desc:"Unidirectional (receive-only)"}],this.createForm()}createForm(){this.importBootstrapForm=new o.a({siteName:new t.i("",{validators:[t.B.required]}),direction:new t.i("rx-tx",{}),pools:new t.k({},{validators:[this.validatePools()]}),token:new t.i("",{validators:[t.B.required,this.validateToken()]})})}ngOnInit(){this.rbdMirroringService.getSiteName().subscribe(l=>{this.importBootstrapForm.get("siteName").setValue(l.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.pools=l.content_data.pools.reduce((l,n)=>(l.push({name:n.name,mirror_mode:n.mirror_mode}),l),[]);const n=this.importBootstrapForm.get("pools");i.each(this.pools,l=>{const e=l.name,i="disabled"===l.mirror_mode,u=n.controls[e];u?i&&u.disabled?u.enable():!i&&u.enabled&&(u.disable(),u.setValue(!0)):n.addControl(e,new t.i({value:!i,disabled:!i}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return l=>{let n=0;return i.each(l.controls,l=>{!0===l.value&&++n}),n>0?null:{requirePool:!0}}}validateToken(){return l=>{try{if(JSON.parse(atob(l.value)))return null}catch(n){}return{invalidToken:!0}}}import(){const l=[],n=[],e=this.importBootstrapForm.get("pools");i.each(e.controls,(e,t)=>{!0===e.value&&(l.push(t),e.disabled||n.push(t))});const t={mirror_mode:"image"};let o=Object(u.a)(this.rbdMirroringService.setSiteName(this.importBootstrapForm.getValue("siteName")),Object(s.a)(n.map(l=>this.rbdMirroringService.updatePool(l,t))));o=l.reduce((l,n)=>Object(u.a)(l,this.rbdMirroringService.importBootstrapToken(n,this.importBootstrapForm.getValue("direction"),this.importBootstrapForm.getValue("token"))),o).pipe(Object(a.a)());const d=()=>{this.rbdMirroringService.refresh(),this.importBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new r.a("rbd/mirroring/bootstrap/import",{}),call:o}).subscribe(void 0,d,()=>{d(),this.modalRef.hide()})}}},"0BYw":function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("EEJc"),c=e("ajRT"),m=e("mXUL"),p=e("IZUe"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("daK0"),S=e("LqlI"),_=e("9nlD"),R=e("Ekvf"),y=e("F83c"),w=e("GiVz");e.d(n,"a",(function(){return O}));var k=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","pool"],["id","pool"],["name","pool"],["placeholder","Pool name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,1)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,3,0,"pool"),l(n,7,0,"pool")}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["-- No rbd pools available --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["-- Select a pool --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.pool_name),l(n,2,0,n.context.$implicit.pool_name)}),(function(l,n){l(n,3,0,n.context.$implicit.pool_name)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","pool"],["id","pool"],["name","pool"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](9,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,N)),t["ɵdid"](11,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](13,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](15,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"pool"),l(n,7,0,"pool"),l(n,9,0,null===e.pools),l(n,11,0,null!==e.pools&&0===e.pools.length),l(n,13,0,null!==e.pools&&e.pools.length>0),l(n,15,0,e.pools)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Namespace already exists."]))],null,null)}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,51,"cd-modal",[],null,null,null,d.c,d.b)),t["ɵdid"](1,49152,null,0,c.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Create Namespace"])),(l()(),t["ɵeld"](4,0,null,1,47,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,46,"form",[["name","namespaceForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,i.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](9,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,33,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](13,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","pool"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"])),(l()(),t["ɵeld"](18,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](20,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,T)),t["ɵdid"](22,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,D)),t["ɵdid"](24,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](25,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](26,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","namespace"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](31,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](32,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","namespace"],["id","namespace"],["name","namespace"],["placeholder","Namespace name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,33)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,33).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,33)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,33)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](33,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](35,671744,[[3,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](37,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](38,4210688,null,0,p.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](39,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](40,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,P)),t["ɵdid"](42,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,x)),t["ɵdid"](44,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](45,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](46,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](47,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submit()&&t),t}),h.b,h.a)),t["ɵdid"](48,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Create Namespace"])),(l()(),t["ɵeld"](50,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,f.b,f.a)),t["ɵdid"](51,49152,null,0,v.a,[r.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.namespaceForm),l(n,10,0,e.namespaceForm),l(n,13,0),l(n,20,0,!e.poolPermission.read),l(n,22,0,e.poolPermission.read),l(n,24,0,e.namespaceForm.showError("pool",t["ɵnov"](n,7),"required")),l(n,26,0),l(n,35,0,"namespace"),l(n,38,0,""),l(n,40,0,"namespace"),l(n,42,0,e.namespaceForm.showError("namespace",t["ɵnov"](n,7),"required")),l(n,44,0,e.namespaceForm.showError("namespace",t["ɵnov"](n,7),"namespaceExists")),l(n,48,0,e.namespaceForm),l(n,51,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,12,0,t["ɵnov"](n,13).hasErrors,t["ɵnov"](n,13).hasSuccess),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess),l(n,32,0,t["ɵnov"](n,37).ngClassUntouched,t["ɵnov"](n,37).ngClassTouched,t["ɵnov"](n,37).ngClassPristine,t["ɵnov"](n,37).ngClassDirty,t["ɵnov"](n,37).ngClassValid,t["ɵnov"](n,37).ngClassInvalid,t["ɵnov"](n,37).ngClassPending,t["ɵnov"](n,40).validClass,t["ɵnov"](n,40).invalidClass)}))}function B(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-namespace-form-modal",[],null,null,null,q,k)),t["ɵdid"](1,114688,null,0,C.a,[S.a,a.a,_.a,R.a,y.a,w.a],null,null)],(function(l,n){l(n,1,0)}),null)}var O=t["ɵccf"]("cd-rbd-namespace-form-modal",C.a,B,{},{},[])},"0rTx":function(l,n,e){"use strict";var t=e("8Y7J"),i=e("EEJc"),u=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("mXUL"),r=e("IZUe"),d=e("ANnk"),c=e("f/UV"),m=e("aexS"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("2GqK"),S=e("F83c"),_=e("LqlI"),R=e("2EZI"),y=e("kn/O");e.d(n,"a",(function(){return N}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,48,"cd-modal",[],null,null,null,i.c,i.b)),t["ɵdid"](1,49152,null,0,u.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Restore Image"])),(l()(),t["ɵeld"](4,0,null,1,44,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,43,"form",[["class","form"],["name","restoreForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,30,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To restore"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](17,null,["","@",""])),(l()(),t["ɵted"](-1,null,[",  "])),(l()(),t["ɵeld"](19,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["type the image's new name and click"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](22,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Restore Image"])),(l()(),t["ɵted"](-1,null,[". "])),(l()(),t["ɵeld"](25,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](26,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["New Name"])),(l()(),t["ɵeld"](31,0,null,0,8,"input",[["autocomplete","off"],["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,32)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,32).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,32)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,32)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](32,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](34,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](36,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](37,4210688,null,0,r.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](38,4210688,null,0,d.a,[[2,c.a],m.a,t.ElementRef],null,null),t["ɵdid"](39,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](41,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](42,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](43,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.restore()&&t),t}),h.b,h.a)),t["ɵdid"](45,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Restore Image"])),(l()(),t["ɵeld"](47,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,f.b,f.a)),t["ɵdid"](48,49152,null,0,v.a,[p.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.restoreForm),l(n,10,0,e.restoreForm),l(n,26,0),l(n,34,0,"name"),l(n,37,0,""),l(n,39,0,"name"),l(n,41,0,e.restoreForm.showError("name",t["ɵnov"](n,7),"required")),l(n,45,0,e.restoreForm),l(n,48,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,17,0,e.imageSpec,e.imageId),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess),l(n,31,0,t["ɵnov"](n,36).ngClassUntouched,t["ɵnov"](n,36).ngClassTouched,t["ɵnov"](n,36).ngClassPristine,t["ɵnov"](n,36).ngClassDirty,t["ɵnov"](n,36).ngClassValid,t["ɵnov"](n,36).ngClassInvalid,t["ɵnov"](n,36).ngClassPending,t["ɵnov"](n,39).validClass,t["ɵnov"](n,39).invalidClass)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-restore-modal",[],null,null,null,I,w)),t["ɵdid"](1,114688,null,0,C.a,[S.a,_.a,R.a,y.a],null,null)],(function(l,n){l(n,1,0)}),null)}var N=t["ɵccf"]("cd-rbd-trash-restore-modal",C.a,E,{},{},[])},"2GqK":function(l,n,e){"use strict";e.d(n,"a",(function(){return u})),e("F83c"),e("2EZI");var t=e("kvvV"),i=e("jVDg");e("kn/O");class u{constructor(l,n,e,t){this.rbdService=l,this.modalRef=n,this.fb=e,this.taskWrapper=t}ngOnInit(){this.imageSpec=new i.a(this.poolName,this.namespace,this.imageName).toString(),this.restoreForm=this.fb.group({name:this.imageName})}restore(){const l=this.restoreForm.getValue("name"),n=new i.a(this.poolName,this.namespace,this.imageId);this.taskWrapper.wrapTaskAroundCall({task:new t.a("rbd/trash/restore",{image_id_spec:n.toString(),new_image_name:l}),call:this.rbdService.restoreTrash(n,l)}).subscribe(void 0,()=>{this.restoreForm.setErrors({cdSubmitButton:!0})},()=>{this.modalRef.hide()})}}},"2JDI":function(l,n,e){"use strict";e.d(n,"a",(function(){return a}));var t=e("wd/R"),i=(e("F83c"),e("2EZI"),e("1Ni5")),u=e("kvvV"),s=e("jVDg");e("kn/O");class a{constructor(l,n,e,t){this.rbdService=l,this.modalRef=n,this.fb=e,this.taskWrapper=t,this.minDate=new Date,this.bsConfig={dateInputFormat:"YYYY-MM-DD HH:mm:ss",containerClass:"theme-default"},this.createForm()}createForm(){this.moveForm=this.fb.group({expiresAt:["",[i.a.custom("format",l=>!(""===l||t(l,"YYYY-MM-DD HH:mm:ss").isValid())),i.a.custom("expired",l=>t().isAfter(l))]]})}ngOnInit(){this.imageSpec=new s.a(this.poolName,this.namespace,this.imageName),this.imageSpecStr=this.imageSpec.toString(),this.pattern=`${this.poolName}/${this.imageName}`}moveImage(){let l=0;const n=this.moveForm.getValue("expiresAt");n&&(l=t(n).diff(t(),"seconds",!0)),l<0&&(l=0),this.taskWrapper.wrapTaskAroundCall({task:new u.a("rbd/trash/move",{image_spec:this.imageSpecStr}),call:this.rbdService.moveTrash(this.imageSpec,l)}).subscribe(void 0,void 0,()=>{this.modalRef.hide()})}}},"3IYD":function(l,n,e){"use strict";var t=e("8Y7J"),i=e("SVse"),u=e("8xTl"),s=e("EEJc"),a=e("ajRT"),o=e("s7LF"),r=e("+gVj"),d=e("mXUL"),c=e("IZUe"),m=e("ANnk"),p=e("f/UV"),h=e("aexS"),g=e("gp3X"),f=e("sb0X"),v=e("KVJa"),b=e("Z21x"),C=e("sne2"),S=e("Fd71"),_=e("LqlI"),R=e("F83c"),y=e("VXsX"),w=e("9nlD"),k=e("GiVz");e.d(n,"a",(function(){return V}));var I=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[t["ɵpid"](0,i.TitleCasePipe,[]),t["ɵpid"](0,u.a,[]),(l()(),t["ɵeld"](2,0,null,null,40,"cd-modal",[],null,null,null,s.c,s.b)),t["ɵdid"](3,49152,null,0,a.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),t["ɵted"](5,null,[""," ",""])),t["ɵppd"](6,1),t["ɵppd"](7,1),(l()(),t["ɵeld"](8,0,null,1,34,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](9,0,null,null,33,"form",[["name","snapshotForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,11).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,11).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,14).onSubmit()&&i),i}),null,null)),t["ɵdid"](10,16384,null,0,o.G,[],null,null),t["ɵdid"](11,540672,[["formDir",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,o.d,null,[o.l]),t["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),t["ɵdid"](14,16384,null,0,r.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](15,0,null,null,18,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](16,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](17,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","snapshotName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](22,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","snapshotName"],["id","snapshotName"],["name","snapshotName"],["placeholder","Snapshot name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,24)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,24).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,24)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,24)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](24,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](26,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](28,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](29,4210688,null,0,c.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](30,4210688,null,0,m.a,[[2,p.a],h.a,t.ElementRef],null,null),t["ɵdid"](31,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](33,16384,null,0,i.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](34,0,null,null,8,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](36,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submit()&&t),t}),g.b,g.a)),t["ɵdid"](37,114688,null,0,f.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](38,0,[""," ",""])),t["ɵppd"](39,1),t["ɵppd"](40,1),(l()(),t["ɵeld"](41,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,v.b,v.a)),t["ɵdid"](42,49152,null,0,b.a,[i.Location,C.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.modalRef),l(n,11,0,e.snapshotForm),l(n,14,0,e.snapshotForm),l(n,17,0),l(n,26,0,"snapshotName"),l(n,29,0,""),l(n,31,0,"snapshotName"),l(n,33,0,e.snapshotForm.showError("snapshotName",t["ɵnov"](n,11),"required")),l(n,37,0,e.snapshotForm),l(n,42,0,"Close",e.modalRef.hide)}),(function(l,n){var e=n.component,i=t["ɵunv"](n,5,0,l(n,6,0,t["ɵnov"](n,0),e.action)),u=t["ɵunv"](n,5,1,l(n,7,0,t["ɵnov"](n,1),e.resource));l(n,5,0,i,u),l(n,9,0,t["ɵnov"](n,13).ngClassUntouched,t["ɵnov"](n,13).ngClassTouched,t["ɵnov"](n,13).ngClassPristine,t["ɵnov"](n,13).ngClassDirty,t["ɵnov"](n,13).ngClassValid,t["ɵnov"](n,13).ngClassInvalid,t["ɵnov"](n,13).ngClassPending),l(n,16,0,t["ɵnov"](n,17).hasErrors,t["ɵnov"](n,17).hasSuccess),l(n,23,0,t["ɵnov"](n,28).ngClassUntouched,t["ɵnov"](n,28).ngClassTouched,t["ɵnov"](n,28).ngClassPristine,t["ɵnov"](n,28).ngClassDirty,t["ɵnov"](n,28).ngClassValid,t["ɵnov"](n,28).ngClassInvalid,t["ɵnov"](n,28).ngClassPending,t["ɵnov"](n,31).validClass,t["ɵnov"](n,31).invalidClass);var s=t["ɵunv"](n,38,0,l(n,39,0,t["ɵnov"](n,0),e.action)),a=t["ɵunv"](n,38,1,l(n,40,0,t["ɵnov"](n,1),e.resource));l(n,38,0,s,a)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-snapshot-form-modal",[],null,null,null,N,I)),t["ɵdid"](1,114688,null,0,S.a,[_.a,R.a,y.a,w.a,k.a,C.b],null,null)],(function(l,n){l(n,1,0)}),null)}var V=t["ɵccf"]("cd-rbd-snapshot-form-modal",S.a,F,{},{},[])},"3ris":function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("yYhs"),i=e("LvDl"),u=(e("uIqm"),e("oxzT"));e("iExv"),e("uYzU");class s{constructor(l,n,e){this.i18n=l,this.iscsiBackstorePipe=n,this.booleanTextPipe=e,this.icons=u.a,this.metadata={},this.nodes=[],this.treeOptions={useVirtualScroll:!0,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}}}set content(l){this.detailTable=l,l&&l.updateColumns()}ngOnInit(){this.columns=[{prop:"displayName",name:this.i18n("Name"),flexGrow:1,cellTemplate:this.highlightTpl},{prop:"current",name:this.i18n("Current"),flexGrow:1,cellTemplate:this.highlightTpl},{prop:"default",name:this.i18n("Default"),flexGrow:1,cellTemplate:this.highlightTpl}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.generateTree()),this.data=void 0}generateTree(){const l=i.cloneDeep(this.selectedItem.target_controls);this.cephIscsiConfigVersion>10&&i.extend(l,i.cloneDeep(this.selectedItem.auth)),this.metadata={root:l};const n={target:{expanded:i.join(this.selectedItem.cdExecuting?[u.a.large,u.a.spinner,u.a.spin]:[u.a.large,u.a.bullseye]," ")},initiators:{expanded:i.join([u.a.large,u.a.user]," "),leaf:i.join([u.a.user]," ")},groups:{expanded:i.join([u.a.large,u.a.users]," "),leaf:i.join([u.a.users]," ")},disks:{expanded:i.join([u.a.large,u.a.disk]," "),leaf:i.join([u.a.disk]," ")},portals:{expanded:i.join([u.a.large,u.a.server]," "),leaf:i.join([u.a.server]," ")}},e=[];i.forEach(this.selectedItem.disks,l=>{const t="disk_"+l.pool+"_"+l.image;this.metadata[t]={controls:l.controls,backstore:l.backstore},["wwn","lun"].forEach(n=>{n in l&&(this.metadata[t][n]=l[n])}),e.push({name:`${l.pool}/${l.image}`,cdId:t,cdIcon:n.disks.leaf})});const t=[];i.forEach(this.selectedItem.portals,l=>{t.push({name:`${l.host}:${l.ip}`,cdIcon:n.portals.leaf})});const s=[];i.forEach(this.selectedItem.clients,l=>{const e=i.cloneDeep(l.auth);l.info&&(i.extend(e,l.info),delete e.state,i.forEach(Object.keys(l.info.state),n=>{e[n.toLowerCase()]=l.info.state[n]})),this.metadata["client_"+l.client_iqn]=e;const t=[];l.luns.forEach(l=>{t.push({name:`${l.pool}/${l.image}`,cdId:"disk_"+l.pool+"_"+l.image,cdIcon:n.disks.leaf})});let u="";l.info&&(u=Object.keys(l.info.state).includes("LOGGED_IN")?"logged_in":"logged_out"),s.push({name:l.client_iqn,status:u,cdId:"client_"+l.client_iqn,children:t,cdIcon:n.initiators.leaf})});const a=[];i.forEach(this.selectedItem.groups,l=>{const e=[];l.disks.forEach(l=>{e.push({name:`${l.pool}/${l.image}`,cdId:"disk_"+l.pool+"_"+l.image,cdIcon:n.disks.leaf})});const t=[];l.members.forEach(l=>{t.push({name:l,cdId:"client_"+l})}),a.push({name:l.group_id,cdIcon:n.groups.leaf,children:[{name:"Disks",children:e,cdIcon:n.disks.expanded},{name:"Initiators",children:t,cdIcon:n.initiators.expanded}]})}),this.nodes=[{name:this.selectedItem.target_iqn,cdId:"root",isExpanded:!0,cdIcon:n.target.expanded,children:[{name:"Disks",isExpanded:!0,children:e,cdIcon:n.disks.expanded},{name:"Portals",isExpanded:!0,children:t,cdIcon:n.portals.expanded},{name:"Initiators",isExpanded:!0,children:s,cdIcon:n.initiators.expanded},{name:"Groups",isExpanded:!0,children:a,cdIcon:n.groups.expanded}]}]}format(l){return"boolean"==typeof l?this.booleanTextPipe.transform(l):l}onNodeSelected(l,n){if(t.a.ACTIVATE(l,n,!0),n.data.cdId){this.title=n.data.name;const l=this.metadata[n.data.cdId]||{};"root"===n.data.cdId?(this.columns[2].isHidden=!1,this.data=i.map(this.settings.target_default_controls,(n,e)=>({displayName:e,default:n=this.format(n),current:i.isUndefined(l[e])?n:this.format(l[e])})),this.cephIscsiConfigVersion>10&&["user","password","mutual_user","mutual_password"].forEach(n=>{this.data.push({displayName:n,default:null,current:l[n]})})):n.data.cdId.toString().startsWith("disk_")?(this.columns[2].isHidden=!1,this.data=i.map(this.settings.disk_default_controls[l.backstore],(n,e)=>({displayName:e,default:n=this.format(n),current:i.isUndefined(l.controls[e])?n:this.format(l.controls[e])})),this.data.push({displayName:"backstore",default:this.iscsiBackstorePipe.transform(this.settings.default_backstore),current:this.iscsiBackstorePipe.transform(l.backstore)}),["wwn","lun"].forEach(n=>{n in l&&this.data.push({displayName:n,default:void 0,current:l[n]})})):(this.columns[2].isHidden=!0,this.data=i.map(l,(l,n)=>({displayName:n,default:void 0,current:this.format(l)})))}else this.data=void 0;this.detailTable&&this.detailTable.updateColumns()}onUpdateData(){this.tree.treeModel.expandAll()}}},"5GyT":function(l,n,e){"use strict";e.d(n,"a",(function(){return v})),e.d(n,"b",(function(){return f}));var t=e("LvDl"),i=(e("F83c"),e("+fVR")),u=e("OLbh"),s=e("0+/T"),a=(e("sne2"),e("uIqm"),e("x38r")),o=e("oxzT"),r=e("yJti"),d=e("vCyI"),c=e("kvvV"),m=e("jVDg"),p=(e("Fgil"),e("o4+5"),e("aexS"),e("VTlA"),e("kn/O"),e("EgGo")),h=e("2JDI"),g=e("u0yg");const f=new p.a("block/rbd");class v extends i.a{constructor(l,n,e,t,i,u,s,a,r,c){super(),this.authStorageService=l,this.rbdService=n,this.dimlessBinaryPipe=e,this.dimlessPipe=t,this.modalService=i,this.taskWrapper=u,this.taskListService=s,this.i18n=a,this.urlBuilder=r,this.actionLabels=c,this.selection=new d.a,this.builders={"rbd/create":l=>this.createRbdFromTask(l.pool_name,l.namespace,l.image_name),"rbd/delete":l=>this.createRbdFromTaskImageSpec(l.image_spec),"rbd/clone":l=>this.createRbdFromTask(l.child_pool_name,l.child_namespace,l.child_image_name),"rbd/copy":l=>this.createRbdFromTask(l.dest_pool_name,l.dest_namespace,l.dest_image_name)},this.permission=this.authStorageService.getPermissions().rbdImage;const p=()=>this.selection.first()&&new m.a(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name).toStringEncoded();this.tableActions=[{permission:"create",icon:o.a.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:l=>!l.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:o.a.edit,routerLink:()=>this.urlBuilder.getEdit(p()),name:this.actionLabels.EDIT},{permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>!l.hasSingleSelection||l.first().cdExecuting,icon:o.a.copy,routerLink:()=>"/block/rbd/copy/"+p(),name:this.actionLabels.COPY},{permission:"update",disable:l=>!l.hasSingleSelection||l.first().cdExecuting||!l.first().parent,icon:o.a.flatten,click:()=>this.flattenRbdModal(),name:this.actionLabels.FLATTEN},{permission:"delete",icon:o.a.destroy,click:()=>this.deleteRbdModal(),name:this.actionLabels.DELETE,disable:l=>this.getDeleteDisableDesc(l)},{permission:"delete",icon:o.a.trash,click:()=>this.trashRbdModal(),name:this.actionLabels.TRASH,disable:l=>!l.first()||!l.hasSingleSelection||l.first().image_format===g.a.V1}]}createRbdFromTaskImageSpec(l){const n=m.a.fromString(l);return this.createRbdFromTask(n.poolName,n.namespace,n.imageName)}createRbdFromTask(l,n,e){const t=new g.b;return t.id="-1",t.unique_id="-1",t.name=e,t.namespace=n,t.pool_name=l,t.image_format=g.a.V2,t}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"name",flexGrow:2,cellTransformation:a.a.executing},{name:this.i18n("Pool"),prop:"pool_name",flexGrow:2},{name:this.i18n("Namespace"),prop:"namespace",flexGrow:2},{name:this.i18n("Size"),prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Objects"),prop:"num_objs",flexGrow:1,cellClass:"text-right",pipe:this.dimlessPipe},{name:this.i18n("Object size"),prop:"obj_size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Provisioned"),prop:"disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe},{name:this.i18n("Total provisioned"),prop:"total_disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe},{name:this.i18n("Parent"),prop:"parent",flexGrow:2,cellTemplate:this.parentTpl}],this.taskListService.init(()=>this.rbdService.list(),l=>this.prepareResponse(l),l=>this.images=l,()=>this.onFetchError(),l=>["rbd/clone","rbd/copy","rbd/create","rbd/delete","rbd/edit","rbd/flatten","rbd/trash/move"].includes(l.name),(l,n)=>{let e;switch(n.name){case"rbd/copy":e=new m.a(n.metadata.dest_pool_name,n.metadata.dest_namespace,n.metadata.dest_image_name).toString();break;case"rbd/clone":e=new m.a(n.metadata.child_pool_name,n.metadata.child_namespace,n.metadata.child_image_name).toString();break;case"rbd/create":e=new m.a(n.metadata.pool_name,n.metadata.namespace,n.metadata.image_name).toString();break;default:e=n.metadata.image_spec}return e===new m.a(l.pool_name,l.namespace,l.name).toString()},this.builders)}onFetchError(){this.table.reset(),this.viewCacheStatusList=[{status:r.a.ValueException}]}prepareResponse(l){let n=[];const e={};l.forEach(l=>{t.isUndefined(e[l.status])&&(e[l.status]=[]),e[l.status].push(l.pool_name),n=n.concat(l.value)});const i=[];return t.forEach(e,(l,n)=>{i.push({status:parseInt(n,10),statusFor:(l.length>1?"pools ":"pool ")+""+l.join(", ")+""})}),this.viewCacheStatusList=i,n}updateSelection(l){this.selection=l}deleteRbdModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().name,t=new m.a(l,n,e);this.modalRef=this.modalService.show(s.a,{initialState:{itemDescription:"RBD",itemNames:[t],bodyTemplate:this.deleteTpl,bodyContext:{hasSnapshots:this.hasSnapshots(),snapshots:this.listProtectedSnapshots()},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new c.a("rbd/delete",{image_spec:t.toString()}),call:this.rbdService.delete(t)})}})}trashRbdModal(){const l={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,hasSnapshots:this.hasSnapshots()};this.modalRef=this.modalService.show(h.a,{initialState:l})}flattenRbd(l){this.taskWrapper.wrapTaskAroundCall({task:new c.a("rbd/flatten",{image_spec:l.toString()}),call:this.rbdService.flatten(l)}).subscribe(void 0,void 0,()=>{this.modalRef.hide()})}flattenRbdModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().name,t=this.selection.first().parent,i=new m.a(t.pool_name,t.pool_namespace,t.image_name),s=new m.a(l,n,e),a={titleText:"RBD flatten",buttonText:"Flatten",bodyTpl:this.flattenTpl,bodyData:{parent:`${i}@${t.snap_name}`,child:s.toString()},onSubmit:()=>{this.flattenRbd(s)}};this.modalRef=this.modalService.show(u.a,{initialState:a})}hasSnapshots(){return(this.selection.first().snapshots||[]).length>0}hasClonedSnapshots(l){return(l.snapshots||[]).some(l=>l.children&&l.children.length>0)}listProtectedSnapshots(){return this.selection.first().snapshots.reduce((l,n)=>(n.is_protected&&l.push(n.name),l),[])}getDeleteDisableDesc(l){const n=l.first();return n&&this.hasClonedSnapshots(n)?this.i18n("This RBD has cloned snapshots. Please delete related RBDs before deleting this RBD."):!l.first()||!l.hasSingleSelection||this.hasClonedSnapshots(l.first())}}},BH9v:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("aXbf");class s{constructor(l,n){this.control=l,this.formatter=n}setValue(l){const n=this.formatter.toMilliseconds(l);this.control.control.setValue(n+" ms")}ngOnInit(){this.setValue(this.control.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.control.value))}onUpdate(l){this.setValue(l)}}var a=e("ANnk"),o=e("f/UV"),r=e("aexS"),d=e("+gVj"),c=e("LvDl"),m=e("IzCI");class p{constructor(l,n,e,i){this.elementRef=l,this.control=n,this.dimlessBinaryPerSecondPipe=e,this.formatter=i,this.ngModelChange=new t.EventEmitter,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.el.value))}setValue(l){/^[\d.]+$/.test(l)&&(l+=this.defaultUnit||"m");const n=this.formatter.toBytes(l,0),e=this.round(n);this.el.value=this.dimlessBinaryPerSecondPipe.transform(e),null!==n?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(l){if(null!==l&&0!==l){if(!c.isUndefined(this.minBytes)&&lthis.maxBytes)return this.maxBytes;if(!c.isUndefined(this.roundPower)){const n=Math.round(Math.log(l)/Math.log(this.roundPower));return Math.pow(this.roundPower,n)}}return l}onBlur(l){this.setValue(l)}}class h{constructor(l,n){this.formatter=l,this.ngControl=n}setValue(l){const n=this.formatter.toIops(l);this.ngControl.control.setValue(n+" IOPS")}ngOnInit(){this.setValue(this.ngControl.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.ngControl.value))}onUpdate(l){this.setValue(l)}}var g=e("mXUL"),f=e("4HWh"),v=e("p4Cf"),b=e("SVse");e("rFfW"),e("o8EM"),e.d(n,"a",(function(){return C})),e.d(n,"b",(function(){return I}));var C=t["ɵcrt"]({encapsulation:0,styles:[[".collapsible[_ngcontent-%COMP%]{cursor:pointer;-moz-user-select:none;user-select:none}"]],data:{}});function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdMilliseconds",""],["class","form-control"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,2).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,2)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,7).onUpdate(e.target.value)&&i),i}),null,null)),t["ɵdid"](2,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](4,671744,null,0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](6,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](7,81920,null,0,s,[i.q,u.a],{ngDataReady:[0,"ngDataReady"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,i.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function _(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdDimlessBinaryPerSecond",""],["class","form-control"],["defaultUnit","b"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,2).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,2)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,7).onBlur(e.target.value)&&i),i}),null,null)),t["ɵdid"](2,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](4,671744,null,0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](6,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](7,81920,null,0,p,[t.ElementRef,i.q,m.a,u.a],{ngDataReady:[0,"ngDataReady"],defaultUnit:[1,"defaultUnit"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,i.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady,"b"),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function R(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdIops",""],["class","form-control"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,2).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,2)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,7).onUpdate(e.target.value)&&i),i}),null,null)),t["ɵdid"](2,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](4,671744,null,0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](6,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](7,81920,null,0,h,[u.a,i.q],{ngDataReady:[0,"ngDataReady"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,i.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The mininum value is 0"]))],null,null)}function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,29,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,g.b,g.a)),t["ɵdid"](1,1163264,null,2,d.c,[t.ElementRef,d.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](5,null,["",""])),(l()(),t["ɵeld"](6,0,null,null,2,"cd-helper",[],null,null,null,f.b,f.a)),t["ɵdid"](7,49152,null,0,v.a,[],null,null),(l()(),t["ɵted"](8,0,["",""])),(l()(),t["ɵeld"](9,0,null,0,20,"div",[],[[8,"className",0]],null,null,null,null)),(l()(),t["ɵeld"](10,0,null,null,17,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,7,null,null,null,null,null,null,null)),t["ɵdid"](12,16384,null,0,b.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,S)),t["ɵdid"](14,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,_)),t["ɵdid"](16,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,R)),t["ɵdid"](18,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵeld"](19,0,null,null,8,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](20,0,null,null,7,"button",[["class","btn btn-light"],["data-toggle","button"],["title","Remove the local configuration value. The parent configuration value will be inherited and used instead."],["type","button"]],null,[[null,"click"]],(function(l,n,e){var t=!0;return"click"===n&&(t=!1!==l.component.reset(l.context.$implicit.name)&&t),t}),null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](22,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),t["ɵpod"](23,{active:0}),(l()(),t["ɵeld"](24,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](26,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵpad"](27,1),(l()(),t["ɵand"](16777216,null,null,1,null,y)),t["ɵdid"](29,16384,null,0,b.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,n.context.$implicit.type),l(n,14,0,e.configurationType.milliseconds),l(n,16,0,e.configurationType.bps),l(n,18,0,e.configurationType.iops);var i=l(n,23,0,e.isDisabled(n.context.$implicit.name));l(n,22,0,"btn btn-light",i);var u=l(n,27,0,e.icons.erase);l(n,26,0,u),l(n,29,0,e.form.showError("configuration."+n.context.$implicit.name,t["ɵnov"](n.parent.parent,0),"min"))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess),l(n,4,0,n.context.$implicit.name),l(n,5,0,n.context.$implicit.displayName),l(n,8,0,n.context.$implicit.description),l(n,9,0,t["ɵinlineInterpolate"](1,"cd-col-form-input ",n.parent.context.$implicit.heading,""))}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,5,"h4",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵeld"](2,0,null,null,4,"span",[["class","collapsible"]],null,[[null,"click"]],(function(l,n,e){var t=!0;return"click"===n&&(t=!1!==l.component.toggleSectionVisibility(l.context.$implicit.class)&&t),t}),null,null)),(l()(),t["ɵted"](3,null,[" "," "])),(l()(),t["ɵeld"](4,0,null,null,2,"i",[["aria-hidden","true"]],null,null,null,null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](6,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),(l()(),t["ɵeld"](7,0,null,null,2,"div",[],[[8,"className",0],[8,"hidden",0]],null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,w)),t["ɵdid"](9,278528,null,0,b.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,6,0,e.sectionVisibility[n.context.$implicit.class]?e.icons.minusCircle:e.icons.addCircle),l(n,9,0,n.context.$implicit.options)}),(function(l,n){var e=n.component;l(n,3,0,n.context.$implicit.heading),l(n,7,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.class,""),!e.sectionVisibility[n.context.$implicit.class])}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,[["cfgFormGroup",1]],null,8,"fieldset",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,1).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,1).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,4).onSubmit()&&i),i}),null,null)),t["ɵdid"](1,540672,null,0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](3,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](4,16384,null,0,d.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](5,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["RBD Configuration"])),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](8,278528,null,0,b.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.form.get("configuration")),l(n,4,0,e.form.get("configuration")),l(n,8,0,e.rbdConfigurationService.sections)}),(function(l,n){l(n,0,0,t["ɵnov"](n,3).ngClassUntouched,t["ɵnov"](n,3).ngClassTouched,t["ɵnov"](n,3).ngClassPristine,t["ɵnov"](n,3).ngClassDirty,t["ɵnov"](n,3).ngClassValid,t["ɵnov"](n,3).ngClassInvalid,t["ɵnov"](n,3).ngClassPending)}))}},E7j4:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("EEJc"),d=e("ajRT"),c=e("mXUL"),m=e("IZUe"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("+26A"),S=e("LqlI"),_=e("XED3"),R=e("kn/O");e.d(n,"a",(function(){return D}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.key),l(n,2,0,n.context.$implicit.key)}),(function(l,n){l(n,3,0,n.context.$implicit.desc)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,7,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,3).onChange(e.target.checked)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,3).onTouched()&&i),i}),null,null)),t["ɵdid"](2,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](3,16384,null,0,i.c,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.c]),t["ɵdid"](5,671744,[[5,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](7,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](9,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](10,null,["",""]))],(function(l,n){l(n,5,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,8,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""))}),(function(l,n){l(n,1,1,[t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵnov"](n,7).ngClassUntouched,t["ɵnov"](n,7).ngClassTouched,t["ɵnov"](n,7).ngClassPristine,t["ɵnov"](n,7).ngClassDirty,t["ɵnov"](n,7).ngClassValid,t["ɵnov"](n,7).ngClassInvalid,t["ɵnov"](n,7).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass]),l(n,9,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,10,0,n.context.$implicit.name)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["At least one pool is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The token is invalid."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,89,"cd-modal",[],null,null,null,r.c,r.b)),t["ɵdid"](1,49152,null,0,d.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Import Bootstrap Token"])),(l()(),t["ɵeld"](4,0,null,1,85,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,84,"form",[["class","form"],["name","importBootstrapForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,i.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](9,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,71,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To import a bootstrap token which was created by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, provide the generated token, and click "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Import"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](19,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,27).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,27)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](25,4210688,null,0,m.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](29,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](31,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](32,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,w)),t["ɵdid"](34,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](36,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](39,0,null,0,2,"label",[["class","col-form-label"],["for","direction"]],null,null,null,null,null)),(l()(),t["ɵeld"](40,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Direction"])),(l()(),t["ɵeld"](42,0,null,0,9,"select",[["class","form-control custom-select"],["formControlName","direction"],["id","direction"],["name","direction"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,44).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,44).onTouched()&&i),i}),null,null)),t["ɵdid"](43,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](44,16384,null,0,i.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),t["ɵdid"](46,671744,[[3,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](48,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](49,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](51,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](52,0,null,null,12,"div",[["class","form-group"],["formGroupName","pools"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](53,212992,null,0,i.m,[[3,i.d],[8,null],[8,null]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.d,null,[i.m]),t["ɵdid"](55,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](56,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](59,0,null,0,1,"label",[["class","col-form-label required"],["for","pools"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵand"](16777216,null,0,1,null,I)),t["ɵdid"](62,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,E)),t["ɵdid"](64,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](65,0,null,null,17,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](66,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](69,0,null,0,1,"label",[["class","col-form-label required"],["for","token"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Token"])),(l()(),t["ɵeld"](71,0,null,0,7,"textarea",[["class","form-control resize-vertical"],["formControlName","token"],["id","token"],["placeholder","Generated token..."]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,72)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,72).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,72)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,72)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](72,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](74,671744,[[7,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](76,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](77,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵted"](-1,null,[" "])),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](80,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](82,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](83,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](84,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](85,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.import()&&t),t}),h.b,h.a)),t["ɵdid"](86,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Import"])),(l()(),t["ɵeld"](88,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,f.b,f.a)),t["ɵdid"](89,49152,null,0,v.a,[p.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.importBootstrapForm),l(n,10,0,e.importBootstrapForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,34,0,e.importBootstrapForm.showError("siteName",t["ɵnov"](n,7),"required")),l(n,36,0),l(n,46,0,"direction"),l(n,49,0,"direction"),l(n,51,0,e.directions),l(n,53,0,"pools"),l(n,56,0),l(n,62,0,e.pools),l(n,64,0,e.importBootstrapForm.showError("pools",t["ɵnov"](n,7),"requirePool")),l(n,66,0),l(n,74,0,"token"),l(n,77,0,"token"),l(n,80,0,e.importBootstrapForm.showError("token",t["ɵnov"](n,7),"required")),l(n,82,0,e.importBootstrapForm.showError("token",t["ɵnov"](n,7),"invalidToken")),l(n,86,0,e.importBootstrapForm),l(n,89,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass),l(n,35,0,t["ɵnov"](n,36).hasErrors,t["ɵnov"](n,36).hasSuccess),l(n,42,0,t["ɵnov"](n,48).ngClassUntouched,t["ɵnov"](n,48).ngClassTouched,t["ɵnov"](n,48).ngClassPristine,t["ɵnov"](n,48).ngClassDirty,t["ɵnov"](n,48).ngClassValid,t["ɵnov"](n,48).ngClassInvalid,t["ɵnov"](n,48).ngClassPending,t["ɵnov"](n,49).validClass,t["ɵnov"](n,49).invalidClass),l(n,52,0,t["ɵnov"](n,55).ngClassUntouched,t["ɵnov"](n,55).ngClassTouched,t["ɵnov"](n,55).ngClassPristine,t["ɵnov"](n,55).ngClassDirty,t["ɵnov"](n,55).ngClassValid,t["ɵnov"](n,55).ngClassInvalid,t["ɵnov"](n,55).ngClassPending,t["ɵnov"](n,56).hasErrors,t["ɵnov"](n,56).hasSuccess),l(n,65,0,t["ɵnov"](n,66).hasErrors,t["ɵnov"](n,66).hasSuccess),l(n,71,0,t["ɵnov"](n,76).ngClassUntouched,t["ɵnov"](n,76).ngClassTouched,t["ɵnov"](n,76).ngClassPristine,t["ɵnov"](n,76).ngClassDirty,t["ɵnov"](n,76).ngClassValid,t["ɵnov"](n,76).ngClassInvalid,t["ɵnov"](n,76).ngClassPending,t["ɵnov"](n,77).validClass,t["ɵnov"](n,77).invalidClass)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-bootstrap-import-modal",[],null,null,null,V,y)),t["ɵdid"](1,245760,null,0,C.a,[S.a,_.a,R.a],null,null)],(function(l,n){l(n,1,0)}),null)}var D=t["ɵccf"]("cd-bootstrap-import-modal",C.a,T,{},{},[])},EFGL:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("SVse"),u=e("IzCI"),s=e("aXbf"),a=e("dEH0"),o=e("BQkM"),r=e("25BL"),d=e("uIqm");e("aAWM"),e("o8EM"),e("GiVz"),e.d(n,"a",(function(){return c})),e.d(n,"b",(function(){return _}));var c=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function m(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Global"]))],null,null)}function p(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Image"]))],null,null)}function h(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"]))],null,null)}function g(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"div",[],null,null,null,null,null)),t["ɵdid"](1,16384,null,0,i.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,m)),t["ɵdid"](3,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,p)),t["ɵdid"](5,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,h)),t["ɵdid"](7,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null)],(function(l,n){l(n,1,0,n.context.value),l(n,3,0,"global"),l(n,5,0,"image"),l(n,7,0,"pool")}),null)}function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,0),n.parent.context.value));l(n,1,0,e)}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,1),n.parent.context.value));l(n,1,0,e)}))}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),n.parent.context.value));l(n,1,0,e)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,"div",[],null,null,null,null,null)),t["ɵdid"](1,16384,null,0,i.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,f)),t["ɵdid"](3,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,v)),t["ɵdid"](5,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,b)),t["ɵdid"](7,278528,null,0,i.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,C)),t["ɵdid"](9,16384,null,0,i.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,i.NgSwitch],null,null)],(function(l,n){var e=n.component;l(n,1,0,n.context.row.type),l(n,3,0,e.typeField.bps),l(n,5,0,e.typeField.milliseconds),l(n,7,0,e.typeField.iops)}),null)}function _(l){return t["ɵvid"](0,[t["ɵpid"](0,u.a,[s.a]),t["ɵpid"](0,a.a,[]),t["ɵpid"](0,o.a,[]),t["ɵqud"](402653184,1,{configurationSourceTpl:0}),t["ɵqud"](402653184,2,{configurationValueTpl:0}),t["ɵqud"](402653184,3,{poolConfTable:0}),(l()(),t["ɵeld"](6,0,null,null,1,"cd-table",[["identifier","name"]],null,null,null,r.b,r.a)),t["ɵdid"](7,2867200,[[3,4],["poolConfTable",4]],0,d.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],identifier:[2,"identifier"]},null),(l()(),t["ɵand"](0,[[1,2],["configurationSourceTpl",2]],null,0,null,g)),(l()(),t["ɵand"](0,[[2,2],["configurationValueTpl",2]],null,0,null,S))],(function(l,n){var e=n.component;l(n,7,0,e.data,e.poolConfigurationColumns,"name")}),null)}},Ekvf:function(l,n,e){"use strict";e.d(n,"a",(function(){return d}));var t=e("mrSG"),i=e("IheW"),u=e("lJxs"),s=e("xTzq"),a=e("o8EM"),o=e("8Y7J"),r=e("pL04");let d=(()=>{let l=class{constructor(l,n){this.http=l,this.rbdConfigurationService=n,this.apiPath="api/pool"}create(l){return this.http.post(this.apiPath,l,{observe:"response"})}update(l){let n;return l.hasOwnProperty("srcpool")?(n=l.srcpool,delete l.srcpool):(n=l.pool,delete l.pool),this.http.put(`${this.apiPath}/${encodeURIComponent(n)}`,l,{observe:"response"})}delete(l){return this.http.delete(`${this.apiPath}/${l}`,{observe:"response"})}get(l){return this.http.get(`${this.apiPath}/${l}`)}getList(){return this.http.get(this.apiPath+"?stats=true")}getConfiguration(l){return this.http.get(`${this.apiPath}/${l}/configuration`).pipe(Object(u.a)(l=>l.map(l=>Object.assign(l,this.rbdConfigurationService.getOptionByName(l.name)))))}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}list(l=[]){const n=l.join(",");return this.http.get(`${this.apiPath}?attrs=${n}`).toPromise().then(l=>l)}};return l.ngInjectableDef=o["ɵɵdefineInjectable"]({factory:function(){return new l(o["ɵɵinject"](i.c),o["ɵɵinject"](a.a))},token:l,providedIn:r.a}),l=t.__decorate([s.a,t.__metadata("design:paramtypes",[i.c,a.a])],l),l})()},F83c:function(l,n,e){"use strict";e.d(n,"a",(function(){return m}));var t=e("mrSG"),i=e("IheW"),u=e("LvDl"),s=e("lJxs"),a=e("xTzq"),o=e("jVDg"),r=e("o8EM"),d=e("8Y7J"),c=e("pL04");let m=(()=>{let l=class{constructor(l,n){this.http=l,this.rbdConfigurationService=n}isRBDPool(l){return-1!==u.indexOf(l.application_metadata,"rbd")&&!l.pool_name.includes("/")}create(l){return this.http.post("api/block/image",l,{observe:"response"})}delete(l){return this.http.delete("api/block/image/"+l.toStringEncoded(),{observe:"response"})}update(l,n){return this.http.put("api/block/image/"+l.toStringEncoded(),n,{observe:"response"})}get(l){return this.http.get("api/block/image/"+l.toStringEncoded())}list(){return this.http.get("api/block/image").pipe(Object(s.a)(l=>l.map(l=>(l.value.map(l=>l.configuration?(l.configuration.map(l=>Object.assign(l,this.rbdConfigurationService.getOptionByName(l.name))),l):l),l))))}copy(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/copy`,n,{observe:"response"})}flatten(l){return this.http.post(`api/block/image/${l.toStringEncoded()}/flatten`,null,{observe:"response"})}defaultFeatures(){return this.http.get("api/block/image/default_features")}createSnapshot(l,n){const e={snapshot_name:n};return this.http.post(`api/block/image/${l.toStringEncoded()}/snap`,e,{observe:"response"})}renameSnapshot(l,n,e){const t={new_snap_name:e};return this.http.put(`api/block/image/${l.toStringEncoded()}/snap/${n}`,t,{observe:"response"})}protectSnapshot(l,n,e){const t={is_protected:e};return this.http.put(`api/block/image/${l.toStringEncoded()}/snap/${n}`,t,{observe:"response"})}rollbackSnapshot(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/snap/${n}/rollback`,null,{observe:"response"})}cloneSnapshot(l,n,e){return this.http.post(`api/block/image/${l.toStringEncoded()}/snap/${n}/clone`,e,{observe:"response"})}deleteSnapshot(l,n){return this.http.delete(`api/block/image/${l.toStringEncoded()}/snap/${n}`,{observe:"response"})}listTrash(){return this.http.get("api/block/image/trash/")}createNamespace(l,n){return this.http.post(`api/block/pool/${l}/namespace`,{namespace:n},{observe:"response"})}listNamespaces(l){return this.http.get(`api/block/pool/${l}/namespace/`)}deleteNamespace(l,n){return this.http.delete(`api/block/pool/${l}/namespace/${n}`,{observe:"response"})}moveTrash(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/move_trash`,{delay:n},{observe:"response"})}purgeTrash(l){return this.http.post("api/block/image/trash/purge/?pool_name="+l,null,{observe:"response"})}restoreTrash(l,n){return this.http.post(`api/block/image/trash/${l.toStringEncoded()}/restore`,{new_image_name:n},{observe:"response"})}removeTrash(l,n=!1){return this.http.delete(`api/block/image/trash/${l.toStringEncoded()}/?force=${n}`,{observe:"response"})}};return l.ngInjectableDef=d["ɵɵdefineInjectable"]({factory:function(){return new l(d["ɵɵinject"](i.c),d["ɵɵinject"](r.a))},token:l,providedIn:c.a}),t.__decorate([t.__param(1,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String]),t.__metadata("design:returntype",void 0)],l.prototype,"createSnapshot",null),t.__decorate([t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String,String]),t.__metadata("design:returntype",void 0)],l.prototype,"renameSnapshot",null),t.__decorate([t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String,Boolean]),t.__metadata("design:returntype",void 0)],l.prototype,"protectSnapshot",null),t.__decorate([t.__param(1,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String]),t.__metadata("design:returntype",void 0)],l.prototype,"restoreTrash",null),l=t.__decorate([a.a,t.__metadata("design:paramtypes",[i.c,r.a])],l),l})()},Fd71:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("s7LF"),i=e("XNiG"),u=(e("F83c"),e("sne2"),e("QFaf")),s=e("kvvV"),a=e("jVDg");e("9nlD"),e("VXsX");class o{constructor(l,n,e,t,i,u){this.modalRef=l,this.rbdService=n,this.taskManagerService=e,this.notificationService=t,this.i18n=i,this.actionLabels=u,this.editing=!1,this.action=this.actionLabels.CREATE,this.resource=this.i18n("RBD Snapshot"),this.createForm()}createForm(){this.snapshotForm=new u.a({snapshotName:new t.i("",{validators:[t.B.required]})})}ngOnInit(){this.onSubmit=new i.a}setSnapName(l){this.snapName=l,this.snapshotForm.get("snapshotName").setValue(l)}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.RENAME:this.actionLabels.CREATE}editAction(){const l=this.snapshotForm.getValue("snapshotName"),n=new a.a(this.poolName,this.namespace,this.imageName),e=new s.a;e.name="rbd/snap/edit",e.metadata={image_spec:n.toString(),snapshot_name:l},this.rbdService.renameSnapshot(n,this.snapName,l).toPromise().then(()=>{this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)}),this.modalRef.hide(),this.onSubmit.next(this.snapName)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}createAction(){const l=this.snapshotForm.getValue("snapshotName"),n=new a.a(this.poolName,this.namespace,this.imageName),e=new s.a;e.name="rbd/snap/create",e.metadata={image_spec:n.toString(),snapshot_name:l},this.rbdService.createSnapshot(n,l).toPromise().then(()=>{this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)}),this.modalRef.hide(),this.onSubmit.next(l)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}submit(){this.editing?this.editAction():this.createAction()}}},I4Qz:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("EEJc"),u=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("SVse"),r=e("mXUL"),d=e("ienR"),c=e("z/SZ"),m=e("ANnk"),p=e("f/UV"),h=e("aexS"),g=e("gp3X"),f=e("sb0X"),v=e("KVJa"),b=e("Z21x"),C=e("sne2"),S=e("2JDI"),_=e("F83c"),R=e("LqlI"),y=e("2EZI"),w=e("kn/O");e.d(n,"a",(function(){return T}));var k=t["ɵcrt"]({encapsulation:0,styles:[[".bs-datepicker-head bs-datepicker-navigation-view{display:flex;justify-content:space-between}"]],data:{}});function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"div",[["class","alert alert-warning"],["role","alert"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This image contains snapshot(s), which will prevent it from being removed after moved to trash."]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,['Wrong date format. Please use "YYYY-MM-DD HH:mm:ss".']))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Protection has already expired. Please pick a future date or leave it empty."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,49,"cd-modal",[],null,null,null,i.c,i.b)),t["ɵdid"](1,49152,null,0,u.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Move an image to trash"])),(l()(),t["ɵeld"](4,0,null,1,45,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,44,"form",[["class","form"],["name","moveForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,31,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](13,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](14,0,null,null,7,"p",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To move "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](17,null,["",""])),(l()(),t["ɵted"](-1,null,[" to trash, click "])),(l()(),t["ɵeld"](19,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Move Image"])),(l()(),t["ɵted"](-1,null,[". Optionally, you can pick an expiration date."])),(l()(),t["ɵeld"](22,0,null,null,20,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](23,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](26,0,null,0,1,"label",[["class","col-form-label"],["for","expires"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Protection expires at"])),(l()(),t["ɵeld"](28,16777216,null,0,10,"input",[["bsDatepicker",""],["class","form-control"],["formControlName","expiresAt"],["placeholder","NOT PROTECTED"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"],[null,"keyup.esc"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,29)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,29).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,29)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,29)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==t["ɵnov"](l,31).onChange(e)&&i),"keyup.esc"===n&&(i=!1!==t["ɵnov"](l,31).hide()&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,31).onBlur()&&i),i}),null,null)),t["ɵdid"](29,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵdid"](30,737280,null,0,d.c,[d.a,t.ElementRef,t.Renderer2,t.ViewContainerRef,c.a],{bsConfig:[0,"bsConfig"],minDate:[1,"minDate"]},null),t["ɵdid"](31,16384,null,0,d.f,[d.c,d.l,t.Renderer2,t.ElementRef,t.ChangeDetectorRef],null,null),t["ɵprd"](1024,null,s.o,(function(l){return[l]}),[d.f]),t["ɵprd"](1024,null,s.p,(function(l,n){return[l,n]}),[s.e,d.f]),t["ɵdid"](34,671744,[[1,4]],0,s.j,[[3,s.d],[6,s.o],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](36,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](37,4210688,null,0,m.a,[[2,p.a],h.a,t.ElementRef],null,null),t["ɵdid"](38,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,E)),t["ɵdid"](40,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](42,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](43,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](45,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.moveImage()&&t),t}),g.b,g.a)),t["ɵdid"](46,114688,null,0,f.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Move Image"])),(l()(),t["ɵeld"](48,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,v.b,v.a)),t["ɵdid"](49,49152,null,0,b.a,[o.Location,C.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.moveForm),l(n,10,0,e.moveForm),l(n,13,0,e.hasSnapshots),l(n,23,0),l(n,30,0,e.bsConfig,e.minDate),l(n,34,0,"expiresAt"),l(n,38,0,"expiresAt"),l(n,40,0,e.moveForm.showError("expiresAt",t["ɵnov"](n,7),"format")),l(n,42,0,e.moveForm.showError("expiresAt",t["ɵnov"](n,7),"expired")),l(n,46,0,e.moveForm),l(n,49,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,17,0,e.imageSpecStr),l(n,22,0,t["ɵnov"](n,23).hasErrors,t["ɵnov"](n,23).hasSuccess),l(n,28,0,t["ɵnov"](n,36).ngClassUntouched,t["ɵnov"](n,36).ngClassTouched,t["ɵnov"](n,36).ngClassPristine,t["ɵnov"](n,36).ngClassDirty,t["ɵnov"](n,36).ngClassValid,t["ɵnov"](n,36).ngClassInvalid,t["ɵnov"](n,36).ngClassPending,t["ɵnov"](n,38).validClass,t["ɵnov"](n,38).invalidClass)}))}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-move-modal",[],null,null,null,F,k)),t["ɵdid"](1,114688,null,0,S.a,[_.a,R.a,y.a,w.a],null,null)],(function(l,n){l(n,1,0)}),null)}var T=t["ɵccf"]("cd-rbd-trash-move-modal",S.a,V,{},{},[])},JBea:function(l,n,e){"use strict";e.d(n,"a",(function(){return t})),e("lArG");class t{constructor(){}ngOnChanges(){this.selection&&(this.rbdDashboardUrl=`rbd-details?var-Pool=${this.selection.pool_name}&var-Image=${this.selection.name}`)}}},"JIi+":function(l,n,e){"use strict";var t=e("8Y7J"),i=e("978R"),u=e("z/SZ"),s=e("2uy1"),a=e("SVse"),o=e("pKUh"),r=e("2ZVE"),d=e("25BL"),c=e("uIqm"),m=e("NUGo"),p=e("S7zO"),h=e("VTlA"),g=e("ufoC"),f=e("mSOc"),v=e("wd/R"),b=e("LRne"),C=e("F83c"),S=e("OLbh"),_=e("0+/T"),R=e("sne2"),y=e("x38r"),w=e("vCyI"),k=e("QTAa"),I=e("kvvV"),E=e("jVDg"),N=e("a0VL"),F=e("Fgil"),V=e("aexS"),T=e("9nlD"),D=e("VXsX"),P=e("Fd71"),x=e("LvDl"),q=e("oxzT");class B{constructor(l,n,e){this.i18n=l,this.create={permission:"create",icon:q.a.add,name:n.CREATE},this.rename={permission:"update",icon:q.a.edit,name:n.RENAME},this.protect={permission:"update",icon:q.a.lock,visible:l=>l.hasSingleSelection&&!l.first().is_protected,name:n.PROTECT},this.unprotect={permission:"update",icon:q.a.unlock,visible:l=>l.hasSingleSelection&&l.first().is_protected,name:n.UNPROTECT},this.clone={permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>this.getCloneDisableDesc(l,e),icon:q.a.clone,name:n.CLONE},this.copy={permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>!l.hasSingleSelection||l.first().cdExecuting,icon:q.a.copy,name:n.COPY},this.rollback={permission:"update",icon:q.a.undo,name:n.ROLLBACK},this.deleteSnap={permission:"delete",icon:q.a.destroy,disable:l=>{const n=l.first();return!l.hasSingleSelection||n.cdExecuting||n.is_protected},name:n.DELETE},this.ordering=[this.create,this.rename,this.protect,this.unprotect,this.clone,this.copy,this.rollback,this.deleteSnap]}getCloneDisableDesc(l,n){return!(l&&l.hasSingleSelection&&!l.first().cdExecuting)||!x.includes(n,"layering")&&this.i18n("Parent image must support Layering")}}class O{}class A{constructor(l,n,e,t,i,u,s,a,o,r,d){this.authStorageService=l,this.modalService=n,this.dimlessBinaryPipe=e,this.cdDatePipe=t,this.rbdService=i,this.taskManagerService=u,this.notificationService=s,this.summaryService=a,this.taskListService=o,this.i18n=r,this.actionLabels=d,this.snapshots=[],this.selection=new w.a,this.builders={"rbd/snap/create":l=>{const n=new O;return n.name=l.snapshot_name,n}},this.permission=this.authStorageService.getPermissions().rbdImage}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"name",cellTransformation:y.a.executing,flexGrow:2},{name:this.i18n("Size"),prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Provisioned"),prop:"disk_usage",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("State"),prop:"is_protected",flexGrow:1,cellTransformation:y.a.badge,customTemplateConfig:{map:{true:{value:this.i18n("PROTECTED"),class:"badge-success"},false:{value:this.i18n("UNPROTECTED"),class:"badge-info"}}}},{name:this.i18n("Created"),prop:"timestamp",flexGrow:1,pipe:this.cdDatePipe}]}ngOnChanges(){const l=new E.a(this.poolName,this.namespace,this.rbdName),n=new B(this.i18n,this.actionLabels,this.featuresName);n.create.click=()=>this.openCreateSnapshotModal(),n.rename.click=()=>this.openEditSnapshotModal(),n.protect.click=()=>this.toggleProtection(),n.unprotect.click=()=>this.toggleProtection();const e=()=>this.selection.first()&&`${l.toStringEncoded()}/${encodeURIComponent(this.selection.first().name)}`;n.clone.routerLink=()=>"/block/rbd/clone/"+e(),n.copy.routerLink=()=>"/block/rbd/copy/"+e(),n.rollback.click=()=>this.rollbackModal(),n.deleteSnap.click=()=>this.deleteSnapshotModal(),this.tableActions=n.ordering,this.taskListService.init(()=>Object(b.a)(this.snapshots),null,l=>this.data=l,()=>this.data=this.snapshots,n=>["rbd/snap/create","rbd/snap/delete","rbd/snap/edit","rbd/snap/rollback"].includes(n.name)&&l.toString()===n.metadata.image_spec,(l,n)=>l.name===n.metadata.snapshot_name,this.builders)}openSnapshotModal(l,n=null){this.modalRef=this.modalService.show(P.a),this.modalRef.content.poolName=this.poolName,this.modalRef.content.imageName=this.rbdName,this.modalRef.content.namespace=this.namespace,n?this.modalRef.content.setEditing():n=`${this.rbdName}_${v().toISOString(!0)}`,this.modalRef.content.setSnapName(n),this.modalRef.content.onSubmit.subscribe(n=>{const e=new k.a;e.name=l,e.metadata={image_name:this.rbdName,pool_name:this.poolName,snapshot_name:n},this.summaryService.addRunningTask(e),this.ngOnChanges()})}openCreateSnapshotModal(){this.openSnapshotModal("rbd/snap/create")}openEditSnapshotModal(){this.openSnapshotModal("rbd/snap/edit",this.selection.first().name)}toggleProtection(){const l=this.selection.first().name,n=this.selection.first().is_protected,e=new I.a;e.name="rbd/snap/edit";const t=new E.a(this.poolName,this.namespace,this.rbdName);e.metadata={image_spec:t.toString(),snapshot_name:l},this.rbdService.protectSnapshot(t,l,!n).toPromise().then(()=>{const l=new k.a;l.name=e.name,l.metadata=e.metadata,this.summaryService.addRunningTask(l),this.ngOnChanges(),this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)})})}_asyncTask(l,n,e){const t=new I.a;t.name=n,t.metadata={image_spec:new E.a(this.poolName,this.namespace,this.rbdName).toString(),snapshot_name:e};const i=new E.a(this.poolName,this.namespace,this.rbdName);this.rbdService[l](i,e).toPromise().then(()=>{const l=new k.a;l.name=t.name,l.metadata=t.metadata,this.summaryService.addRunningTask(l),this.modalRef.hide(),this.ngOnChanges(),this.taskManagerService.subscribe(l.name,l.metadata,l=>{this.notificationService.notifyTask(l)})}).catch(()=>{this.modalRef.content.stopLoadingSpinner()})}rollbackModal(){const l=this.selection.selected[0].name,n=new E.a(this.poolName,this.namespace,this.rbdName).toString(),e={titleText:this.i18n("RBD snapshot rollback"),buttonText:this.i18n("Rollback"),bodyTpl:this.rollbackTpl,bodyData:{snapName:`${n}@${l}`},onSubmit:()=>{this._asyncTask("rollbackSnapshot","rbd/snap/rollback",l)}};this.modalRef=this.modalService.show(S.a,{initialState:e})}deleteSnapshotModal(){const l=this.selection.selected[0].name;this.modalRef=this.modalService.show(_.a,{initialState:{itemDescription:this.i18n("RBD snapshot"),itemNames:[l],submitAction:()=>this._asyncTask("deleteSnapshot","rbd/snap/delete",l)}})}updateSelection(l){this.selection=l}}var M=e("LqlI"),L=e("GiVz"),j=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function U(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["You are about to rollback"])),(l()(),t["ɵeld"](2,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](3,null,[" ",""])),(l()(),t["ɵted"](-1,null,[".\n"]))],null,(function(l,n){l(n,3,0,n.context.$implicit.snapName)}))}function G(l){return t["ɵvid"](0,[t["ɵqud"](671088640,1,{nameTpl:0}),t["ɵqud"](402653184,2,{rollbackTpl:0}),(l()(),t["ɵeld"](2,0,null,null,3,"cd-table",[["columnMode","flex"],["selectionType","single"]],null,[[null,"updateSelection"]],(function(l,n,e){var t=!0;return"updateSelection"===n&&(t=!1!==l.component.updateSelection(e)&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],selectionType:[3,"selectionType"]},{updateSelection:"updateSelection"}),(l()(),t["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,m.b,m.a)),t["ɵdid"](5,114688,null,0,p.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵand"](0,[[2,2],["rollbackTpl",2]],null,0,null,U))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex","single"),l(n,5,0,e.permission,e.selection,e.tableActions)}),null)}var $=e("EFGL"),z=e("aAWM"),X=e("aXbf"),W=e("o8EM"),J=e("a278"),Y=e("insk"),K=e("cUpR"),Z=e("20UP"),H=e("nSDx"),Q=e("o4+5"),ll=e("JBea");e.d(n,"b",(function(){return nl})),e.d(n,"c",(function(){return gl})),e.d(n,"a",(function(){return vl}));var nl=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function el(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Only available for RBD images with "])),(l()(),t["ɵeld"](2,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["fast-diff"])),(l()(),t["ɵted"](-1,null,[" enabled"]))],null,null)}function tl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[["class","badge badge-dark mr-2"]],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""]))],null,(function(l,n){l(n,2,0,n.context.$implicit)}))}function il(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"span",[["class","form-text text-muted"],["placement","right"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,i.c,[t.ViewContainerRef,u.a,i.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"],placement:[1,"placement"]},null),(l()(),t["ɵted"](-1,null,["N/A"]))],(function(l,n){l(n,2,0,t["ɵnov"](n.parent.parent,5),"right")}),null)}function ul(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,[" "," "])),t["ɵppd"](2,1)],null,(function(l,n){var e=n.component,i=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),e.selection.disk_usage));l(n,1,0,i)}))}function sl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"span",[["class","form-text text-muted"],["placement","right"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,i.c,[t.ViewContainerRef,u.a,i.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"],placement:[1,"placement"]},null),(l()(),t["ɵted"](-1,null,["N/A"]))],(function(l,n){l(n,2,0,t["ɵnov"](n.parent.parent,5),"right")}),null)}function al(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,[" "," "])),t["ɵppd"](2,1)],null,(function(l,n){var e=n.component,i=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),e.selection.total_disk_usage));l(n,1,0,i)}))}function ol(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["/",""]))],null,(function(l,n){l(n,1,0,n.component.selection.parent.pool_namespace)}))}function rl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),(l()(),t["ɵand"](16777216,null,null,1,null,ol)),t["ɵdid"](3,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵted"](4,null,["/","@",""]))],(function(l,n){l(n,3,0,n.component.selection.parent.pool_namespace)}),(function(l,n){var e=n.component;l(n,1,0,e.selection.parent.pool_name),l(n,4,0,e.selection.parent.image_name,e.selection.parent.snap_name)}))}function dl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["-"]))],null,null)}function cl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,114,"tabset",[],[[2,"tab-container",null]],null,null,o.b,o.a)),t["ɵdid"](1,180224,null,0,r.e,[r.f,t.Renderer2,t.ElementRef],null,null),(l()(),t["ɵeld"](2,0,null,0,99,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](3,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](4,0,null,null,97,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,96,"tbody",[],null,null,null,null,null)),(l()(),t["ɵeld"](6,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](7,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](9,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),t["ɵted"](10,null,["",""])),(l()(),t["ɵeld"](11,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"])),(l()(),t["ɵeld"](14,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](15,null,["",""])),(l()(),t["ɵeld"](16,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Data Pool"])),(l()(),t["ɵeld"](19,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](20,null,["",""])),t["ɵppd"](21,1),(l()(),t["ɵeld"](22,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Created"])),(l()(),t["ɵeld"](25,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](26,null,["",""])),t["ɵppd"](27,1),(l()(),t["ɵeld"](28,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](29,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Size"])),(l()(),t["ɵeld"](31,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](32,null,["",""])),t["ɵppd"](33,1),(l()(),t["ɵeld"](34,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Objects"])),(l()(),t["ɵeld"](37,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](38,null,["",""])),t["ɵppd"](39,1),(l()(),t["ɵeld"](40,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](41,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Object size"])),(l()(),t["ɵeld"](43,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](44,null,["",""])),t["ɵppd"](45,1),(l()(),t["ɵeld"](46,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](47,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Features"])),(l()(),t["ɵeld"](49,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,tl)),t["ɵdid"](51,278528,null,0,a.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](52,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](53,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Provisioned"])),(l()(),t["ɵeld"](55,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,il)),t["ɵdid"](57,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,ul)),t["ɵdid"](59,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](60,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](61,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Total provisioned"])),(l()(),t["ɵeld"](63,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,sl)),t["ɵdid"](65,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,al)),t["ɵdid"](67,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](68,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](69,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Striping unit"])),(l()(),t["ɵeld"](71,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](72,null,["",""])),t["ɵppd"](73,1),(l()(),t["ɵeld"](74,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](75,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Striping count"])),(l()(),t["ɵeld"](77,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](78,null,["",""])),(l()(),t["ɵeld"](79,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](80,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Parent"])),(l()(),t["ɵeld"](82,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,rl)),t["ɵdid"](84,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,dl)),t["ɵdid"](86,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](87,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](88,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Block name prefix"])),(l()(),t["ɵeld"](90,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](91,null,["",""])),(l()(),t["ɵeld"](92,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](93,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Order"])),(l()(),t["ɵeld"](95,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](96,null,["",""])),(l()(),t["ɵeld"](97,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](98,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Format Version"])),(l()(),t["ɵeld"](100,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](101,null,["",""])),(l()(),t["ɵeld"](102,0,null,0,4,"tab",[["heading","Snapshots"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](103,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](104,0,null,null,2,"cd-rbd-snapshot-list",[],null,null,null,G,j)),t["ɵprd"](131584,null,h.a,h.a,[g.a,f.a]),t["ɵdid"](106,638976,null,0,A,[V.a,M.b,F.a,N.a,C.a,D.a,T.a,f.a,h.a,L.a,R.b],{snapshots:[0,"snapshots"],featuresName:[1,"featuresName"],poolName:[2,"poolName"],namespace:[3,"namespace"],rbdName:[4,"rbdName"]},null),(l()(),t["ɵeld"](107,0,null,0,3,"tab",[["heading","Configuration"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](108,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](109,0,null,null,1,"cd-rbd-configuration-table",[],null,null,null,$.b,$.a)),t["ɵdid"](110,638976,null,0,z.a,[X.a,W.a,L.a],{data:[0,"data"]},null),(l()(),t["ɵeld"](111,0,null,0,3,"tab",[["heading","Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](112,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](113,0,null,null,1,"cd-grafana",[["grafanaStyle","one"],["uid","YhCYGcuZz"]],null,null,null,J.b,J.a)),t["ɵdid"](114,638976,null,0,Y.a,[K.b,Z.a,L.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var e=n.component;l(n,3,0,"Details"),l(n,51,0,e.selection.features_name),l(n,57,0,-1===(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,59,0,-1!==(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,65,0,-1===(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,67,0,-1!==(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,84,0,e.selection.parent),l(n,86,0,!e.selection.parent),l(n,103,0,"Snapshots"),l(n,106,0,e.selection.snapshots,e.selection.features_name,e.selection.pool_name,e.selection.namespace,e.selection.name),l(n,108,0,"Configuration"),l(n,110,0,e.selection.configuration),l(n,112,0,"Performance"),l(n,114,0,e.rbdDashboardUrl,"one","YhCYGcuZz")}),(function(l,n){var e=n.component;l(n,0,0,t["ɵnov"](n,1).clazz),l(n,2,0,t["ɵnov"](n,3).id,t["ɵnov"](n,3).active,t["ɵnov"](n,3).addClass,t["ɵnov"](n,3).role,t["ɵnov"](n,3).ariaLabelledby),l(n,10,0,e.selection.name),l(n,15,0,e.selection.pool_name);var i=t["ɵunv"](n,20,0,l(n,21,0,t["ɵnov"](n.parent,0),e.selection.data_pool));l(n,20,0,i);var u=t["ɵunv"](n,26,0,l(n,27,0,t["ɵnov"](n.parent,1),e.selection.timestamp));l(n,26,0,u);var s=t["ɵunv"](n,32,0,l(n,33,0,t["ɵnov"](n.parent,2),e.selection.size));l(n,32,0,s);var a=t["ɵunv"](n,38,0,l(n,39,0,t["ɵnov"](n.parent,3),e.selection.num_objs));l(n,38,0,a);var o=t["ɵunv"](n,44,0,l(n,45,0,t["ɵnov"](n.parent,2),e.selection.obj_size));l(n,44,0,o);var r=t["ɵunv"](n,72,0,l(n,73,0,t["ɵnov"](n.parent,2),e.selection.stripe_unit));l(n,72,0,r),l(n,78,0,e.selection.stripe_count),l(n,91,0,e.selection.block_name_prefix),l(n,96,0,e.selection.order),l(n,101,0,e.selection.image_format),l(n,102,0,t["ɵnov"](n,103).id,t["ɵnov"](n,103).active,t["ɵnov"](n,103).addClass,t["ɵnov"](n,103).role,t["ɵnov"](n,103).ariaLabelledby),l(n,107,0,t["ɵnov"](n,108).id,t["ɵnov"](n,108).active,t["ɵnov"](n,108).addClass,t["ɵnov"](n,108).role,t["ɵnov"](n,108).ariaLabelledby),l(n,111,0,t["ɵnov"](n,112).id,t["ɵnov"](n,112).active,t["ɵnov"](n,112).addClass,t["ɵnov"](n,112).role,t["ɵnov"](n,112).ariaLabelledby)}))}function ml(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"strong",[["tooltip","This setting overrides the global value"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,i.c,[t.ViewContainerRef,u.a,i.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"]},null),(l()(),t["ɵted"](-1,null,["Image"])),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,2,0,"This setting overrides the global value")}),null)}function pl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,16777216,null,null,2,"span",[["tooltip","This is the global value. No value for this option has been set for this image."]],null,null,null,null,null)),t["ɵdid"](1,212992,null,0,i.c,[t.ViewContainerRef,u.a,i.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"]},null),(l()(),t["ɵted"](-1,null,["Global"])),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,"This is the global value. No value for this option has been set for this image.")}),null)}function hl(l){return t["ɵvid"](0,[(l()(),t["ɵand"](16777216,null,null,1,null,ml)),t["ɵdid"](1,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),t["ɵand"](0,[["global",2]],null,0,null,pl))],(function(l,n){l(n,1,0,n.context.value-0,t["ɵnov"](n,2))}),null)}function gl(l){return t["ɵvid"](0,[t["ɵpid"](0,H.a,[]),t["ɵpid"](0,N.a,[a.DatePipe]),t["ɵpid"](0,F.a,[X.a]),t["ɵpid"](0,Q.a,[X.a]),t["ɵqud"](402653184,1,{poolConfigurationSourceTpl:0}),(l()(),t["ɵand"](0,[["usageNotAvailableTooltipTpl",2]],null,0,null,el)),(l()(),t["ɵand"](16777216,null,null,1,null,cl)),t["ɵdid"](7,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["poolConfigurationSourceTpl",2]],null,0,null,hl))],(function(l,n){l(n,7,0,n.component.selection)}),null)}function fl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-details",[],null,null,null,gl,nl)),t["ɵdid"](1,573440,null,0,ll.a,[],null,null)],null,null)}var vl=t["ɵccf"]("cd-rbd-details",ll.a,fl,{selection:"selection",images:"images"},{},[])},L4us:function(l,n,e){"use strict";var t=e("s7LF"),i=(e("XED3"),e("QFaf")),u=e("kvvV");e("kn/O");class s{}e.d(n,"a",(function(){return a}));class a{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.bsConfig={containerClass:"theme-default"},this.createForm()}createForm(){this.editPeerForm=new i.a({clusterName:new t.i("",{validators:[t.B.required,this.validateClusterName]}),clientID:new t.i("",{validators:[t.B.required,this.validateClientID]}),monAddr:new t.i("",{validators:[this.validateMonAddr]}),key:new t.i("",{validators:[this.validateKey]})})}ngOnInit(){this.pattern=`${this.poolName}/${this.peerUUID}`,"edit"===this.mode&&this.rbdMirroringService.getPeer(this.poolName,this.peerUUID).subscribe(l=>{this.setResponse(l)})}validateClusterName(l){if(!l.value.match(/^[\w\-_]*$/))return{invalidClusterName:{value:l.value}}}validateClientID(l){if(!l.value.match(/^(?!client\.)[\w\-_.]*$/))return{invalidClientID:{value:l.value}}}validateMonAddr(l){if(!l.value.match(/^[,; ]*([\w.\-_\[\]]+(:[\d]+)?[,; ]*)*$/))return{invalidMonAddr:{value:l.value}}}validateKey(l){try{if(""===l.value||atob(l.value))return null}catch(n){}return{invalidKey:{value:l.value}}}setResponse(l){this.response=l,this.editPeerForm.get("clusterName").setValue(l.cluster_name),this.editPeerForm.get("clientID").setValue(l.client_id),this.editPeerForm.get("monAddr").setValue(l.mon_host),this.editPeerForm.get("key").setValue(l.key)}update(){const l=new s;let n;l.cluster_name=this.editPeerForm.getValue("clusterName"),l.client_id=this.editPeerForm.getValue("clientID"),l.mon_host=this.editPeerForm.getValue("monAddr"),l.key=this.editPeerForm.getValue("key"),n=this.taskWrapper.wrapTaskAroundCall("edit"===this.mode?{task:new u.a("rbd/mirroring/peer/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePeer(this.poolName,this.peerUUID,l)}:{task:new u.a("rbd/mirroring/peer/add",{pool_name:this.poolName}),call:this.rbdMirroringService.addPeer(this.poolName,l)}),n.subscribe(void 0,()=>this.editPeerForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},MyVl:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("LvDl"),s=e("jtHE"),a=e("cp0P"),o=e("SxV6"),r=e("eIep"),d=(e("Ekvf"),e("F83c"),e("sne2"),e("oxzT")),c=e("QFaf"),m=e("PhyI"),p=e("kvvV"),h=e("jVDg"),g=(e("Fgil"),e("aexS"),e("aXbf"),e("kn/O"),e("u0yg"));class f{constructor(){this.features=[]}}class v{constructor(){this.features=[]}}var b=e("lArG");class C extends b.a{constructor(){super(...arguments),this.features=[]}}class S{constructor(){this.features=[]}}var _=function(l){return l.editing="editing",l.cloning="cloning",l.copying="copying",l}({});e.d(n,"a",(function(){return R}));class R{constructor(l,n,e,i,u,a,o,r,c,m){this.authStorageService=l,this.route=n,this.poolService=e,this.rbdService=i,this.formatter=u,this.taskWrapper=a,this.dimlessBinaryPipe=o,this.i18n=r,this.actionLabels=c,this.router=m,this.namespaces=[],this.namespacesByPoolCache={},this.pools=null,this.allPools=null,this.dataPools=null,this.allDataPools=null,this.featuresList=[],this.initializeConfigData=new t.EventEmitter,this.advancedEnabled=!1,this.rbdFormMode=_,this.defaultObjectSize="4 MiB",this.objectSizes=["4 KiB","8 KiB","16 KiB","32 KiB","64 KiB","128 KiB","256 KiB","512 KiB","1 MiB","2 MiB","4 MiB","8 MiB","16 MiB","32 MiB"],this.rbdImage=new s.a(1),this.icons=d.a,this.poolPermission=this.authStorageService.getPermissions().pool,this.resource=this.i18n("RBD"),this.features={"deep-flatten":{desc:this.i18n("Deep flatten"),requires:null,allowEnable:!1,allowDisable:!0},layering:{desc:this.i18n("Layering"),requires:null,allowEnable:!1,allowDisable:!1},"exclusive-lock":{desc:this.i18n("Exclusive lock"),requires:null,allowEnable:!0,allowDisable:!0},"object-map":{desc:this.i18n("Object map (requires exclusive-lock)"),requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},journaling:{desc:this.i18n("Journaling (requires exclusive-lock)"),requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},"fast-diff":{desc:this.i18n("Fast diff (interlocked with object-map)"),requires:"object-map",allowEnable:!0,allowDisable:!0,interlockedWith:"object-map",initDisabled:!0}},this.featuresList=this.objToArray(this.features),this.createForm()}objToArray(l){return u.map(l,(l,n)=>Object.assign(l,{key:n}))}createForm(){this.rbdForm=new c.a({parent:new i.i(""),name:new i.i("",{validators:[i.B.required,i.B.pattern(/^[^@/]+?$/)]}),pool:new i.i(null,{validators:[i.B.required]}),namespace:new i.i(null),useDataPool:new i.i(!1),dataPool:new i.i(null),size:new i.i(null,{updateOn:"blur"}),obj_size:new i.i(this.defaultObjectSize),features:new c.a(this.featuresList.reduce((l,n)=>(l[n.key]=new i.i({value:!1,disabled:!!n.initDisabled}),l),{})),stripingUnit:new i.i(null),stripingCount:new i.i(null,{updateOn:"blur"})},this.validateRbdForm(this.formatter))}disableForEdit(){this.rbdForm.get("parent").disable(),this.rbdForm.get("pool").disable(),this.rbdForm.get("namespace").disable(),this.rbdForm.get("useDataPool").disable(),this.rbdForm.get("dataPool").disable(),this.rbdForm.get("obj_size").disable(),this.rbdForm.get("stripingUnit").disable(),this.rbdForm.get("stripingCount").disable(),this.rbdImage.subscribe(l=>{l.image_format===g.a.V1&&(this.rbdForm.get("deep-flatten").disable(),this.rbdForm.get("layering").disable(),this.rbdForm.get("exclusive-lock").disable())})}disableForClone(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}disableForCopy(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}ngOnInit(){let l;this.router.url.startsWith("/block/rbd/edit")?(this.mode=this.rbdFormMode.editing,this.action=this.actionLabels.EDIT,this.disableForEdit()):this.router.url.startsWith("/block/rbd/clone")?(this.mode=this.rbdFormMode.cloning,this.disableForClone(),this.action=this.actionLabels.CLONE):this.router.url.startsWith("/block/rbd/copy")?(this.mode=this.rbdFormMode.copying,this.action=this.actionLabels.COPY,this.disableForCopy()):this.action=this.actionLabels.CREATE,function(l){l.RbdServiceGet="rbdService.get",l.PoolServiceList="poolService.list"}(l||(l={}));const n={};this.mode===this.rbdFormMode.editing||this.mode===this.rbdFormMode.cloning||this.mode===this.rbdFormMode.copying?this.route.params.subscribe(e=>{const t=h.a.fromString(decodeURIComponent(e.image_spec));e.snap&&(this.snapName=decodeURIComponent(e.snap)),n[l.RbdServiceGet]=this.rbdService.get(t)}):this.rbdService.defaultFeatures().subscribe(l=>{this.setFeatures(l)}),this.mode!==this.rbdFormMode.editing&&this.poolPermission.read&&(n[l.PoolServiceList]=this.poolService.list(["pool_name","type","flags_names","application_metadata"])),Object(a.a)(n).subscribe(n=>{if(n[l.PoolServiceList]){const e=[],t=[];for(const i of n[l.PoolServiceList])this.rbdService.isRBDPool(i)&&("replicated"===i.type?(e.push(i),t.push(i)):"erasure"===i.type&&-1!==i.flags_names.indexOf("ec_overwrites")&&t.push(i));if(this.pools=e,this.allPools=e,this.dataPools=t,this.allDataPools=t,1===this.pools.length){const l=this.pools[0].pool_name;this.rbdForm.get("pool").setValue(l),this.onPoolChange(l)}}if(n[l.RbdServiceGet]){const e=n[l.RbdServiceGet];this.setResponse(e,this.snapName),this.rbdImage.next(e)}}),u.each(this.features,l=>{this.rbdForm.get("features").get(l.key).valueChanges.subscribe(n=>this.featureFormUpdate(l.key,n))})}onPoolChange(l){const n=this.allDataPools?this.allDataPools.filter(n=>n.pool_name!==l):[];this.rbdForm.getValue("dataPool")===l&&this.rbdForm.get("dataPool").setValue(null),this.dataPools=n,this.namespaces=null,l in this.namespacesByPoolCache?this.namespaces=this.namespacesByPoolCache[l]:this.rbdService.listNamespaces(l).subscribe(n=>{n=n.map(l=>l.namespace),this.namespacesByPoolCache[l]=n,this.namespaces=n}),this.rbdForm.get("namespace").setValue(null)}onUseDataPoolChange(){this.rbdForm.getValue("useDataPool")||(this.rbdForm.get("dataPool").setValue(null),this.onDataPoolChange(null))}onDataPoolChange(l){const n=this.allPools.filter(n=>n.pool_name!==l);this.rbdForm.getValue("pool")===l&&this.rbdForm.get("pool").setValue(null),this.pools=n}validateRbdForm(l){return n=>{const e=n.get("useDataPool"),t=n.get("dataPool");let i=null;e.value&&null==t.value&&(i={required:!0}),t.setErrors(i);const u=n.get("size"),s=n.get("obj_size"),a=l.toBytes(null!=s.value?s.value:this.defaultObjectSize),o=n.get("stripingCount"),r=null!=o.value?o.value:1;let d=null;null===u.value?d={required:!0}:r*a>l.toBytes(u.value)&&(d={invalidSizeObject:!0}),u.setErrors(d);const c=n.get("stripingUnit");let m=null;null===c.value&&null!==o.value?m={required:!0}:null!==c.value&&l.toBytes(c.value)>a&&(m={invalidStripingUnit:!0}),c.setErrors(m);let p=null;return null===o.value&&null!==c.value?p={required:!0}:r<1&&(p={min:!0}),o.setErrors(p),null}}getDependendChildFeatures(l){return u.filter(this.features,n=>n.requires===l)||[]}deepBoxCheck(l,n){this.getDependendChildFeatures(l).forEach(l=>{const e=this.rbdForm.get(l.key);n?e.enable({emitEvent:!1}):(e.disable({emitEvent:!1}),e.setValue(!1,{emitEvent:!1}),this.deepBoxCheck(l.key,n));const t=this.rbdForm.get("features");this.mode===this.rbdFormMode.editing&&t.get(l.key).enabled&&((-1===this.response.features_name.indexOf(l.key)||l.allowDisable)&&(-1!==this.response.features_name.indexOf(l.key)||l.allowEnable)||t.get(l.key).disable())})}interlockCheck(l,n){const e=this.featuresList.find(n=>n.key===l);if(this.response){const l=null!=e.interlockedWith,n=this.featuresList.find(l=>l.interlockedWith===e.key),t=!!this.response.features_name.find(l=>l===e.key);if(l){if(t!==!!this.response.features_name.find(l=>l===e.interlockedWith))return}else if(n&&!!this.response.features_name.find(l=>l===n.key)!==t)return}n?u.filter(this.features,n=>n.interlockedWith===l).forEach(l=>this.rbdForm.get(l.key).setValue(!0,{emitEvent:!1})):e.interlockedWith&&this.rbdForm.get("features").get(e.interlockedWith).setValue(!1)}featureFormUpdate(l,n){if(n){const n=this.features[l].requires;if(n&&!this.rbdForm.getValue(n))return void this.rbdForm.get("features."+l).setValue(!1)}this.deepBoxCheck(l,n),this.interlockCheck(l,n)}setFeatures(l){const n=this.rbdForm.get("features");u.forIn(this.features,e=>{-1!==l.indexOf(e.key)&&n.get(e.key).setValue(!0),this.featureFormUpdate(e.key,n.get(e.key).value)})}setResponse(l,n){this.response=l;const e=new h.a(l.pool_name,l.namespace,l.name).toString();if(this.mode===this.rbdFormMode.cloning)this.rbdForm.get("parent").setValue(`${e}@${n}`);else if(this.mode===this.rbdFormMode.copying)n?this.rbdForm.get("parent").setValue(`${e}@${n}`):this.rbdForm.get("parent").setValue(""+e);else if(l.parent){const n=l.parent;this.rbdForm.get("parent").setValue(`${n.pool_name}/${n.image_name}@${n.snap_name}`)}this.mode===this.rbdFormMode.editing&&this.rbdForm.get("name").setValue(l.name),this.rbdForm.get("pool").setValue(l.pool_name),this.onPoolChange(l.pool_name),this.rbdForm.get("namespace").setValue(l.namespace),l.data_pool&&(this.rbdForm.get("useDataPool").setValue(!0),this.rbdForm.get("dataPool").setValue(l.data_pool)),this.rbdForm.get("size").setValue(this.dimlessBinaryPipe.transform(l.size)),this.rbdForm.get("obj_size").setValue(this.dimlessBinaryPipe.transform(l.obj_size)),this.setFeatures(l.features_name),this.rbdForm.get("stripingUnit").setValue(this.dimlessBinaryPipe.transform(l.stripe_unit)),this.rbdForm.get("stripingCount").setValue(l.stripe_count),this.initializeConfigData.emit({initialData:this.response.configuration,sourceType:m.a.image})}createRequest(){const l=new C;return l.pool_name=this.rbdForm.getValue("pool"),l.namespace=this.rbdForm.getValue("namespace"),l.name=this.rbdForm.getValue("name"),l.size=this.formatter.toBytes(this.rbdForm.getValue("size")),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),u.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(),l}createAction(){const l=this.createRequest();return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/create",{pool_name:l.pool_name,namespace:l.namespace,image_name:l.name}),call:this.rbdService.create(l)})}editRequest(){const l=new S;return l.name=this.rbdForm.getValue("name"),l.size=this.formatter.toBytes(this.rbdForm.getValue("size")),u.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.configuration=this.getDirtyConfigurationValues(),l}cloneRequest(){const l=new f;return l.child_pool_name=this.rbdForm.getValue("pool"),l.child_namespace=this.rbdForm.getValue("namespace"),l.child_image_name=this.rbdForm.getValue("name"),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),u.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(!0,m.a.image),l}editAction(){const l=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/edit",{image_spec:l.toString()}),call:this.rbdService.update(l,this.editRequest())})}cloneAction(){const l=this.cloneRequest(),n=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/clone",{parent_image_spec:n.toString(),parent_snap_name:this.snapName,child_pool_name:l.child_pool_name,child_namespace:l.child_namespace,child_image_name:l.child_image_name}),call:this.rbdService.cloneSnapshot(n,this.snapName,l)})}copyRequest(){const l=new v;return this.snapName&&(l.snapshot_name=this.snapName),l.dest_pool_name=this.rbdForm.getValue("pool"),l.dest_namespace=this.rbdForm.getValue("namespace"),l.dest_image_name=this.rbdForm.getValue("name"),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),u.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(!0,m.a.image),l}copyAction(){const l=this.copyRequest(),n=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/copy",{src_image_spec:n.toString(),dest_pool_name:l.dest_pool_name,dest_namespace:l.dest_namespace,dest_image_name:l.dest_image_name}),call:this.rbdService.copy(n,l)})}submit(){this.mode||this.rbdImage.next("create"),this.rbdImage.pipe(Object(o.a)(),Object(r.a)(()=>this.mode===this.rbdFormMode.editing?this.editAction():this.mode===this.rbdFormMode.cloning?this.cloneAction():this.mode===this.rbdFormMode.copying?this.copyAction():this.createAction())).subscribe(()=>{},()=>this.rbdForm.setErrors({cdSubmitButton:!0}),()=>this.router.navigate(["/block/rbd"]))}}},PhyI:function(l,n,e){"use strict";e.d(n,"a",(function(){return t})),e.d(n,"b",(function(){return i}));var t=function(l){return l[l.global=0]="global",l[l.pool=1]="pool",l[l.image=2]="image",l}({}),i=function(l){return l[l.bps=0]="bps",l[l.iops=1]="iops",l[l.milliseconds=2]="milliseconds",l}({})},QUzE:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("ANnk"),u=e("f/UV"),s=e("aexS"),a=e("s7LF"),o=e("+gVj"),r=e("EEJc"),d=e("ajRT"),c=e("mXUL"),m=e("IZUe"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("OcYo"),v=e("EApP"),b=e("GiVz"),C=e("KVJa"),S=e("Z21x"),_=e("sne2"),R=e("SuaG"),y=e("LqlI"),w=e("XED3"),k=e("kn/O");e.d(n,"a",(function(){return D}));var I=t["ɵcrt"]({encapsulation:0,styles:[[".form-group.ng-invalid[_ngcontent-%COMP%] .invalid-feedback[_ngcontent-%COMP%]{display:block}"]],data:{}});function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,7,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,3).onChange(e.target.checked)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,3).onTouched()&&i),i}),null,null)),t["ɵdid"](2,4210688,null,0,i.a,[[2,u.a],s.a,t.ElementRef],null,null),t["ɵdid"](3,16384,null,0,a.c,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.c]),t["ɵdid"](5,671744,[[3,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](7,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](9,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](10,null,["",""]))],(function(l,n){l(n,5,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,8,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""))}),(function(l,n){l(n,1,1,[t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵnov"](n,7).ngClassUntouched,t["ɵnov"](n,7).ngClassTouched,t["ɵnov"](n,7).ngClassPristine,t["ɵnov"](n,7).ngClassDirty,t["ɵnov"](n,7).ngClassValid,t["ɵnov"](n,7).ngClassInvalid,t["ɵnov"](n,7).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass]),l(n,9,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,10,0,n.context.$implicit.name)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["At least one pool is required."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,74,"cd-modal",[],null,null,null,r.c,r.b)),t["ɵdid"](1,49152,null,0,d.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Create Bootstrap Token"])),(l()(),t["ɵeld"](4,0,null,1,70,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,69,"form",[["class","form"],["name","createBootstrapForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,a.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,a.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,a.d,null,[a.l]),t["ɵdid"](9,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,59,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To create a bootstrap token which can be imported by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, and click  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Generate"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](19,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,27).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,27)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](25,4210688,null,0,m.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,i.a,[[2,u.a],s.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](29,671744,[[1,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](31,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](32,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,E)),t["ɵdid"](34,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,12,"div",[["class","form-group"],["formGroupName","pools"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](36,212992,null,0,a.m,[[3,a.d],[8,null],[8,null]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.d,null,[a.m]),t["ɵdid"](38,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](39,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](42,0,null,0,1,"label",[["class","col-form-label required"],["for","pools"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](45,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](47,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](48,0,null,null,3,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](49,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.generate()&&t),t}),h.b,h.a)),t["ɵdid"](50,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Generate"])),(l()(),t["ɵeld"](52,0,null,null,14,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](53,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](56,0,null,0,2,"label",[["class","col-form-label"],["for","token"]],null,null,null,null,null)),(l()(),t["ɵeld"](57,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Token"])),(l()(),t["ɵeld"](59,0,null,0,7,"textarea",[["class","form-control resize-vertical"],["formControlName","token"],["id","token"],["placeholder","Generated token..."],["readonly",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,60)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,60).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,60)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,60)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](60,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](62,671744,[[5,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](64,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](65,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵted"](-1,null,[" "])),(l()(),t["ɵeld"](67,0,null,null,3,"button",[["aria-label","Copy to Clipboard"],["cdCopy2ClipboardButton","token"],["class","btn btn-primary mb-3 float-right"],["title","Copy to Clipboard"]],null,[[null,"click"]],(function(l,n,e){var i=!0;return"click"===n&&(i=!1!==t["ɵnov"](l,68).onClick()&&i),i}),null,null)),t["ɵdid"](68,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵeld"](69,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Copy to Clipboard"])),(l()(),t["ɵeld"](71,0,null,null,3,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](72,0,null,null,2,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](73,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,C.b,C.a)),t["ɵdid"](74,49152,null,0,S.a,[p.Location,_.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.createBootstrapForm),l(n,10,0,e.createBootstrapForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,34,0,e.createBootstrapForm.showError("siteName",t["ɵnov"](n,7),"required")),l(n,36,0,"pools"),l(n,39,0),l(n,45,0,e.pools),l(n,47,0,e.createBootstrapForm.showError("pools",t["ɵnov"](n,7),"requirePool")),l(n,50,0,e.createBootstrapForm),l(n,53,0),l(n,62,0,"token"),l(n,65,0,"token"),l(n,68,0,"token"),l(n,74,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass),l(n,35,0,t["ɵnov"](n,38).ngClassUntouched,t["ɵnov"](n,38).ngClassTouched,t["ɵnov"](n,38).ngClassPristine,t["ɵnov"](n,38).ngClassDirty,t["ɵnov"](n,38).ngClassValid,t["ɵnov"](n,38).ngClassInvalid,t["ɵnov"](n,38).ngClassPending,t["ɵnov"](n,39).hasErrors,t["ɵnov"](n,39).hasSuccess),l(n,52,0,t["ɵnov"](n,53).hasErrors,t["ɵnov"](n,53).hasSuccess),l(n,59,0,t["ɵnov"](n,64).ngClassUntouched,t["ɵnov"](n,64).ngClassTouched,t["ɵnov"](n,64).ngClassPristine,t["ɵnov"](n,64).ngClassDirty,t["ɵnov"](n,64).ngClassValid,t["ɵnov"](n,64).ngClassInvalid,t["ɵnov"](n,64).ngClassPending,t["ɵnov"](n,65).validClass,t["ɵnov"](n,65).invalidClass)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-bootstrap-create-modal",[],null,null,null,V,I)),t["ɵdid"](1,245760,null,0,R.a,[y.a,w.a,k.a],null,null)],(function(l,n){l(n,1,0)}),null)}var D=t["ɵccf"]("cd-bootstrap-create-modal",R.a,T,{},{},[])},RIVN:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("C6Ij"),u=e("AWcq"),s=e("NUGo"),a=e("S7zO"),o=e("SVse");class r{transform(l){return"warning"===l?"badge badge-warning":"error"===l?"badge badge-danger":"success"===l?"badge badge-success":"badge badge-info"}}var d=e("25BL"),c=e("uIqm"),m=e("XED3"),p=e("85J/");class h{constructor(l,n,e){this.rbdMirroringService=l,this.cephShortVersionPipe=n,this.i18n=e}ngOnInit(){this.columns=[{prop:"instance_id",name:this.i18n("Instance"),flexGrow:2},{prop:"id",name:this.i18n("ID"),flexGrow:2},{prop:"server_hostname",name:this.i18n("Hostname"),flexGrow:2},{prop:"version",name:this.i18n("Version"),pipe:this.cephShortVersionPipe,flexGrow:2},{prop:"health",name:this.i18n("Health"),cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.data=l.content_data.daemons})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}var g=e("GiVz"),f=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.health_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function b(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{healthTmpl:0}),(l()(),t["ɵeld"](2,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"}),(l()(),t["ɵand"](0,[[1,2],["healthTmpl",2]],null,0,null,v))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex",-1)}),null)}var C=e("HDdC"),S=e("0+/T"),_=e("oxzT"),R=e("vCyI"),y=e("kvvV"),w=e("aexS"),k=e("kn/O"),I=e("aa9H"),E=e("L4us");class N{constructor(l,n,e,t,i){this.authStorageService=l,this.rbdMirroringService=n,this.modalService=e,this.taskWrapper=t,this.i18n=i,this.selection=new R.a,this.data=[],this.permission=this.authStorageService.getPermissions().rbdMirroring;const u={permission:"update",icon:_.a.edit,click:()=>this.editModeModal(),name:this.i18n("Edit Mode"),canBePrimary:()=>!0},s={permission:"create",icon:_.a.add,name:this.i18n("Add Peer"),click:()=>this.editPeersModal("add"),disable:()=>!this.selection.first()||"disabled"===this.selection.first().mirror_mode,visible:()=>!this.getPeerUUID(),canBePrimary:()=>!1},a={permission:"update",icon:_.a.exchange,name:this.i18n("Edit Peer"),click:()=>this.editPeersModal("edit"),visible:()=>!!this.getPeerUUID()},o={permission:"delete",icon:_.a.destroy,name:this.i18n("Delete Peer"),click:()=>this.deletePeersModal(),visible:()=>!!this.getPeerUUID()};this.tableActions=[u,s,a,o]}ngOnInit(){this.columns=[{prop:"name",name:this.i18n("Name"),flexGrow:2},{prop:"mirror_mode",name:this.i18n("Mode"),flexGrow:2},{prop:"leader_id",name:this.i18n("Leader"),flexGrow:2},{prop:"image_local_count",name:this.i18n("# Local"),flexGrow:2},{prop:"image_remote_count",name:this.i18n("# Remote"),flexGrow:2},{prop:"health",name:this.i18n("Health"),cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.data=l.content_data.pools})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}editModeModal(){const l={poolName:this.selection.first().name};this.modalRef=this.modalService.show(I.a,{initialState:l})}editPeersModal(l){const n={poolName:this.selection.first().name,mode:l};"edit"===l&&(n.peerUUID=this.getPeerUUID()),this.modalRef=this.modalService.show(E.a,{initialState:n})}deletePeersModal(){const l=this.selection.first().name,n=this.getPeerUUID();this.modalRef=this.modalService.show(S.a,{initialState:{itemDescription:this.i18n("mirror peer"),itemNames:[`${l} (${n})`],submitActionObservable:()=>new C.a(e=>{this.taskWrapper.wrapTaskAroundCall({task:new y.a("rbd/mirroring/peer/delete",{pool_name:l}),call:this.rbdMirroringService.deletePeer(l,n)}).subscribe(void 0,l=>e.error(l),()=>{this.rbdMirroringService.refresh(),e.complete()})})}})}getPeerUUID(){const l=this.selection.first(),n=this.data.find(n=>l&&l.name===n.name);if(n&&n.peer_uuids)return n.peer_uuids[0]}updateSelection(l){this.selection=l}}var F=e("LqlI"),V=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.health_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function D(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{healthTmpl:0}),(l()(),t["ɵeld"](2,0,null,null,3,"cd-table",[["columnMode","flex"],["forceIdentifier","true"],["identifier","name"],["selectionType","single"]],null,[[null,"fetchData"],[null,"updateSelection"]],(function(l,n,e){var t=!0,i=l.component;return"fetchData"===n&&(t=!1!==i.refresh()&&t),"updateSelection"===n&&(t=!1!==i.updateSelection(e)&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"],identifier:[4,"identifier"],forceIdentifier:[5,"forceIdentifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection"}),(l()(),t["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,s.b,s.a)),t["ɵdid"](5,114688,null,0,a.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵand"](0,[[1,2],["healthTmpl",2]],null,0,null,T))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex",-1,"name","true","single"),l(n,5,0,e.permission,e.selection,e.tableActions)}),null)}var P=e("7qid"),x=e("38Bd"),q=e("pKUh"),B=e("2ZVE");class O{constructor(l,n){this.rbdMirroringService=l,this.i18n=n,this.image_error={data:[],columns:{}},this.image_syncing={data:[],columns:{}},this.image_ready={data:[],columns:{}}}ngOnInit(){this.image_error.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"description",name:this.i18n("Issue"),flexGrow:4},{prop:"state",name:this.i18n("State"),cellTemplate:this.stateTmpl,flexGrow:1}],this.image_syncing.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"progress",name:this.i18n("Progress"),cellTemplate:this.progressTmpl,flexGrow:2},{prop:"state",name:this.i18n("State"),cellTemplate:this.syncTmpl,flexGrow:1}],this.image_ready.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"description",name:this.i18n("Description"),flexGrow:4},{prop:"state",name:this.i18n("State"),cellTemplate:this.stateTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.image_error.data=l.content_data.image_error,this.image_syncing.data=l.content_data.image_syncing,this.image_ready.data=l.content_data.image_ready})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}var A=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function M(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_error.data,e.image_error.columns,"flex",-1)}),null)}function L(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_syncing.data,e.image_syncing.columns,"flex",-1)}),null)}function j(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_ready.data,e.image_ready.columns,"flex",-1)}),null)}function U(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.state_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function G(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","badge badge-info"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Syncing"]))],null,null)}function $(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"progressbar",[["type","info"]],[[1,"max",0],[2,"progress",null]],null,null,P.b,P.a)),t["ɵdid"](1,49152,null,0,x.b,[x.c],{type:[0,"type"],value:[1,"value"]},null)],(function(l,n){l(n,1,0,"info",n.context.value)}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).max,t["ɵnov"](n,1).addClass)}))}function z(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{stateTmpl:0}),t["ɵqud"](402653184,2,{syncTmpl:0}),t["ɵqud"](402653184,3,{progressTmpl:0}),(l()(),t["ɵeld"](4,0,null,null,13,"tabset",[],[[2,"tab-container",null]],null,null,q.b,q.a)),t["ɵdid"](5,180224,[["tabset",4]],0,B.e,[B.f,t.Renderer2,t.ElementRef],null,null),(l()(),t["ɵeld"](6,0,null,0,3,"tab",[["heading","Issues"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](7,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,M)),t["ɵdid"](9,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](10,0,null,0,3,"tab",[["heading","Syncing"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](11,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,L)),t["ɵdid"](13,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](14,0,null,0,3,"tab",[["heading","Ready"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](15,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,j)),t["ɵdid"](17,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["stateTmpl",2]],null,0,null,U)),(l()(),t["ɵand"](0,[[2,2],["syncTmpl",2]],null,0,null,G)),(l()(),t["ɵand"](0,[[3,2],["progressTmpl",2]],null,0,null,$))],(function(l,n){l(n,7,0,"Issues"),l(n,9,0,null==t["ɵnov"](n,5).tabs[0]?null:t["ɵnov"](n,5).tabs[0].active),l(n,11,0,"Syncing"),l(n,13,0,null==t["ɵnov"](n,5).tabs[1]?null:t["ɵnov"](n,5).tabs[1].active),l(n,15,0,"Ready"),l(n,17,0,null==t["ɵnov"](n,5).tabs[2]?null:t["ɵnov"](n,5).tabs[2].active)}),(function(l,n){l(n,4,0,t["ɵnov"](n,5).clazz),l(n,6,0,t["ɵnov"](n,7).id,t["ɵnov"](n,7).active,t["ɵnov"](n,7).addClass,t["ɵnov"](n,7).role,t["ɵnov"](n,7).ariaLabelledby),l(n,10,0,t["ɵnov"](n,11).id,t["ɵnov"](n,11).active,t["ɵnov"](n,11).addClass,t["ɵnov"](n,11).role,t["ɵnov"](n,11).ariaLabelledby),l(n,14,0,t["ɵnov"](n,15).id,t["ɵnov"](n,15).active,t["ɵnov"](n,15).addClass,t["ɵnov"](n,15).role,t["ɵnov"](n,15).ariaLabelledby)}))}var X=e("cxJu");e.d(n,"a",(function(){return K}));var W=t["ɵcrt"]({encapsulation:0,styles:[["cd-mirroring cd-table-actions.float-right ul{right:0!important;left:auto!important}"]],data:{}});function J(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-view-cache",[],null,null,null,i.b,i.a)),t["ɵdid"](1,114688,null,0,u.a,[],{status:[0,"status"]},null),(l()(),t["ɵeld"](2,0,null,null,7,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,6,"div",[["class","col-md-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name:"])),(l()(),t["ɵted"](7,null,[" ",""])),(l()(),t["ɵeld"](8,0,null,null,1,"cd-table-actions",[["class","table-actions float-right"]],null,null,null,s.b,s.a)),t["ɵdid"](9,114688,null,0,a.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵeld"](10,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,4,"div",[["class","col-sm-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Daemons"])),(l()(),t["ɵeld"](14,0,null,null,1,"cd-mirroring-daemons",[],null,null,null,b,f)),t["ɵdid"](15,245760,null,0,h,[m.a,p.a,g.a],null,null),(l()(),t["ɵeld"](16,0,null,null,4,"div",[["class","col-sm-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵeld"](19,0,null,null,1,"cd-mirroring-pools",[],null,null,null,D,V)),t["ɵdid"](20,245760,null,0,N,[w.a,m.a,F.b,k.a,g.a],null,null),(l()(),t["ɵeld"](21,0,null,null,5,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](22,0,null,null,4,"div",[["class","col-md-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Images"])),(l()(),t["ɵeld"](25,0,null,null,1,"cd-mirroring-images",[],null,null,null,z,A)),t["ɵdid"](26,245760,null,0,O,[m.a,g.a],null,null)],(function(l,n){var e=n.component;l(n,1,0,e.status),l(n,9,0,e.permission,e.selection,e.tableActions),l(n,15,0),l(n,20,0),l(n,26,0)}),(function(l,n){l(n,7,0,n.component.siteName)}))}function Y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-mirroring",[],null,null,null,J,W)),t["ɵdid"](1,245760,null,0,X.a,[w.a,m.a,F.b,g.a],null,null)],(function(l,n){l(n,1,0)}),null)}var K=t["ɵccf"]("cd-mirroring",X.a,Y,{},{},[])},Sofw:function(l,n,e){"use strict";e.d(n,"a",(function(){return a}));var t=e("s7LF"),i=(e("my5R"),e("mtw6")),u=e("QFaf"),s=e("1Ni5");e("aexS"),e("9nlD");class a{constructor(l,n,e,t,i){this.authStorageService=l,this.bsModalRef=n,this.iscsiService=e,this.notificationService=t,this.i18n=i,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.permission=this.authStorageService.getPermissions().iscsi}ngOnInit(){this.hasPermission=this.permission.update,this.createForm(),this.iscsiService.getDiscovery().subscribe(l=>{this.discoveryForm.patchValue(l)})}createForm(){this.discoveryForm=new u.a({user:new t.i({value:"",disabled:!this.hasPermission}),password:new t.i({value:"",disabled:!this.hasPermission}),mutual_user:new t.i({value:"",disabled:!this.hasPermission}),mutual_password:new t.i({value:"",disabled:!this.hasPermission})}),s.a.validateIf(this.discoveryForm.get("user"),()=>this.discoveryForm.getValue("password")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("password"),()=>this.discoveryForm.getValue("user")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("mutual_user"),()=>this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("mutual_password"),()=>this.discoveryForm.getValue("mutual_user"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user")])}submitAction(){this.iscsiService.updateDiscovery(this.discoveryForm.value).subscribe(()=>{this.notificationService.show(i.a.success,this.i18n("Updated discovery authentication")),this.bsModalRef.hide()},()=>{this.discoveryForm.setErrors({cdSubmitButton:!0})})}}},SuaG:function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("s7LF"),i=e("LvDl"),u=e("GyhO"),s=e("cp0P"),a=e("vkgz"),o=e("NJ9Y"),r=(e("XED3"),e("QFaf")),d=e("kvvV");e("kn/O");class c{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.pools=[],this.createForm()}createForm(){this.createBootstrapForm=new r.a({siteName:new t.i("",{validators:[t.B.required]}),pools:new t.k({},{validators:[this.validatePools()]}),token:new t.i("",{})})}ngOnInit(){this.createBootstrapForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(l=>{this.createBootstrapForm.get("siteName").setValue(l.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.pools=l.content_data.pools.reduce((l,n)=>(l.push({name:n.name,mirror_mode:n.mirror_mode}),l),[]);const n=this.createBootstrapForm.get("pools");i.each(this.pools,l=>{const e=l.name,i="disabled"===l.mirror_mode,u=n.controls[e];u?i&&u.disabled?u.enable():!i&&u.enabled&&(u.disable(),u.setValue(!0)):n.addControl(e,new t.i({value:!i,disabled:!i}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return l=>{let n=0;return i.each(l.controls,l=>{!0===l.value&&++n}),n>0?null:{requirePool:!0}}}generate(){this.createBootstrapForm.get("token").setValue("");let l="";const n=[],e=this.createBootstrapForm.get("pools");i.each(e.controls,(e,t)=>{!0===e.value&&(l=t,e.disabled||n.push(t))});const t={mirror_mode:"image"},r=Object(u.a)(this.rbdMirroringService.setSiteName(this.createBootstrapForm.getValue("siteName")),Object(s.a)(n.map(l=>this.rbdMirroringService.updatePool(l,t))),this.rbdMirroringService.createBootstrapToken(l).pipe(Object(a.a)(l=>this.createBootstrapForm.get("token").setValue(l.token)))).pipe(Object(o.a)()),c=()=>{this.rbdMirroringService.refresh(),this.createBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new d.a("rbd/mirroring/bootstrap/create",{}),call:r}).subscribe(void 0,c,c)}}},VBM6:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("EEJc"),u=e("ajRT"),s=e("SVse"),a=e("s7LF"),o=e("+gVj"),r=e("mXUL"),d=e("IZUe"),c=e("ANnk"),m=e("f/UV"),p=e("aexS"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("L4us"),S=e("LqlI"),_=e("XED3"),R=e("kn/O");e.d(n,"a",(function(){return B}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function w(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Edit"]))],null,null)}function k(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Add"]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Edit"]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Add"]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The cluster name is not valid."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The CephX ID is not valid."]))],null,null)}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The monitory address is not valid."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX key must be base64 encoded."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,110,"cd-modal",[],null,null,null,i.c,i.b)),t["ɵdid"](1,49152,null,0,u.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,7,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,5,null,null,null,null,null,null,null)),t["ɵdid"](4,16384,null,0,s.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,w)),t["ɵdid"](6,278528,null,0,s.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](8,16384,null,0,s.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],null,null),(l()(),t["ɵted"](-1,null,[" pool mirror peer"])),(l()(),t["ɵeld"](10,0,null,1,100,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,99,"form",[["class","form"],["name","editPeerForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,13).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,13).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,16).onSubmit()&&i),i}),null,null)),t["ɵdid"](12,16384,null,0,a.G,[],null,null),t["ɵdid"](13,540672,[["formDir",4]],0,a.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,a.d,null,[a.l]),t["ɵdid"](15,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](16,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](17,0,null,null,86,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](18,0,null,null,14,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,13,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](20,0,null,null,5,null,null,null,null,null,null,null)),t["ɵdid"](21,16384,null,0,s.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](23,278528,null,0,s.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](25,16384,null,0,s.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],null,null),(l()(),t["ɵted"](-1,null,[" the pool mirror peer attributes for pool "])),(l()(),t["ɵeld"](27,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](28,null,["",""])),(l()(),t["ɵted"](-1,null,[" and click "])),(l()(),t["ɵeld"](30,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Submit"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](33,0,null,null,18,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](34,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](37,0,null,0,1,"label",[["class","col-form-label required"],["for","clusterName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Cluster Name"])),(l()(),t["ɵeld"](39,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","clusterName"],["id","clusterName"],["name","clusterName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,42)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,42).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,42)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,42)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](40,4210688,null,0,d.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](41,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](42,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](44,671744,[[1,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](46,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](47,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](49,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](51,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](52,0,null,null,17,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](53,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](56,0,null,0,1,"label",[["class","col-form-label required"],["for","clientID"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX ID"])),(l()(),t["ɵeld"](58,0,null,0,7,"input",[["class","form-control"],["formControlName","clientID"],["id","clientID"],["name","clientID"],["placeholder","CephX ID..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,60)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,60).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,60)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,60)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](59,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](60,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](62,671744,[[3,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](64,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](65,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,V)),t["ɵdid"](67,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,T)),t["ɵdid"](69,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](70,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](71,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](74,0,null,0,2,"label",[["class","col-form-label"],["for","monAddr"]],null,null,null,null,null)),(l()(),t["ɵeld"](75,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Monitor Addresses"])),(l()(),t["ɵeld"](77,0,null,0,7,"input",[["class","form-control"],["formControlName","monAddr"],["id","monAddr"],["name","monAddr"],["placeholder","Comma-delimited addresses..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,79)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,79).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,79)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,79)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](78,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](79,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](81,671744,[[5,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](83,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](84,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,D)),t["ɵdid"](86,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](87,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](88,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](91,0,null,0,2,"label",[["class","col-form-label"],["for","key"]],null,null,null,null,null)),(l()(),t["ɵeld"](92,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX Key"])),(l()(),t["ɵeld"](94,0,null,0,7,"input",[["class","form-control"],["formControlName","key"],["id","key"],["name","key"],["placeholder","Base64-encoded key..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,96)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,96).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,96)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,96)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](95,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](96,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](98,671744,[[7,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](100,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](101,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,P)),t["ɵdid"](103,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](104,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](105,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](106,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),h.b,h.a)),t["ɵdid"](107,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Submit"])),(l()(),t["ɵeld"](109,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,f.b,f.a)),t["ɵdid"](110,49152,null,0,v.a,[s.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,4,0,e.mode),l(n,6,0,"edit"),l(n,13,0,e.editPeerForm),l(n,16,0,e.editPeerForm),l(n,21,0,e.mode),l(n,23,0,"edit"),l(n,34,0),l(n,40,0,""),l(n,44,0,"clusterName"),l(n,47,0,"clusterName"),l(n,49,0,e.editPeerForm.showError("clusterName",t["ɵnov"](n,13),"required")),l(n,51,0,e.editPeerForm.showError("clusterName",t["ɵnov"](n,13),"invalidClusterName")),l(n,53,0),l(n,62,0,"clientID"),l(n,65,0,"clientID"),l(n,67,0,e.editPeerForm.showError("clientID",t["ɵnov"](n,13),"required")),l(n,69,0,e.editPeerForm.showError("clientID",t["ɵnov"](n,13),"invalidClientID")),l(n,71,0),l(n,81,0,"monAddr"),l(n,84,0,"monAddr"),l(n,86,0,e.editPeerForm.showError("monAddr",t["ɵnov"](n,13),"invalidMonAddr")),l(n,88,0),l(n,98,0,"key"),l(n,101,0,"key"),l(n,103,0,e.editPeerForm.showError("key",t["ɵnov"](n,13),"invalidKey")),l(n,107,0,e.editPeerForm),l(n,110,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,11,0,t["ɵnov"](n,15).ngClassUntouched,t["ɵnov"](n,15).ngClassTouched,t["ɵnov"](n,15).ngClassPristine,t["ɵnov"](n,15).ngClassDirty,t["ɵnov"](n,15).ngClassValid,t["ɵnov"](n,15).ngClassInvalid,t["ɵnov"](n,15).ngClassPending),l(n,28,0,e.poolName),l(n,33,0,t["ɵnov"](n,34).hasErrors,t["ɵnov"](n,34).hasSuccess),l(n,39,0,t["ɵnov"](n,46).ngClassUntouched,t["ɵnov"](n,46).ngClassTouched,t["ɵnov"](n,46).ngClassPristine,t["ɵnov"](n,46).ngClassDirty,t["ɵnov"](n,46).ngClassValid,t["ɵnov"](n,46).ngClassInvalid,t["ɵnov"](n,46).ngClassPending,t["ɵnov"](n,47).validClass,t["ɵnov"](n,47).invalidClass),l(n,52,0,t["ɵnov"](n,53).hasErrors,t["ɵnov"](n,53).hasSuccess),l(n,58,0,t["ɵnov"](n,64).ngClassUntouched,t["ɵnov"](n,64).ngClassTouched,t["ɵnov"](n,64).ngClassPristine,t["ɵnov"](n,64).ngClassDirty,t["ɵnov"](n,64).ngClassValid,t["ɵnov"](n,64).ngClassInvalid,t["ɵnov"](n,64).ngClassPending,t["ɵnov"](n,65).validClass,t["ɵnov"](n,65).invalidClass),l(n,70,0,t["ɵnov"](n,71).hasErrors,t["ɵnov"](n,71).hasSuccess),l(n,77,0,t["ɵnov"](n,83).ngClassUntouched,t["ɵnov"](n,83).ngClassTouched,t["ɵnov"](n,83).ngClassPristine,t["ɵnov"](n,83).ngClassDirty,t["ɵnov"](n,83).ngClassValid,t["ɵnov"](n,83).ngClassInvalid,t["ɵnov"](n,83).ngClassPending,t["ɵnov"](n,84).validClass,t["ɵnov"](n,84).invalidClass),l(n,87,0,t["ɵnov"](n,88).hasErrors,t["ɵnov"](n,88).hasSuccess),l(n,94,0,t["ɵnov"](n,100).ngClassUntouched,t["ɵnov"](n,100).ngClassTouched,t["ɵnov"](n,100).ngClassPristine,t["ɵnov"](n,100).ngClassDirty,t["ɵnov"](n,100).ngClassValid,t["ɵnov"](n,100).ngClassInvalid,t["ɵnov"](n,100).ngClassPending,t["ɵnov"](n,101).validClass,t["ɵnov"](n,101).invalidClass)}))}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-pool-edit-peer-modal",[],null,null,null,x,y)),t["ɵdid"](1,114688,null,0,C.a,[S.a,_.a,R.a],null,null)],(function(l,n){l(n,1,0)}),null)}var B=t["ɵccf"]("cd-pool-edit-peer-modal",C.a,q,{},{},[])},WkyA:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{constructor(){}}},WxU5:function(l,n,e){"use strict";e.d(n,"a",(function(){return i})),e("Ekvf"),e("F83c"),e("2EZI");var t=e("kvvV");e("aexS"),e("kn/O");class i{constructor(l,n,e,t,i,u){this.authStorageService=l,this.rbdService=n,this.modalRef=e,this.fb=t,this.poolService=i,this.taskWrapper=u,this.poolPermission=this.authStorageService.getPermissions().pool}createForm(){this.purgeForm=this.fb.group({poolName:""})}ngOnInit(){this.poolPermission.read&&this.poolService.list(["pool_name","application_metadata"]).then(l=>{this.pools=l.filter(l=>l.application_metadata.includes("rbd")).map(l=>l.pool_name)}),this.createForm()}purge(){const l=this.purgeForm.getValue("poolName")||"";this.taskWrapper.wrapTaskAroundCall({task:new t.a("rbd/trash/purge",{pool_name:l}),call:this.rbdService.purgeTrash(l)}).subscribe(void 0,()=>{this.purgeForm.setErrors({cdSubmitButton:!0})},()=>{this.modalRef.hide()})}}},XED3:function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("mrSG"),i=e("IheW"),u=e("2Vo4"),s=e("pLZG"),a=e("xTzq"),o=e("lOp/"),r=e("8Y7J"),d=e("pL04");let c=(()=>{let l=class{constructor(l,n){this.http=l,this.timerService=n,this.REFRESH_INTERVAL=3e4,this.summaryDataSource=new u.a(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/block/mirroring/summary")}retrieveSummaryObserver(){return l=>{this.summaryDataSource.next(l)}}subscribeSummary(l,n){return this.summaryData$.pipe(Object(s.a)(l=>!!l)).subscribe(l,n)}getPool(l){return this.http.get("api/block/mirroring/pool/"+l)}updatePool(l,n){return this.http.put("api/block/mirroring/pool/"+l,n,{observe:"response"})}getSiteName(){return this.http.get("api/block/mirroring/site_name")}setSiteName(l){return this.http.put("api/block/mirroring/site_name",{site_name:l},{observe:"response"})}createBootstrapToken(l){return this.http.post(`api/block/mirroring/pool/${l}/bootstrap/token`,{})}importBootstrapToken(l,n,e){return this.http.post(`api/block/mirroring/pool/${l}/bootstrap/peer`,{direction:n,token:e},{observe:"response"})}getPeer(l,n){return this.http.get(`api/block/mirroring/pool/${l}/peer/${n}`)}addPeer(l,n){return this.http.post(`api/block/mirroring/pool/${l}/peer`,n,{observe:"response"})}updatePeer(l,n,e){return this.http.put(`api/block/mirroring/pool/${l}/peer/${n}`,e,{observe:"response"})}deletePeer(l,n){return this.http.delete(`api/block/mirroring/pool/${l}/peer/${n}`,{observe:"response"})}};return l.ngInjectableDef=r["ɵɵdefineInjectable"]({factory:function(){return new l(r["ɵɵinject"](i.c),r["ɵɵinject"](o.a))},token:l,providedIn:d.a}),t.__decorate([t.__param(0,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[String]),t.__metadata("design:returntype",void 0)],l.prototype,"setSiteName",null),t.__decorate([t.__param(1,a.b),t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[String,String,String]),t.__metadata("design:returntype",void 0)],l.prototype,"importBootstrapToken",null),l=t.__decorate([a.a,t.__metadata("design:paramtypes",[i.c,o.a])],l),l})()},Z4cD:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),i=e("LvDl"),u=(e("my5R"),e("QFaf"));class s{constructor(l,n){this.modalRef=l,this.iscsiService=n}ngOnInit(){const l={backstore:new t.i(this.imagesSettings[this.image].backstore),lun:new t.i(this.imagesSettings[this.image].lun),wwn:new t.i(this.imagesSettings[this.image].wwn)};i.forEach(this.backstores,n=>{const e=this.imagesSettings[this.image][n]||{};i.forIn(this.disk_default_controls[n],(n,i)=>{l[i]=new t.i(e[i])})}),this.settingsForm=new u.a(l)}getDiskControlLimits(l,n){return this.disk_controls_limits?this.disk_controls_limits[l][n]:{type:"int"}}save(){const l=this.settingsForm.controls.backstore.value,n=this.settingsForm.controls.lun.value,e=this.settingsForm.controls.wwn.value,t={};i.forIn(this.settingsForm.controls,(n,e)=>{""!==n.value&&null!==n.value&&e in this.disk_default_controls[this.settingsForm.value.backstore]&&(t[e]=n.value,i.forEach(this.backstores,t=>{t!==l&&e in(this.imagesSettings[this.image][t]||{})&&(this.imagesSettings[this.image][t][e]=n.value)}))}),this.imagesSettings[this.image].backstore=l,this.imagesSettings[this.image].lun=n,this.imagesSettings[this.image].wwn=e,this.imagesSettings[this.image][l]=t,this.imagesSettings=Object.assign({},this.imagesSettings),this.control.updateValueAndValidity({emitEvent:!1}),this.modalRef.hide()}}},Z5tW:function(l,n,e){"use strict";e.d(n,"a",(function(){return r}));var t=e("cp0P"),i=(e("Ekvf"),e("F83c"),e("0+/T")),u=(e("sne2"),e("oxzT")),s=e("mtw6"),a=e("vCyI"),o=(e("aexS"),e("9nlD"),e("daK0"));class r{constructor(l,n,e,t,i,s,o){this.authStorageService=l,this.rbdService=n,this.poolService=e,this.modalService=t,this.notificationService=i,this.i18n=s,this.actionLabels=o,this.selection=new a.a,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"create",icon:u.a.add,click:()=>this.createModal(),name:this.actionLabels.CREATE},{permission:"delete",icon:u.a.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:this.i18n("Namespace"),prop:"namespace",flexGrow:1},{name:this.i18n("Pool"),prop:"pool",flexGrow:1},{name:this.i18n("Total images"),prop:"num_images",flexGrow:1}],this.refresh()}refresh(){this.poolService.list(["pool_name","type","application_metadata"]).then(l=>{l=l.filter(l=>this.rbdService.isRBDPool(l)&&"replicated"===l.type);const n=[];l.forEach(l=>{n.push(this.rbdService.listNamespaces(l.pool_name))}),n.length>0?Object(t.a)(n).subscribe(n=>{const e=[];for(let t=0;t{e.push({id:`${i}/${l.namespace}`,pool:i,namespace:l.namespace,num_images:l.num_images})})}this.namespaces=e}):this.namespaces=[]})}updateSelection(l){this.selection=l}createModal(){this.modalRef=this.modalService.show(o.a),this.modalRef.content.onSubmit.subscribe(()=>{this.refresh()})}deleteModal(){const l=this.selection.first().pool,n=this.selection.first().namespace;this.modalRef=this.modalService.show(i.a,{initialState:{itemDescription:"Namespace",itemNames:[`${l}/${n}`],submitAction:()=>this.rbdService.deleteNamespace(l,n).subscribe(()=>{this.notificationService.show(s.a.success,this.i18n("Deleted namespace '{{pool}}/{{namespace}}'",{pool:l,namespace:n})),this.modalRef.hide(),this.refresh()},()=>{this.modalRef.content.stopLoadingSpinner()})}})}getDeleteDisableDesc(){const l=this.selection.first();return!l||l.num_images>0&&this.i18n("Namespace contains images")}}},a6qe:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),i=e("LvDl"),u=(e("my5R"),e("QFaf"));class s{constructor(l,n){this.modalRef=l,this.iscsiService=n}ngOnInit(){const l={};i.forIn(this.target_default_controls,(n,e)=>{l[e]=new t.i(this.target_controls.value[e])}),this.settingsForm=new u.a(l)}save(){const l={};i.forIn(this.settingsForm.controls,(n,e)=>{""!==n.value&&null!==n.value&&(l[e]=n.value)}),this.target_controls.setValue(l),this.modalRef.hide()}getTargetControlLimits(l){return this.target_controls_limits?this.target_controls_limits[l]:["Yes","No"].includes(this.target_default_controls[l])?{type:"bool"}:{type:"int"}}}},aAWM:function(l,n,e){"use strict";e("uIqm");var t=e("PhyI");class i{transform(l){return{0:"global",1:"pool",2:"image"}[l]}}e("aXbf"),e("o8EM"),e.d(n,"a",(function(){return u}));class u{constructor(l,n,e){this.formatterService=l,this.rbdConfigurationService=n,this.i18n=e,this.sourceField=t.a,this.typeField=t.b}ngOnInit(){this.poolConfigurationColumns=[{prop:"displayName",name:this.i18n("Name")},{prop:"description",name:this.i18n("Description")},{prop:"name",name:this.i18n("Key")},{prop:"source",name:this.i18n("Source"),cellTemplate:this.configurationSourceTpl,pipe:new i},{prop:"value",name:this.i18n("Value"),cellTemplate:this.configurationValueTpl}]}ngOnChanges(){this.data&&(this.data=this.data.filter(l=>this.rbdConfigurationService.getOptionFields().map(l=>l.name).includes(l.name)))}}},aa9H:function(l,n,e){"use strict";var t=e("s7LF"),i=(e("XED3"),e("QFaf")),u=e("kvvV");e("kn/O");class s{}e.d(n,"a",(function(){return a}));class a{constructor(l,n,e,t){this.modalRef=l,this.i18n=n,this.rbdMirroringService=e,this.taskWrapper=t,this.bsConfig={containerClass:"theme-default"},this.peerExists=!1,this.mirrorModes=[{id:"disabled",name:this.i18n("Disabled")},{id:"pool",name:this.i18n("Pool")},{id:"image",name:this.i18n("Image")}],this.createForm()}createForm(){this.editModeForm=new i.a({mirrorMode:new t.i("",{validators:[t.B.required,this.validateMode.bind(this)]})})}ngOnInit(){this.pattern=""+this.poolName,this.rbdMirroringService.getPool(this.poolName).subscribe(l=>{this.setResponse(l)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.peerExists=!1;const n=l.content_data.pools.find(l=>this.poolName===l.name);this.peerExists=n&&n.peer_uuids.length})}ngOnDestroy(){this.subs.unsubscribe()}validateMode(l){return"disabled"===l.value&&this.peerExists?{cannotDisable:{value:l.value}}:null}setResponse(l){this.editModeForm.get("mirrorMode").setValue(l.mirror_mode)}update(){const l=new s;l.mirror_mode=this.editModeForm.getValue("mirrorMode"),this.taskWrapper.wrapTaskAroundCall({task:new u.a("rbd/mirroring/pool/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePool(this.poolName,l)}).subscribe(void 0,()=>this.editModeForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},bUo2:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("gp3X"),u=e("sb0X"),s=e("EEJc"),a=e("ajRT"),o=e("s7LF"),r=e("+gVj"),d=e("mXUL"),c=e("ANnk"),m=e("f/UV"),p=e("aexS"),h=e("SVse"),g=e("D4zM"),f=e("OcYo"),v=e("EApP"),b=e("GiVz"),C=e("KVJa"),S=e("Z21x"),_=e("sne2"),R=e("Sofw"),y=e("LqlI"),w=e("my5R"),k=e("9nlD");e.d(n,"a",(function(){return A}));var I=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'."]))],null,null)}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'."]))],null,null)}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submitAction()&&t),t}),i.b,i.a)),t["ɵdid"](1,114688,null,0,u.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Submit"]))],(function(l,n){l(n,1,0,n.component.discoveryForm)}),null)}function B(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,106,"cd-modal",[],null,null,null,s.c,s.b)),t["ɵdid"](1,49152,null,0,a.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Discovery Authentication"])),(l()(),t["ɵeld"](4,0,null,1,102,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,101,"form",[["name","discoveryForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,o.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,o.d,null,[o.l]),t["ɵdid"](9,16384,null,0,o.s,[[4,o.d]],null,null),t["ɵdid"](10,16384,null,0,r.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,89,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](13,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User"])),(l()(),t["ɵeld"](18,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,7,"input",[["autocomplete","off"],["class","form-control"],["formControlName","user"],["id","user"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,20)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,20).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,20)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,20)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](20,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](22,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](24,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](25,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](26,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](28,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,N)),t["ɵdid"](30,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](31,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](32,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](35,0,null,0,1,"label",[["class","cd-col-form-label"],["for","password"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Password"])),(l()(),t["ɵeld"](37,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](38,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](39,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,40)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,40).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,40)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,40)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](40,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](42,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](44,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](45,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](46,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](47,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](48,0,null,null,1,"button",[["cdPasswordButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var i=!0;return"click"===n&&(i=!1!==t["ɵnov"](l,49).onClick()&&i),i}),null,null)),t["ɵdid"](49,81920,null,0,g.a,[t.ElementRef,t.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),t["ɵeld"](50,0,null,null,1,"button",[["cdCopy2ClipboardButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var i=!0;return"click"===n&&(i=!1!==t["ɵnov"](l,51).onClick()&&i),i}),null,null)),t["ɵdid"](51,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](53,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](55,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](56,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](57,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](60,0,null,0,2,"label",[["class","cd-col-form-label"],["for","mutual_user"]],null,null,null,null,null)),(l()(),t["ɵeld"](61,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mutual User"])),(l()(),t["ɵeld"](63,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](64,0,null,null,7,"input",[["autocomplete","off"],["class","form-control"],["formControlName","mutual_user"],["id","mutual_user"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,65)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,65).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,65)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,65)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](65,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](67,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](69,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](70,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](71,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,T)),t["ɵdid"](73,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,D)),t["ɵdid"](75,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](76,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](77,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](80,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mutual_password"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mutual Password"])),(l()(),t["ɵeld"](82,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](83,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](84,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","mutual_password"],["id","mutual_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,85)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,85).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,85)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,85)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](85,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](87,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](89,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](90,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](91,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](92,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](93,0,null,null,1,"button",[["cdPasswordButton","mutual_password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var i=!0;return"click"===n&&(i=!1!==t["ɵnov"](l,94).onClick()&&i),i}),null,null)),t["ɵdid"](94,81920,null,0,g.a,[t.ElementRef,t.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),t["ɵeld"](95,0,null,null,1,"button",[["cdCopy2ClipboardButton","mutual_password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var i=!0;return"click"===n&&(i=!1!==t["ɵnov"](l,96).onClick()&&i),i}),null,null)),t["ɵdid"](96,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,P)),t["ɵdid"](98,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,x)),t["ɵdid"](100,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](101,0,null,null,5,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](102,0,null,null,4,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,q)),t["ɵdid"](104,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](105,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,C.b,C.a)),t["ɵdid"](106,49152,null,0,S.a,[h.Location,_.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.bsModalRef),l(n,7,0,e.discoveryForm),l(n,10,0,e.discoveryForm),l(n,13,0),l(n,22,0,"user"),l(n,26,0,"user"),l(n,28,0,e.discoveryForm.showError("user",t["ɵnov"](n,7),"required")),l(n,30,0,e.discoveryForm.showError("user",t["ɵnov"](n,7),"pattern")),l(n,32,0),l(n,42,0,"password"),l(n,46,0,"password"),l(n,49,0,"password"),l(n,51,0,"password"),l(n,53,0,e.discoveryForm.showError("password",t["ɵnov"](n,7),"required")),l(n,55,0,e.discoveryForm.showError("password",t["ɵnov"](n,7),"pattern")),l(n,57,0),l(n,67,0,"mutual_user"),l(n,71,0,"mutual_user"),l(n,73,0,e.discoveryForm.showError("mutual_user",t["ɵnov"](n,7),"required")),l(n,75,0,e.discoveryForm.showError("mutual_user",t["ɵnov"](n,7),"pattern")),l(n,77,0),l(n,87,0,"mutual_password"),l(n,91,0,"mutual_password"),l(n,94,0,"mutual_password"),l(n,96,0,"mutual_password"),l(n,98,0,e.discoveryForm.showError("mutual_password",t["ɵnov"](n,7),"required")),l(n,100,0,e.discoveryForm.showError("mutual_password",t["ɵnov"](n,7),"pattern")),l(n,104,0,e.hasPermission),l(n,106,0,"Cancel",e.bsModalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,12,0,t["ɵnov"](n,13).hasErrors,t["ɵnov"](n,13).hasSuccess),l(n,19,0,t["ɵnov"](n,24).ngClassUntouched,t["ɵnov"](n,24).ngClassTouched,t["ɵnov"](n,24).ngClassPristine,t["ɵnov"](n,24).ngClassDirty,t["ɵnov"](n,24).ngClassValid,t["ɵnov"](n,24).ngClassInvalid,t["ɵnov"](n,24).ngClassPending,t["ɵnov"](n,26).validClass,t["ɵnov"](n,26).invalidClass),l(n,31,0,t["ɵnov"](n,32).hasErrors,t["ɵnov"](n,32).hasSuccess),l(n,39,0,t["ɵnov"](n,44).ngClassUntouched,t["ɵnov"](n,44).ngClassTouched,t["ɵnov"](n,44).ngClassPristine,t["ɵnov"](n,44).ngClassDirty,t["ɵnov"](n,44).ngClassValid,t["ɵnov"](n,44).ngClassInvalid,t["ɵnov"](n,44).ngClassPending,t["ɵnov"](n,46).validClass,t["ɵnov"](n,46).invalidClass),l(n,56,0,t["ɵnov"](n,57).hasErrors,t["ɵnov"](n,57).hasSuccess),l(n,64,0,t["ɵnov"](n,69).ngClassUntouched,t["ɵnov"](n,69).ngClassTouched,t["ɵnov"](n,69).ngClassPristine,t["ɵnov"](n,69).ngClassDirty,t["ɵnov"](n,69).ngClassValid,t["ɵnov"](n,69).ngClassInvalid,t["ɵnov"](n,69).ngClassPending,t["ɵnov"](n,71).validClass,t["ɵnov"](n,71).invalidClass),l(n,76,0,t["ɵnov"](n,77).hasErrors,t["ɵnov"](n,77).hasSuccess),l(n,84,0,t["ɵnov"](n,89).ngClassUntouched,t["ɵnov"](n,89).ngClassTouched,t["ɵnov"](n,89).ngClassPristine,t["ɵnov"](n,89).ngClassDirty,t["ɵnov"](n,89).ngClassValid,t["ɵnov"](n,89).ngClassInvalid,t["ɵnov"](n,89).ngClassPending,t["ɵnov"](n,91).validClass,t["ɵnov"](n,91).invalidClass)}))}function O(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-discovery-modal",[],null,null,null,B,I)),t["ɵdid"](1,114688,null,0,R.a,[p.a,y.a,w.a,k.a,b.a],null,null)],(function(l,n){l(n,1,0)}),null)}var A=t["ɵccf"]("cd-iscsi-target-discovery-modal",R.a,O,{},{},[])},chpi:function(l,n,e){"use strict";e.d(n,"a",(function(){return h}));var t=e("LvDl"),i=e("wd/R"),u=(e("F83c"),e("0+/T")),s=(e("sne2"),e("uIqm"),e("x38r")),a=e("oxzT"),o=e("yJti"),r=e("vCyI"),d=e("kvvV"),c=e("jVDg"),m=(e("a0VL"),e("aexS"),e("VTlA"),e("kn/O"),e("WxU5")),p=e("2GqK");class h{constructor(l,n,e,t,i,u,s,o){this.authStorageService=l,this.rbdService=n,this.modalService=e,this.cdDatePipe=t,this.taskListService=i,this.taskWrapper=u,this.i18n=s,this.actionLabels=o,this.icons=a.a,this.executingTasks=[],this.selection=new r.a,this.disablePurgeBtn=!0,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"update",icon:a.a.undo,click:()=>this.restoreModal(),name:this.actionLabels.RESTORE},{permission:"delete",icon:a.a.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:this.i18n("ID"),prop:"id",flexGrow:1,cellTransformation:s.a.executing},{name:this.i18n("Name"),prop:"name",flexGrow:1},{name:this.i18n("Pool"),prop:"pool_name",flexGrow:1},{name:this.i18n("Namespace"),prop:"namespace",flexGrow:1},{name:this.i18n("Status"),prop:"deferment_end_time",flexGrow:1,cellTemplate:this.expiresTpl},{name:this.i18n("Deleted At"),prop:"deletion_time",flexGrow:1,pipe:this.cdDatePipe}],this.taskListService.init(()=>this.rbdService.listTrash(),l=>this.prepareResponse(l),l=>this.images=l,()=>this.onFetchError(),l=>["rbd/trash/remove","rbd/trash/restore"].includes(l.name),(l,n)=>new c.a(l.pool_name,l.namespace,l.id).toString()===n.metadata.image_id_spec,void 0)}prepareResponse(l){let n=[];const e={};l.forEach(l=>{t.isUndefined(e[l.status])&&(e[l.status]=[]),e[l.status].push(l.pool_name),n=n.concat(l.value),this.disablePurgeBtn=!n.length});const u=[];return t.forEach(e,(l,n)=>{u.push({status:parseInt(n,10),statusFor:(l.length>1?"pools ":"pool ")+""+l.join(", ")+""})}),this.viewCacheStatusList=u,n.forEach(l=>{l.cdIsExpired=i().isAfter(l.deferment_end_time)}),n}onFetchError(){this.table.reset(),this.viewCacheStatusList=[{status:o.a.ValueException}]}updateSelection(l){this.selection=l}restoreModal(){const l={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,imageId:this.selection.first().id};this.modalRef=this.modalService.show(p.a,{initialState:l})}deleteModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().id,t=this.selection.first().deferment_end_time,i=new c.a(l,n,e);this.modalRef=this.modalService.show(u.a,{initialState:{itemDescription:"RBD",itemNames:[i],bodyTemplate:this.deleteTpl,bodyContext:{$implicit:t},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new d.a("rbd/trash/remove",{image_id_spec:i.toString()}),call:this.rbdService.removeTrash(i,!0)})}})}isExpired(l){return i().isAfter(l)}purgeModal(){this.modalService.show(m.a)}}},cxJu:function(l,n,e){"use strict";e.d(n,"a",(function(){return r}));var t=e("quSY"),i=(e("XED3"),e("oxzT")),u=e("vCyI"),s=(e("aexS"),e("SuaG")),a=e("+26A"),o=e("puGn");class r{constructor(l,n,e,s){this.authStorageService=l,this.rbdMirroringService=n,this.modalService=e,this.i18n=s,this.selection=new u.a,this.peersExist=!0,this.subs=new t.a,this.permission=this.authStorageService.getPermissions().rbdMirroring;const a={permission:"update",icon:i.a.edit,click:()=>this.editSiteNameModal(),name:this.i18n("Edit Site Name"),canBePrimary:()=>!0,disable:()=>!1},o={permission:"update",icon:i.a.upload,click:()=>this.createBootstrapModal(),name:this.i18n("Create Bootstrap Token"),disable:()=>!1},r={permission:"update",icon:i.a.download,click:()=>this.importBootstrapModal(),name:this.i18n("Import Bootstrap Token"),disable:()=>this.peersExist};this.tableActions=[a,o,r]}ngOnInit(){this.subs.add(this.rbdMirroringService.startPolling()),this.subs.add(this.rbdMirroringService.subscribeSummary(l=>{this.status=l.content_data.status,this.siteName=l.site_name,this.peersExist=!!l.content_data.pools.find(l=>l.peer_uuids.length>0)}))}ngOnDestroy(){this.subs.unsubscribe()}editSiteNameModal(){this.modalRef=this.modalService.show(o.a,{initialState:{siteName:this.siteName}})}createBootstrapModal(){this.modalRef=this.modalService.show(s.a,{initialState:{siteName:this.siteName}})}importBootstrapModal(){this.modalRef=this.modalService.show(a.a,{initialState:{siteName:this.siteName}})}}},daK0:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("s7LF"),i=e("XNiG"),u=(e("Ekvf"),e("F83c"),e("mtw6")),s=e("QFaf"),a=e("kvvV");e("aexS"),e("9nlD");class o{constructor(l,n,e,t,i,u){this.modalRef=l,this.authStorageService=n,this.notificationService=e,this.poolService=t,this.rbdService=i,this.i18n=u,this.pools=null,this.editing=!1,this.poolPermission=this.authStorageService.getPermissions().pool,this.createForm()}createForm(){this.namespaceForm=new s.a({pool:new t.i(""),namespace:new t.i("")},this.validator(),this.asyncValidator())}validator(){return l=>{const n=l.get("pool"),e=l.get("namespace");let t=null;n.value||(t={required:!0}),n.setErrors(t);let i=null;return e.value||(i={required:!0}),e.setErrors(i),null}}asyncValidator(){return l=>new Promise(n=>{const e=l.get("pool"),t=l.get("namespace");this.rbdService.listNamespaces(e.value).subscribe(l=>{if(l.some(l=>l.namespace===t.value)){const l={namespaceExists:!0};t.setErrors(l),n(l)}else n(null)})})}ngOnInit(){this.onSubmit=new i.a,this.poolPermission.read&&this.poolService.list(["pool_name","type","application_metadata"]).then(l=>{const n=[];for(const e of l)this.rbdService.isRBDPool(e)&&"replicated"===e.type&&n.push(e);if(this.pools=n,1===this.pools.length){const l=this.pools[0].pool_name;this.namespaceForm.get("pool").setValue(l)}})}submit(){const l=this.namespaceForm.getValue("pool"),n=this.namespaceForm.getValue("namespace"),e=new a.a;e.name="rbd/namespace/create",e.metadata={pool:l,namespace:n},this.rbdService.createNamespace(l,n).toPromise().then(()=>{this.notificationService.show(u.a.success,this.i18n("Created namespace '{{pool}}/{{namespace}}'",{pool:l,namespace:n})),this.modalRef.hide(),this.onSubmit.next()}).catch(()=>{this.namespaceForm.setErrors({cdSubmitButton:!0})})}}},"e/kN":function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("LvDl"),i=(e("my5R"),e("+fVR")),u=e("0+/T"),s=(e("sne2"),e("uIqm"),e("x38r")),a=e("oxzT"),o=e("vCyI"),r=e("kvvV"),d=(e("FFMq"),e("G1/K"),e("aexS"),e("VTlA"),e("kn/O"),e("Sofw"));class c extends i.a{constructor(l,n,e,t,i,u,s,r,d){super(),this.authStorageService=l,this.i18n=n,this.iscsiService=e,this.joinPipe=t,this.taskListService=i,this.notAvailablePipe=u,this.modalService=s,this.taskWrapper=r,this.actionLabels=d,this.available=void 0,this.selection=new o.a,this.targets=[],this.icons=a.a,this.builders={"iscsi/target/create":l=>({target_iqn:l.target_iqn})},this.permission=this.authStorageService.getPermissions().iscsi,this.tableActions=[{permission:"create",icon:a.a.add,routerLink:()=>"/block/iscsi/targets/create",name:this.actionLabels.CREATE},{permission:"update",icon:a.a.edit,routerLink:()=>"/block/iscsi/targets/edit/"+this.selection.first().target_iqn,name:this.actionLabels.EDIT,disable:()=>this.getEditDisableDesc()},{permission:"delete",icon:a.a.destroy,click:()=>this.deleteIscsiTargetModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:this.i18n("Target"),prop:"target_iqn",flexGrow:2,cellTransformation:s.a.executing},{name:this.i18n("Portals"),prop:"cdPortals",pipe:this.joinPipe,flexGrow:2},{name:this.i18n("Images"),prop:"cdImages",pipe:this.joinPipe,flexGrow:2},{name:this.i18n("# Sessions"),prop:"info.num_sessions",pipe:this.notAvailablePipe,flexGrow:1}],this.iscsiService.status().subscribe(l=>{this.available=l.available,l.available?(this.iscsiService.version().subscribe(l=>{this.cephIscsiConfigVersion=l.ceph_iscsi_config_version,this.taskListService.init(()=>this.iscsiService.listTargets(),l=>this.prepareResponse(l),l=>this.targets=l,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders)}),this.iscsiService.settings().subscribe(l=>{this.settings=l})):this.status=l.message})}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}getEditDisableDesc(){const l=this.selection.first();return l&&l.cdExecuting?l.cdExecuting:l&&t.isUndefined(l.info)?this.i18n("Unavailable gateway(s)"):!l}getDeleteDisableDesc(){const l=this.selection.first();return l&&l.cdExecuting?l.cdExecuting:l&&t.isUndefined(l.info)?this.i18n("Unavailable gateway(s)"):l&&l.info&&l.info.num_sessions?this.i18n("Target has active sessions"):!l}prepareResponse(l){return l.forEach(l=>{l.cdPortals=l.portals.map(l=>`${l.host}:${l.ip}`),l.cdImages=l.disks.map(l=>`${l.pool}/${l.image}`)}),l}onFetchError(){this.table.reset()}itemFilter(l,n){return l.target_iqn===n.metadata.target_iqn}taskFilter(l){return["iscsi/target/create","iscsi/target/edit","iscsi/target/delete"].includes(l.name)}updateSelection(l){this.selection=l}deleteIscsiTargetModal(){const l=this.selection.first().target_iqn;this.modalRef=this.modalService.show(u.a,{initialState:{itemDescription:this.i18n("iSCSI target"),itemNames:[l],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new r.a("iscsi/target/delete",{target_iqn:l}),call:this.iscsiService.deleteTarget(l)})}})}configureDiscoveryAuth(){this.modalService.show(d.a,{})}}},eF8U:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("mXUL");e("jMP8"),e.d(n,"a",(function(){return c})),e.d(n,"b",(function(){return S}));var c=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function m(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function p(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,12,"select",[["class","form-control custom-select"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](8,0,null,null,2,"option",[],null,null,null,null,null)),t["ɵdid"](9,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](10,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,m)),t["ɵdid"](12,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.setting),l(n,7,0,e.setting),l(n,9,0,null),l(n,10,0,null),l(n,12,0,e.limits.values)}),(function(l,n){var e=n.component;l(n,0,1,[t["ɵinlineInterpolate"](1,"",e.setting,""),t["ɵinlineInterpolate"](1,"",e.setting,""),t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass])}))}function h(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,8,"input",[["class","form-control"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,1)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==t["ɵnov"](l,2).onChange(e.target.value)&&i),"input"===n&&(i=!1!==t["ɵnov"](l,2).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,2).onTouched()&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵdid"](2,16384,null,0,i.w,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),t["ɵdid"](4,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](6,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](7,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.setting),l(n,8,0,e.setting)}),(function(l,n){l(n,0,0,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass)}))}function g(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,1)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.setting),l(n,7,0,e.setting)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,25,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,0,"br",[],null,null,null,null,null)),(l()(),t["ɵeld"](2,0,null,null,11,"div",[["class","custom-control custom-radio custom-control-inline"]],null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,8,"input",[["class","custom-control-input"],["type","radio"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,4)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,4).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,4)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,4)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==t["ɵnov"](l,5).onChange()&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,5).onTouched()&&i),i}),null,null)),t["ɵdid"](4,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵdid"](5,212992,null,0,i.x,[t.Renderer2,t.ElementRef,i.D,t.Injector],{formControlName:[0,"formControlName"],value:[1,"value"]},null),t["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.x]),t["ɵdid"](7,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](9,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](10,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](11,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](12,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](-1,null,["Yes"])),(l()(),t["ɵeld"](14,0,null,null,11,"div",[["class","custom-control custom-radio custom-control-inline"]],null,null,null,null,null)),(l()(),t["ɵeld"](15,0,null,null,8,"input",[["class","custom-control-input"],["type","radio"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,16)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,16).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,16)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,16)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==t["ɵnov"](l,17).onChange()&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,17).onTouched()&&i),i}),null,null)),t["ɵdid"](16,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵdid"](17,212992,null,0,i.x,[t.Renderer2,t.ElementRef,i.D,t.Injector],{formControlName:[0,"formControlName"],value:[1,"value"]},null),t["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.x]),t["ɵdid"](19,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](21,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](22,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](23,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](24,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](-1,null,["No"]))],(function(l,n){var e=n.component;l(n,5,0,e.setting,!0),l(n,7,0,e.setting),l(n,11,0,e.setting),l(n,17,0,e.setting,!1),l(n,19,0,e.setting),l(n,23,0,e.setting)}),(function(l,n){var e=n.component;l(n,3,0,e.setting+"True",t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending,t["ɵnov"](n,11).validClass,t["ɵnov"](n,11).invalidClass),l(n,12,0,e.setting+"True"),l(n,15,0,e.setting+"False",t["ɵnov"](n,21).ngClassUntouched,t["ɵnov"](n,21).ngClassTouched,t["ɵnov"](n,21).ngClassPristine,t["ɵnov"](n,21).ngClassDirty,t["ɵnov"](n,21).ngClassValid,t["ɵnov"](n,21).ngClassInvalid,t["ɵnov"](n,21).ngClassPending,t["ɵnov"](n,23).validClass,t["ɵnov"](n,23).invalidClass),l(n,24,0,e.setting+"False")}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"span",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,h)),t["ɵdid"](2,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,g)),t["ɵdid"](4,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,f)),t["ɵdid"](6,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0,"int"===e.limits.type),l(n,4,0,"str"===e.limits.type),l(n,6,0,"bool"===e.limits.type)}),null)}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](2,null,["Must be greater than or equal to ","."]))],null,(function(l,n){l(n,2,0,n.component.limits.min)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](2,null,["Must be less than or equal to ","."]))],null,(function(l,n){l(n,2,0,n.component.limits.max)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,17,"div",[["class","form-group"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,1).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,1).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,4).onSubmit()&&i),i}),d.b,d.a)),t["ɵdid"](1,540672,null,0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](3,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](4,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),t["ɵdid"](5,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](8,0,null,0,1,"label",[["class","col-form-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](9,null,["",""])),(l()(),t["ɵand"](16777216,null,0,1,null,p)),t["ɵdid"](11,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,v)),t["ɵdid"](13,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,b)),t["ɵdid"](15,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,C)),t["ɵdid"](17,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.settingsForm),l(n,4,0,e.settingsForm),l(n,5,0),l(n,11,0,"enum"===e.limits.type),l(n,13,0,"enum"!==e.limits.type),l(n,15,0,e.settingsForm.showError(e.setting,e.formDir,"min")),l(n,17,0,e.settingsForm.showError(e.setting,e.formDir,"max"))}),(function(l,n){var e=n.component;l(n,0,0,t["ɵnov"](n,3).ngClassUntouched,t["ɵnov"](n,3).ngClassTouched,t["ɵnov"](n,3).ngClassPristine,t["ɵnov"](n,3).ngClassDirty,t["ɵnov"](n,3).ngClassValid,t["ɵnov"](n,3).ngClassInvalid,t["ɵnov"](n,3).ngClassPending,t["ɵnov"](n,5).hasErrors,t["ɵnov"](n,5).hasSuccess),l(n,8,0,t["ɵinlineInterpolate"](1,"",e.setting,"")),l(n,9,0,e.setting)}))}},gr3l:function(l,n,e){"use strict";e.d(n,"a",(function(){return h}));var t=e("s7LF"),i=e("LvDl"),u=e("cp0P"),s=(e("my5R"),e("F83c"),e("DNAf")),a=e("a96k"),o=(e("sne2"),e("oxzT")),r=e("QFaf"),d=e("1Ni5"),c=e("kvvV"),m=(e("kn/O"),e("Z4cD")),p=e("a6qe");class h{constructor(l,n,e,t,i,u,a,r){this.iscsiService=l,this.modalService=n,this.rbdService=e,this.router=t,this.route=i,this.i18n=u,this.taskWrapper=a,this.actionLabels=r,this.api_version=0,this.minimum_gateways=1,this.icons=o.a,this.isEdit=!1,this.portalsSelections=[],this.imagesInitiatorSelections=[],this.groupDiskSelections=[],this.groupMembersSelections=[],this.imagesSettings={},this.messages={portals:new s.a({noOptions:this.i18n("There are no portals available.")},this.i18n),images:new s.a({noOptions:this.i18n("There are no images available.")},this.i18n),initiatorImage:new s.a({noOptions:this.i18n("There are no images available. Please make sure you add an image to the target.")},this.i18n),groupInitiator:new s.a({noOptions:this.i18n("There are no initiators available. Please make sure you add an initiator to the target.")},this.i18n)},this.IQN_REGEX=/^iqn\.(19|20)\d\d-(0[1-9]|1[0-2])\.\D{2,3}(\.[A-Za-z0-9-]+)+(:[A-Za-z0-9-\.]+)*$/,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.resource=this.i18n("target")}ngOnInit(){const l=[this.iscsiService.listTargets(),this.rbdService.list(),this.iscsiService.portals(),this.iscsiService.settings(),this.iscsiService.version()];this.router.url.startsWith("/block/iscsi/targets/edit")&&(this.isEdit=!0,this.route.params.subscribe(n=>{this.target_iqn=decodeURIComponent(n.target_iqn),l.push(this.iscsiService.getTarget(this.target_iqn))})),this.action=this.isEdit?this.actionLabels.EDIT:this.actionLabels.CREATE,Object(u.a)(l).subscribe(l=>{const n=i(l[0]).filter(l=>l.target_iqn!==this.target_iqn).flatMap(l=>l.disks).map(l=>`${l.pool}/${l.image}`).value();"api_version"in l[3]&&(this.api_version=l[3].api_version),this.minimum_gateways=l[3].config.minimum_gateways,this.target_default_controls=l[3].target_default_controls,this.target_controls_limits=l[3].target_controls_limits,this.disk_default_controls=l[3].disk_default_controls,this.disk_controls_limits=l[3].disk_controls_limits,this.backstores=l[3].backstores,this.default_backstore=l[3].default_backstore,this.unsupported_rbd_features=l[3].unsupported_rbd_features,this.required_rbd_features=l[3].required_rbd_features,this.imagesAll=i(l[1]).flatMap(l=>l.value).filter(l=>!l.namespace&&-1===n.indexOf(`${l.pool_name}/${l.name}`)&&0!==this.getValidBackstores(l).length).value(),this.imagesSelections=this.imagesAll.map(l=>new a.a(!1,`${l.pool_name}/${l.name}`,""));const e=[];l[2].forEach(l=>{l.ip_addresses.forEach(n=>{e.push(new a.a(!1,l.name+":"+n,""))})}),this.portalsSelections=[...e],this.cephIscsiConfigVersion=l[4].ceph_iscsi_config_version,this.createForm(),l[5]&&this.resolveModel(l[5])})}createForm(){if(this.targetForm=new r.a({target_iqn:new t.i("iqn.2001-07.com.ceph:"+Date.now(),{validators:[t.B.required,t.B.pattern(this.IQN_REGEX)]}),target_controls:new t.i({}),portals:new t.i([],{validators:[d.a.custom("minGateways",l=>i.uniq(l.map(l=>l.split(":")[0])).length{const n=this.getLunIds(l);return n.length!==i.uniq(n).length}),d.a.custom("dupWwn",l=>{const n=this.getWwns(l);return n.length!==i.uniq(n).length})]}),initiators:new t.f([]),groups:new t.f([]),acl_enabled:new t.i(!1)}),this.cephIscsiConfigVersion>10){const l=new r.a({user:new t.i(""),password:new t.i(""),mutual_user:new t.i(""),mutual_password:new t.i("")});this.setAuthValidator(l),this.targetForm.addControl("auth",l)}}resolveModel(l){this.targetForm.patchValue({target_iqn:l.target_iqn,target_controls:l.target_controls,acl_enabled:l.acl_enabled}),this.cephIscsiConfigVersion>10&&this.targetForm.patchValue({auth:l.auth});const n=[];i.forEach(l.portals,l=>{n.push(`${l.host}:${l.ip}`)}),this.targetForm.patchValue({portals:n});const e=[];i.forEach(l.disks,l=>{const n=`${l.pool}/${l.image}`;e.push(n),this.imagesSettings[n]={backstore:l.backstore},this.imagesSettings[n][l.backstore]=l.controls,"lun"in l&&(this.imagesSettings[n].lun=l.lun),"wwn"in l&&(this.imagesSettings[n].wwn=l.wwn),this.onImageSelection({option:{name:n,selected:!0}})}),this.targetForm.patchValue({disks:e}),i.forEach(l.clients,l=>{const n=this.addInitiator();l.luns=i.map(l.luns,l=>`${l.pool}/${l.image}`),n.patchValue(l)}),i.forEach(l.groups,l=>{const n=this.addGroup();l.disks=i.map(l.disks,l=>`${l.pool}/${l.image}`),n.patchValue(l),i.forEach(l.members,l=>{this.onGroupMemberSelection({option:new a.a(!0,l,"")})})})}hasAdvancedSettings(l){return Object.values(l).length>0}get portals(){return this.targetForm.get("portals")}onPortalSelection(){this.portals.setValue(this.portals.value)}removePortal(l,n){return this.portalsSelections.forEach(l=>{l.name===n&&(l.selected=!1)}),this.portals.value.splice(l,1),this.portals.setValue(this.portals.value),!1}get disks(){return this.targetForm.get("disks")}removeImage(l,n){return this.imagesSelections.forEach(l=>{l.name===n&&(l.selected=!1)}),this.disks.value.splice(l,1),this.removeImageRefs(n),this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1}),!1}removeImageRefs(l){this.initiators.controls.forEach(n=>{const e=n.value.luns.filter(n=>n!==l);n.get("luns").setValue(e)}),this.groups.controls.forEach(n=>{const e=n.value.disks.filter(n=>n!==l);n.get("disks").setValue(e)}),i.forEach(this.imagesInitiatorSelections,(n,e)=>{this.imagesInitiatorSelections[e]=n.filter(n=>n.name!==l)}),i.forEach(this.groupDiskSelections,(n,e)=>{this.groupDiskSelections[e]=n.filter(n=>n.name!==l)})}getDefaultBackstore(l){let n=this.default_backstore;const e=this.getImageById(l);return this.validFeatures(e,this.default_backstore)||this.backstores.forEach(l=>{l!==this.default_backstore&&this.validFeatures(e,l)&&(n=l)}),n}isLunIdInUse(l,n){const e=this.disks.value.filter(l=>l!==n);return this.getLunIds(e).includes(l)}getLunIds(l){return i.map(l,l=>this.imagesSettings[l].lun)}nextLunId(l){const n=this.disks.value.filter(n=>n!==l),e=this.getLunIds(n);let t=0;for(;e.includes(t);)t++;return t}getWwns(l){return i.map(l,l=>this.imagesSettings[l].wwn).filter(l=>i.isString(l)&&""!==l)}onImageSelection(l){const n=l.option;if(n.selected){if(this.imagesSettings[n.name])this.isLunIdInUse(this.imagesSettings[n.name].lun,n.name)&&(this.imagesSettings[n.name].lun=this.nextLunId(n.name));else{const l=this.getDefaultBackstore(n.name);this.imagesSettings[n.name]={backstore:l,lun:this.nextLunId(n.name)},this.imagesSettings[n.name][l]={}}i.forEach(this.imagesInitiatorSelections,(l,e)=>{l.push(new a.a(!1,n.name,"")),this.imagesInitiatorSelections[e]=[...l]}),i.forEach(this.groupDiskSelections,(l,e)=>{l.push(new a.a(!1,n.name,"")),this.groupDiskSelections[e]=[...l]})}else this.removeImageRefs(n.name);this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1})}get initiators(){return this.targetForm.get("initiators")}addInitiator(){const l=new r.a({client_iqn:new t.i("",{validators:[t.B.required,d.a.custom("notUnique",l=>{const n=this.initiators.controls.reduce((function(l,n){return l.concat(n.value.client_iqn)}),[]);return n.indexOf(l)!==n.lastIndexOf(l)}),t.B.pattern(this.IQN_REGEX)]}),auth:new r.a({user:new t.i(""),password:new t.i(""),mutual_user:new t.i(""),mutual_password:new t.i("")}),luns:new t.i([]),cdIsInGroup:new t.i(!1)});this.setAuthValidator(l),this.initiators.push(l),i.forEach(this.groupMembersSelections,(l,n)=>{l.push(new a.a(!1,"","")),this.groupMembersSelections[n]=[...l]});const n=i.map(this.targetForm.getValue("disks"),l=>new a.a(!1,l,""));return this.imagesInitiatorSelections.push(n),l}setAuthValidator(l){d.a.validateIf(l.get("user"),()=>l.getValue("password")||l.getValue("mutual_user")||l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[l.get("password"),l.get("mutual_user"),l.get("mutual_password")]),d.a.validateIf(l.get("password"),()=>l.getValue("user")||l.getValue("mutual_user")||l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[l.get("user"),l.get("mutual_user"),l.get("mutual_password")]),d.a.validateIf(l.get("mutual_user"),()=>l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[l.get("user"),l.get("password"),l.get("mutual_password")]),d.a.validateIf(l.get("mutual_password"),()=>l.getValue("mutual_user"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[l.get("user"),l.get("password"),l.get("mutual_user")])}removeInitiator(l){const n=this.initiators.value[l];this.initiators.removeAt(l),i.forEach(this.groupMembersSelections,(n,e)=>{n.splice(l,1),this.groupMembersSelections[e]=[...n]}),this.groups.controls.forEach(l=>{const e=l.value.members.filter(l=>l!==n.client_iqn);l.get("members").setValue(e)}),this.imagesInitiatorSelections.splice(l,1)}updatedInitiatorSelector(){this.initiators.controls.forEach(l=>{l.get("client_iqn").updateValueAndValidity({emitEvent:!1})}),i.forEach(this.groupMembersSelections,(l,n)=>{i.forEach(l,(l,n)=>{const e=l.name;l.name=this.initiators.controls[n].value.client_iqn,this.groups.controls.forEach(n=>{const t=n.value.members,i=t.indexOf(e);-1!==i&&(t[i]=l.name),n.get("members").setValue(t)})}),this.groupMembersSelections[n]=[...this.groupMembersSelections[n]]})}removeInitiatorImage(l,n,e,t){const i=l.getValue("luns");return i.splice(n,1),l.patchValue({luns:i}),this.imagesInitiatorSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),!1}get groups(){return this.targetForm.get("groups")}addGroup(){const l=new r.a({group_id:new t.i("",{validators:[t.B.required]}),members:new t.i([]),disks:new t.i([])});this.groups.push(l);const n=i.map(this.targetForm.getValue("disks"),l=>new a.a(!1,l,""));this.groupDiskSelections.push(n);const e=i.map(this.initiators.value,l=>new a.a(!1,l.client_iqn,"",!l.cdIsInGroup));return this.groupMembersSelections.push(e),l}removeGroup(l){this.groups.removeAt(l),this.groupDiskSelections.splice(l,1)}onGroupMemberSelection(l){const n=l.option;let e;this.initiators.controls.forEach((l,t)=>{l.value.client_iqn===n.name&&(l.patchValue({luns:[]}),l.get("cdIsInGroup").setValue(n.selected),e=t)}),i.forEach(this.groupMembersSelections,l=>{l[e].enabled=!n.selected})}removeGroupInitiator(l,n,e){const t=l.getValue("members")[n];l.getValue("members").splice(n,1),this.groupMembersSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),this.groupMembersSelections[e]=[...this.groupMembersSelections[e]],this.onGroupMemberSelection({option:new a.a(!1,t,"")})}removeGroupDisk(l,n,e){const t=l.getValue("disks")[n];l.getValue("disks").splice(n,1),this.groupDiskSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),this.groupDiskSelections[e]=[...this.groupDiskSelections[e]]}submit(){const l=i.cloneDeep(this.targetForm.value),n={target_iqn:this.targetForm.getValue("target_iqn"),target_controls:this.targetForm.getValue("target_controls"),acl_enabled:this.targetForm.getValue("acl_enabled"),portals:[],disks:[],clients:[],groups:[]};if(this.cephIscsiConfigVersion>10){const l=this.targetForm.get("auth");l.getValue("user")||l.get("user").setValue(""),l.getValue("password")||l.get("password").setValue(""),l.getValue("mutual_user")||l.get("mutual_user").setValue(""),l.getValue("mutual_password")||l.get("mutual_password").setValue("");const e=this.targetForm.getValue("acl_enabled");n.auth={user:e?"":l.getValue("user"),password:e?"":l.getValue("password"),mutual_user:e?"":l.getValue("mutual_user"),mutual_password:e?"":l.getValue("mutual_password")}}let e;l.disks.forEach(l=>{const e=l.split("/"),t=this.imagesSettings[l].backstore;n.disks.push({pool:e[0],image:e[1],backstore:t,controls:this.imagesSettings[l][t],lun:this.imagesSettings[l].lun,wwn:this.imagesSettings[l].wwn})}),l.portals.forEach(l=>{const e=l.indexOf(":");n.portals.push({host:l.substring(0,e),ip:l.substring(e+1)})}),n.acl_enabled&&(l.initiators.forEach(l=>{l.auth.user||(l.auth.user=""),l.auth.password||(l.auth.password=""),l.auth.mutual_user||(l.auth.mutual_user=""),l.auth.mutual_password||(l.auth.mutual_password=""),delete l.cdIsInGroup;const n=[];l.luns.forEach(l=>{const e=l.split("/");n.push({pool:e[0],image:e[1]})}),l.luns=n}),n.clients=l.initiators),n.acl_enabled&&(l.groups.forEach(l=>{const n=[];l.disks.forEach(l=>{const e=l.split("/");n.push({pool:e[0],image:e[1]})}),l.disks=n}),n.groups=l.groups),this.isEdit?(n.new_target_iqn=n.target_iqn,n.target_iqn=this.target_iqn,e=this.taskWrapper.wrapTaskAroundCall({task:new c.a("iscsi/target/edit",{target_iqn:n.target_iqn}),call:this.iscsiService.updateTarget(this.target_iqn,n)})):e=this.taskWrapper.wrapTaskAroundCall({task:new c.a("iscsi/target/create",{target_iqn:n.target_iqn}),call:this.iscsiService.createTarget(n)}),e.subscribe(void 0,()=>{this.targetForm.setErrors({cdSubmitButton:!0})},()=>this.router.navigate(["/block/iscsi/targets"]))}targetSettingsModal(){const l={target_controls:this.targetForm.get("target_controls"),target_default_controls:this.target_default_controls,target_controls_limits:this.target_controls_limits};this.modalRef=this.modalService.show(p.a,{initialState:l})}imageSettingsModal(l){const n={imagesSettings:this.imagesSettings,image:l,api_version:this.api_version,disk_default_controls:this.disk_default_controls,disk_controls_limits:this.disk_controls_limits,backstores:this.getValidBackstores(this.getImageById(l)),control:this.targetForm.get("disks")};this.modalRef=this.modalService.show(m.a,{initialState:n})}validFeatures(l,n){const e=l.features,t=this.required_rbd_features[n];return(e&t)===t&&0==(e&this.unsupported_rbd_features[n])}getImageById(l){return this.imagesAll.find(n=>l===`${n.pool_name}/${n.name}`)}getValidBackstores(l){return this.backstores.filter(n=>this.validFeatures(l,n))}}},jMP8:function(l,n,e){"use strict";e.d(n,"a",(function(){return i}));var t=e("s7LF");e("QFaf");class i{ngOnInit(){const l=[];"min"in this.limits&&l.push(t.B.min(this.limits.min)),"max"in this.limits&&l.push(t.B.max(this.limits.max)),this.settingsForm.get(this.setting).setValidators(l)}}},"k/xb":function(l,n,e){"use strict";e.d(n,"a",(function(){return i})),e.d(n,"b",(function(){return S})),e.d(n,"c",(function(){return u})),e.d(n,"d",(function(){return s})),e.d(n,"j",(function(){return a})),e.d(n,"k",(function(){return o})),e.d(n,"l",(function(){return r})),e.d(n,"m",(function(){return d})),e.d(n,"n",(function(){return c})),e.d(n,"o",(function(){return m})),e.d(n,"p",(function(){return p})),e.d(n,"q",(function(){return h})),e.d(n,"e",(function(){return g})),e.d(n,"f",(function(){return f})),e.d(n,"g",(function(){return v})),e.d(n,"h",(function(){return b})),e.d(n,"i",(function(){return C}));var t=e("sne2");e("Vhfg"),e("gr3l"),e("e/kN"),e("roDX"),e("cxJu"),e("MyVl"),e("5GyT"),e("Z5tW"),e("WkyA"),e("chpi");class i{}const u={breadcrumbs:"Images"},s={breadcrumbs:"Namespaces"},a={breadcrumbs:"Trash"},o={breadcrumbs:"Overall Performance"},r={breadcrumbs:t.a.CREATE},d={breadcrumbs:t.a.EDIT},c={breadcrumbs:t.a.CLONE},m={breadcrumbs:t.a.COPY},p={breadcrumbs:t.a.COPY},h={breadcrumbs:"Mirroring"},g={breadcrumbs:"iSCSI"},f={breadcrumbs:"Overview"},v={breadcrumbs:"Targets"},b={breadcrumbs:t.a.CREATE},C={breadcrumbs:t.a.EDIT};class S{}},kccj:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{}},l7Jr:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("mXUL"),u=e("+gVj"),s=e("eF8U"),a=e("jMP8"),o=e("EEJc"),r=e("ajRT"),d=e("s7LF"),c=e("SVse"),m=e("gp3X"),p=e("sb0X"),h=e("KVJa"),g=e("Z21x"),f=e("sne2"),v=e("a6qe"),b=e("LqlI"),C=e("my5R");e.d(n,"a",(function(){return w}));var S=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function _(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,i.b,i.a)),t["ɵdid"](1,1163264,null,2,u.c,[t.ElementRef,u.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,2,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"cd-iscsi-setting",[],null,null,null,s.b,s.a)),t["ɵdid"](6,114688,null,0,a.a,[],{settingsForm:[0,"settingsForm"],formDir:[1,"formDir"],setting:[2,"setting"],limits:[3,"limits"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,6,0,e.settingsForm,t["ɵnov"](n.parent,7),n.context.$implicit.key,e.getTargetControlLimits(n.context.$implicit.key))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess)}))}function R(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,23,"cd-modal",[],null,null,null,o.c,o.b)),t["ɵdid"](1,49152,null,0,r.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Advanced Settings"])),(l()(),t["ɵeld"](4,0,null,1,19,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,18,"form",[["name","settingsForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,d.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,d.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,d.d,null,[d.l]),t["ɵdid"](9,16384,null,0,d.s,[[4,d.d]],null,null),t["ɵdid"](10,16384,null,0,u.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,5,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"p",[["class","alert-warning"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Changing these parameters from their default values is usually not necessary."])),(l()(),t["ɵand"](16777216,null,null,2,null,_)),t["ɵdid"](15,278528,null,0,c.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),t["ɵpid"](0,c.KeyValuePipe,[t.KeyValueDiffers]),(l()(),t["ɵeld"](17,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](18,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.save()&&t),t}),m.b,m.a)),t["ɵdid"](20,114688,null,0,p.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Confirm"])),(l()(),t["ɵeld"](22,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,h.b,h.a)),t["ɵdid"](23,49152,null,0,g.a,[c.Location,f.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.settingsForm),l(n,10,0,e.settingsForm),l(n,15,0,t["ɵunv"](n,15,0,t["ɵnov"](n,16).transform(e.settingsForm.controls))),l(n,20,0,e.settingsForm),l(n,23,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending)}))}function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-iqn-settings-modal",[],null,null,null,R,S)),t["ɵdid"](1,114688,null,0,v.a,[b.a,C.a],null,null)],(function(l,n){l(n,1,0)}),null)}var w=t["ɵccf"]("cd-iscsi-target-iqn-settings-modal",v.a,y,{},{},[])},lArG:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{}},"lz+O":function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("EEJc"),c=e("ajRT"),m=e("mXUL"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("sne2"),b=e("WxU5"),C=e("F83c"),S=e("LqlI"),_=e("2EZI"),R=e("Ekvf"),y=e("kn/O");e.d(n,"a",(function(){return V}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","poolName"],["placeholder","Pool name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,1)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.e,[t.Renderer2,t.ElementRef,[2,i.b]],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,3,0,"poolName"),l(n,7,0,"poolName")}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","poolName"],["id","poolName"],["name","poolName"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,1).onTouched()&&i),i}),null,null)),t["ɵdid"](1,16384,null,0,i.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),t["ɵdid"](3,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](5,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](6,4210688,null,0,u.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,i.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](8,0,null,null,3,"option",[["value",""]],null,null,null,null,null)),t["ɵdid"](9,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{value:[0,"value"]},null),t["ɵdid"](10,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](-1,null,["All"])),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](13,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"poolName"),l(n,7,0,"poolName"),l(n,9,0,""),l(n,10,0,""),l(n,13,0,e.pools)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,41,"cd-modal",[],null,null,null,d.c,d.b)),t["ɵdid"](1,49152,null,0,c.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Purge Trash"])),(l()(),t["ɵeld"](4,0,null,1,37,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,36,"form",[["class","form"],["name","purgeForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,i.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](9,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,23,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To purge, select one or"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["All"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](19,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["pools and click"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](22,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Purge Trash"])),(l()(),t["ɵted"](-1,null,[".  "])),(l()(),t["ɵeld"](25,0,null,null,9,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](26,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","col-form-label mx-auto"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool:"])),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](32,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,E)),t["ɵdid"](34,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](36,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](37,0,null,null,2,"cd-submit-button",[["id","purgeFormButton"]],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.purge()&&t),t}),p.b,p.a)),t["ɵdid"](38,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Purge Trash"])),(l()(),t["ɵeld"](40,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](41,49152,null,0,f.a,[r.Location,v.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.purgeForm),l(n,10,0,e.purgeForm),l(n,26,0),l(n,32,0,!e.poolPermission.read),l(n,34,0,e.poolPermission.read),l(n,38,0,e.purgeForm),l(n,41,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-purge-modal",[],null,null,null,N,w)),t["ɵdid"](1,114688,null,0,b.a,[a.a,C.a,S.a,_.a,R.a,y.a],null,null)],(function(l,n){l(n,1,0)}),null)}var V=t["ɵccf"]("cd-rbd-trash-purge-modal",b.a,F,{},{},[])},my5R:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("mrSG"),i=e("IheW"),u=e("xTzq"),s=e("8Y7J"),a=e("pL04");let o=(()=>{let l=class{constructor(l){this.http=l}listTargets(){return this.http.get("api/iscsi/target")}getTarget(l){return this.http.get("api/iscsi/target/"+l)}updateTarget(l,n){return this.http.put("api/iscsi/target/"+l,n,{observe:"response"})}status(){return this.http.get("ui-api/iscsi/status")}settings(){return this.http.get("ui-api/iscsi/settings")}version(){return this.http.get("ui-api/iscsi/version")}portals(){return this.http.get("ui-api/iscsi/portals")}createTarget(l){return this.http.post("api/iscsi/target",l,{observe:"response"})}deleteTarget(l){return this.http.delete("api/iscsi/target/"+l,{observe:"response"})}getDiscovery(){return this.http.get("api/iscsi/discoveryauth")}updateDiscovery(l){return this.http.put("api/iscsi/discoveryauth",l)}overview(){return this.http.get("ui-api/iscsi/overview")}};return l.ngInjectableDef=s["ɵɵdefineInjectable"]({factory:function(){return new l(s["ɵɵinject"](i.c))},token:l,providedIn:a.a}),l=t.__decorate([u.a,t.__metadata("design:paramtypes",[i.c])],l),l})()},nP0W:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("s7LF"),u=e("EEJc"),s=e("ajRT"),a=e("+gVj"),o=e("mXUL"),r=e("ANnk"),d=e("f/UV"),c=e("aexS"),m=e("SVse"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("sne2"),b=e("aa9H"),C=e("LqlI"),S=e("GiVz"),_=e("XED3"),R=e("kn/O");e.d(n,"a",(function(){return N}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,i.v,[t.ElementRef,t.Renderer2,[2,i.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,i.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.id),l(n,2,0,n.context.$implicit.id)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Peer clusters must be removed prior to disabling mirror."]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,46,"cd-modal",[],null,null,null,u.c,u.b)),t["ɵdid"](1,49152,null,0,s.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit pool mirror mode"])),(l()(),t["ɵeld"](4,0,null,1,42,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,41,"form",[["class","form"],["name","editModeForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,i.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,i.d,null,[i.l]),t["ɵdid"](9,16384,null,0,i.s,[[4,i.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,28,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,8,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,7,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To edit the mirror mode for pool  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](16,null,["",""])),(l()(),t["ɵted"](-1,null,[", select a new mode from the list and click  "])),(l()(),t["ɵeld"](18,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Update"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](21,0,null,null,18,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](22,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](25,0,null,0,2,"label",[["class","col-form-label"],["for","mirrorMode"]],null,null,null,null,null)),(l()(),t["ɵeld"](26,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mode"])),(l()(),t["ɵeld"](28,0,null,0,9,"select",[["class","form-control custom-select"],["formControlName","mirrorMode"],["id","mirrorMode"],["name","mirrorMode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,30).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,30).onTouched()&&i),i}),null,null)),t["ɵdid"](29,4210688,null,0,r.a,[[2,d.a],c.a,t.ElementRef],null,null),t["ɵdid"](30,16384,null,0,i.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),t["ɵdid"](32,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,i.q,null,[i.j]),t["ɵdid"](34,16384,null,0,i.r,[[4,i.q]],null,null),t["ɵdid"](35,16384,null,0,a.h,[[3,i.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,w)),t["ɵdid"](37,278528,null,0,m.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](39,16384,null,0,m.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](40,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](41,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](42,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),p.b,p.a)),t["ɵdid"](43,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Update"])),(l()(),t["ɵeld"](45,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](46,49152,null,0,f.a,[m.Location,v.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.editModeForm),l(n,10,0,e.editModeForm),l(n,22,0),l(n,32,0,"mirrorMode"),l(n,35,0,"mirrorMode"),l(n,37,0,e.mirrorModes),l(n,39,0,e.editModeForm.showError("mirrorMode",t["ɵnov"](n,7),"cannotDisable")),l(n,43,0,e.editModeForm),l(n,46,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,16,0,e.poolName),l(n,21,0,t["ɵnov"](n,22).hasErrors,t["ɵnov"](n,22).hasSuccess),l(n,28,0,t["ɵnov"](n,34).ngClassUntouched,t["ɵnov"](n,34).ngClassTouched,t["ɵnov"](n,34).ngClassPristine,t["ɵnov"](n,34).ngClassDirty,t["ɵnov"](n,34).ngClassValid,t["ɵnov"](n,34).ngClassInvalid,t["ɵnov"](n,34).ngClassPending,t["ɵnov"](n,35).validClass,t["ɵnov"](n,35).invalidClass)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-pool-edit-mode-modal",[],null,null,null,I,y)),t["ɵdid"](1,245760,null,0,b.a,[C.a,S.a,_.a,R.a],null,null)],(function(l,n){l(n,1,0)}),null)}var N=t["ɵccf"]("cd-pool-edit-mode-modal",b.a,E,{},{},[])},nhAp:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("mXUL"),u=e("+gVj"),s=e("s7LF"),a=e("ANnk"),o=e("f/UV"),r=e("aexS"),d=e("SVse"),c=e("eF8U"),m=e("jMP8"),p=e("uYzU"),h=e("EEJc"),g=e("ajRT"),f=e("gp3X"),v=e("sb0X"),b=e("KVJa"),C=e("Z21x"),S=e("sne2"),_=e("Z4cD"),R=e("LqlI"),y=e("my5R");e.d(n,"a",(function(){return P}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,35,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Identifier"])),(l()(),t["ɵeld"](3,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,i.b,i.a)),t["ɵdid"](4,1163264,null,2,u.c,[t.ElementRef,u.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](7,0,null,0,13,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](8,0,null,null,1,"label",[["class","col-form-label required"],["for","lun"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["lun"])),(l()(),t["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","lun"],["id","lun"],["name","lun"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,11)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,11).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,11)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,11)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==t["ɵnov"](l,12).onChange(e.target.value)&&i),"input"===n&&(i=!1!==t["ɵnov"](l,12).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,12).onTouched()&&i),i}),null,null)),t["ɵdid"](11,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵdid"](12,16384,null,0,s.w,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,s.p,(function(l,n){return[l,n]}),[s.e,s.w]),t["ɵdid"](14,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](16,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](17,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](18,16384,null,0,u.h,[[3,s.d],u.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](20,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](21,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,i.b,i.a)),t["ɵdid"](22,1163264,null,2,u.c,[t.ElementRef,u.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](25,0,null,0,10,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](26,0,null,null,1,"label",[["class","col-form-label"],["for","wwn"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["wwn"])),(l()(),t["ɵeld"](28,0,null,null,7,"input",[["class","form-control"],["formControlName","wwn"],["id","wwn"],["name","wwn"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,29)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,29).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,29)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,29)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](29,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](31,671744,[[3,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](33,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](34,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](35,16384,null,0,u.h,[[3,s.d],u.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0),l(n,14,0,"lun"),l(n,18,0,"lun"),l(n,20,0,e.settingsForm.showError("lun",t["ɵnov"](n.parent,12),"required")),l(n,22,0),l(n,31,0,"wwn"),l(n,35,0,"wwn")}),(function(l,n){l(n,3,0,t["ɵnov"](n,4).hasErrors,t["ɵnov"](n,4).hasSuccess),l(n,10,0,t["ɵnov"](n,16).ngClassUntouched,t["ɵnov"](n,16).ngClassTouched,t["ɵnov"](n,16).ngClassPristine,t["ɵnov"](n,16).ngClassDirty,t["ɵnov"](n,16).ngClassValid,t["ɵnov"](n,16).ngClassInvalid,t["ɵnov"](n,16).ngClassPending,t["ɵnov"](n,18).validClass,t["ɵnov"](n,18).invalidClass),l(n,21,0,t["ɵnov"](n,22).hasErrors,t["ɵnov"](n,22).hasSuccess),l(n,28,0,t["ɵnov"](n,33).ngClassUntouched,t["ɵnov"](n,33).ngClassTouched,t["ɵnov"](n,33).ngClassPristine,t["ɵnov"](n,33).ngClassDirty,t["ɵnov"](n,33).ngClassValid,t["ɵnov"](n,33).ngClassInvalid,t["ɵnov"](n,33).ngClassPending,t["ɵnov"](n,35).validClass,t["ɵnov"](n,35).invalidClass)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,s.v,[t.ElementRef,t.Renderer2,[2,s.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,s.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""])),t["ɵppd"](4,1)],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){var e=t["ɵunv"](n,3,0,l(n,4,0,t["ɵnov"](n.parent,0),n.context.$implicit));l(n,3,0,e)}))}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,i.b,i.a)),t["ɵdid"](1,1163264,null,2,u.c,[t.ElementRef,u.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,2,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"cd-iscsi-setting",[],null,null,null,c.b,c.a)),t["ɵdid"](6,114688,null,0,m.a,[],{settingsForm:[0,"settingsForm"],formDir:[1,"formDir"],setting:[2,"setting"],limits:[3,"limits"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,6,0,e.settingsForm,t["ɵnov"](n.parent.parent.parent,12),n.context.$implicit.key,e.getDiskControlLimits(n.parent.parent.context.$implicit,n.context.$implicit.key))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,null,null,null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,2,null,N)),t["ɵdid"](2,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),t["ɵpid"](0,d.KeyValuePipe,[t.KeyValueDiffers]),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,2,0,t["ɵunv"](n,2,0,t["ɵnov"](n,3).transform(e.disk_default_controls[n.parent.context.$implicit])))}),null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,null,null,null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](2,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,2,0,n.component.settingsForm.value.backstore===n.context.$implicit)}),null)}function T(l){return t["ɵvid"](0,[t["ɵpid"](0,p.a,[]),(l()(),t["ɵeld"](1,0,null,null,47,"cd-modal",[],null,null,null,h.c,h.b)),t["ɵdid"](2,49152,null,0,g.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](3,0,null,0,5,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Configure"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](7,0,null,null,1,"small",[],null,null,null,null,null)),(l()(),t["ɵted"](8,null,["",""])),(l()(),t["ɵeld"](9,0,null,1,39,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](10,0,null,null,38,"form",[["class","form"],["name","settingsForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,12).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,12).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,15).onSubmit()&&i),i}),null,null)),t["ɵdid"](11,16384,null,0,s.G,[],null,null),t["ɵdid"](12,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](14,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](15,16384,null,0,u.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](16,0,null,null,25,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"p",[["class","alert-warning"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Changing these parameters from their default values is usually not necessary."])),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](20,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](21,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Settings"])),(l()(),t["ɵeld"](23,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,i.b,i.a)),t["ɵdid"](24,1163264,null,2,u.c,[t.ElementRef,u.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](27,0,null,0,12,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](28,0,null,null,1,"label",[["class","col-form-label"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Backstore"])),(l()(),t["ɵeld"](30,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","backstore"],["id","backstore"],["name","backstore"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==t["ɵnov"](l,31).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,31).onTouched()&&i),i}),null,null)),t["ɵdid"](31,16384,null,0,s.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.A]),t["ɵdid"](33,671744,[[5,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](35,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](36,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](37,16384,null,0,u.h,[[3,s.d],u.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](39,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](41,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](42,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](43,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.save()&&t),t}),f.b,f.a)),t["ɵdid"](45,114688,null,0,v.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Confirm"])),(l()(),t["ɵeld"](47,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,b.b,b.a)),t["ɵdid"](48,49152,null,0,C.a,[d.Location,S.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,2,0,e.modalRef),l(n,12,0,e.settingsForm),l(n,15,0,e.settingsForm),l(n,20,0,e.api_version>=1),l(n,24,0),l(n,33,0,"backstore"),l(n,37,0,"backstore"),l(n,39,0,e.backstores),l(n,41,0,e.backstores),l(n,45,0,e.settingsForm),l(n,48,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,8,0,n.component.image),l(n,10,0,t["ɵnov"](n,14).ngClassUntouched,t["ɵnov"](n,14).ngClassTouched,t["ɵnov"](n,14).ngClassPristine,t["ɵnov"](n,14).ngClassDirty,t["ɵnov"](n,14).ngClassValid,t["ɵnov"](n,14).ngClassInvalid,t["ɵnov"](n,14).ngClassPending),l(n,23,0,t["ɵnov"](n,24).hasErrors,t["ɵnov"](n,24).hasSuccess),l(n,30,0,t["ɵnov"](n,35).ngClassUntouched,t["ɵnov"](n,35).ngClassTouched,t["ɵnov"](n,35).ngClassPristine,t["ɵnov"](n,35).ngClassDirty,t["ɵnov"](n,35).ngClassValid,t["ɵnov"](n,35).ngClassInvalid,t["ɵnov"](n,35).ngClassPending,t["ɵnov"](n,37).validClass,t["ɵnov"](n,37).invalidClass)}))}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-image-settings-modal",[],null,null,null,T,w)),t["ɵdid"](1,114688,null,0,_.a,[R.a,y.a],null,null)],(function(l,n){l(n,1,0)}),null)}var P=t["ɵccf"]("cd-iscsi-target-image-settings-modal",_.a,D,{},{},[])},o8EM:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("PhyI"),i=e("8Y7J"),u=e("GiVz");let s=(()=>{class l{constructor(l){this.i18n=l,this.sections=[{heading:this.i18n("Quality of Service"),class:"quality-of-service",options:[{name:"rbd_qos_bps_limit",displayName:this.i18n("BPS Limit"),description:this.i18n("The desired limit of IO bytes per second."),type:t.b.bps},{name:"rbd_qos_iops_limit",displayName:this.i18n("IOPS Limit"),description:this.i18n("The desired limit of IO operations per second."),type:t.b.iops},{name:"rbd_qos_read_bps_limit",displayName:this.i18n("Read BPS Limit"),description:this.i18n("The desired limit of read bytes per second."),type:t.b.bps},{name:"rbd_qos_read_iops_limit",displayName:this.i18n("Read IOPS Limit"),description:this.i18n("The desired limit of read operations per second."),type:t.b.iops},{name:"rbd_qos_write_bps_limit",displayName:this.i18n("Write BPS Limit"),description:this.i18n("The desired limit of write bytes per second."),type:t.b.bps},{name:"rbd_qos_write_iops_limit",displayName:this.i18n("Write IOPS Limit"),description:this.i18n("The desired limit of write operations per second."),type:t.b.iops},{name:"rbd_qos_bps_burst",displayName:this.i18n("BPS Burst"),description:this.i18n("The desired burst limit of IO bytes."),type:t.b.bps},{name:"rbd_qos_iops_burst",displayName:this.i18n("IOPS Burst"),description:this.i18n("The desired burst limit of IO operations."),type:t.b.iops},{name:"rbd_qos_read_bps_burst",displayName:this.i18n("Read BPS Burst"),description:this.i18n("The desired burst limit of read bytes."),type:t.b.bps},{name:"rbd_qos_read_iops_burst",displayName:this.i18n("Read IOPS Burst"),description:this.i18n("The desired burst limit of read operations."),type:t.b.iops},{name:"rbd_qos_write_bps_burst",displayName:this.i18n("Write BPS Burst"),description:this.i18n("The desired burst limit of write bytes."),type:t.b.bps},{name:"rbd_qos_write_iops_burst",displayName:this.i18n("Write IOPS Burst"),description:this.i18n("The desired burst limit of write operations."),type:t.b.iops}]}]}static getOptionsFromSections(l){return l.map(l=>l.options).reduce((l,n)=>l.concat(n))}filterConfigOptionsByName(n){return l.getOptionsFromSections(this.sections).filter(l=>l.name===n)}getOptionValueByName(l,n,e=""){const t=this.filterConfigOptionsByName(l);return 1===t.length?t.pop()[n]:e}getWritableSections(){return this.sections.map(l=>(l.options=l.options.filter(l=>!l.readOnly),l))}getOptionFields(){return l.getOptionsFromSections(this.sections)}getWritableOptionFields(){return l.getOptionsFromSections(this.getWritableSections())}getOptionByName(l){return this.filterConfigOptionsByName(l).pop()}getDisplayName(l){return this.getOptionValueByName(l,"displayName")}getDescription(l){return this.getOptionValueByName(l,"description")}}return l.ngInjectableDef=i["ɵɵdefineInjectable"]({factory:function(){return new l(i["ɵɵinject"](u.a))},token:l,providedIn:"root"}),l})()},puGn:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),i=(e("XED3"),e("QFaf")),u=e("kvvV");e("kn/O");class s{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.createForm()}createForm(){this.editSiteNameForm=new i.a({siteName:new t.i("",{})})}ngOnInit(){this.editSiteNameForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(l=>{this.editSiteNameForm.get("siteName").setValue(l.site_name)})}update(){this.taskWrapper.wrapTaskAroundCall({task:new u.a("rbd/mirroring/site_name/edit",{}),call:this.rbdMirroringService.setSiteName(this.editSiteNameForm.getValue("siteName"))}).subscribe(void 0,()=>this.editSiteNameForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},rFfW:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("8Y7J"),i=e("s7LF"),u=e("oxzT"),s=e("QFaf"),a=e("PhyI");e("aXbf"),e("o8EM");class o{constructor(l,n){this.formatterService=l,this.rbdConfigurationService=n,this.changes=new t.EventEmitter,this.icons=u.a,this.ngDataReady=new t.EventEmitter,this.configurationType=a.b,this.sectionVisibility={}}ngOnInit(){const l=this.createConfigurationFormGroup();this.form.addControl("configuration",l),l.valueChanges.subscribe(()=>{this.changes.emit(this.getDirtyValues.bind(this))}),this.initializeData&&this.initializeData.subscribe(l=>{this.initialData=l.initialData;const n=l.sourceType;this.rbdConfigurationService.getWritableOptionFields().forEach(e=>{const t=l.initialData.filter(l=>l.name===e.name).pop();t&&t.source===n&&this.form.get("configuration."+e.name).setValue(t.value)}),this.ngDataReady.emit()}),this.rbdConfigurationService.getWritableSections().forEach(l=>this.sectionVisibility[l.class]=!1)}getDirtyValues(l=!1,n){if(l&&!n)throw new Error("ProgrammingError: If local values shall be included, a proper localFieldType argument has to be provided, too");const e={};return this.rbdConfigurationService.getWritableOptionFields().forEach(t=>{const i=this.form.get("configuration").get(t.name);this.initialData&&this.initialData[t.name]===i.value||(i.dirty||l&&i.source===n)&&(e[t.name]=null===i.value?i.value:t.type===a.b.bps?this.formatterService.toBytes(i.value):t.type===a.b.milliseconds?this.formatterService.toMilliseconds(i.value):t.type===a.b.iops?this.formatterService.toIops(i.value):i.value)}),e}createConfigurationFormGroup(){const l=new s.a({});return this.rbdConfigurationService.getWritableOptionFields().forEach(n=>{let e;if(n.type!==a.b.milliseconds&&n.type!==a.b.iops&&n.type!==a.b.bps)throw new Error(`Type ${n.type} is unknown, you may need to add it to RbdConfiguration class`);e=new i.i(0,i.B.min(0)),l.addControl(n.name,e)}),l}reset(l){const n=this.form.get("configuration").get(l);n.disabled?(n.setValue(n.previousValue||0),n.enable(),n.previousValue||n.markAsPristine()):(n.previousValue=n.value,n.setValue(null),n.markAsDirty(),n.disable())}isDisabled(l){return this.form.get("configuration").get(l).disabled}toggleSectionVisibility(l){this.sectionVisibility[l]=!this.sectionVisibility[l]}}},roDX:function(l,n,e){"use strict";e.d(n,"a",(function(){return i})),e("my5R");var t=e("x38r");e("o4+5"),e("uYzU");class i{constructor(l,n,e,t){this.iscsiService=l,this.dimlessPipe=n,this.iscsiBackstorePipe=e,this.i18n=t,this.gateways=[],this.images=[]}ngOnInit(){this.gatewaysColumns=[{name:this.i18n("Name"),prop:"name"},{name:this.i18n("State"),prop:"state",flexGrow:1,cellTransformation:t.a.badge,customTemplateConfig:{map:{up:{class:"badge-success"},down:{class:"badge-danger"}}}},{name:this.i18n("# Targets"),prop:"num_targets"},{name:this.i18n("# Sessions"),prop:"num_sessions"}],this.imagesColumns=[{name:this.i18n("Pool"),prop:"pool"},{name:this.i18n("Image"),prop:"image"},{name:this.i18n("Backstore"),prop:"backstore",pipe:this.iscsiBackstorePipe},{name:this.i18n("Read Bytes"),prop:"stats_history.rd_bytes",cellTemplate:this.iscsiSparklineTpl},{name:this.i18n("Write Bytes"),prop:"stats_history.wr_bytes",cellTemplate:this.iscsiSparklineTpl},{name:this.i18n("Read Ops"),prop:"stats.rd",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:this.i18n("Write Ops"),prop:"stats.wr",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:this.i18n("A/O Since"),prop:"optimized_since",cellTemplate:this.iscsiRelativeDateTpl}]}refresh(){this.iscsiService.overview().subscribe(l=>{this.gateways=l.gateways,this.images=l.images,this.images.map(l=>(l.stats_history&&(l.stats_history.rd_bytes=l.stats_history.rd_bytes.map(l=>l[1]),l.stats_history.wr_bytes=l.stats_history.wr_bytes.map(l=>l[1])),l.cdIsBinary=!0,l))})}}},u0yg:function(l,n,e){"use strict";e.d(n,"b",(function(){return t})),e.d(n,"a",(function(){return i}));class t{}var i=function(l){return l[l.V1=1]="V1",l[l.V2=2]="V2",l}({})},u2XS:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("SVse"),u=e("25BL"),s=e("uIqm"),a=e("LOMR"),o=e("MP8s"),r=e("fxL3"),d=e("gk6K"),c=e("3ris"),m=e("GiVz"),p=e("uYzU"),h=e("iExv");e.d(n,"b",(function(){return g})),e.d(n,"c",(function(){return _})),e.d(n,"a",(function(){return y}));var g=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""])),(l()(),t["ɵted"](-1,null,["   "])),(l()(),t["ɵeld"](4,0,null,null,6,"span",[["class","badge"]],null,null,null,null,null)),t["ɵprd"](512,null,i["ɵNgClassImpl"],i["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](6,278528,null,0,i.NgClass,[i["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),t["ɵpad"](7,1),t["ɵpad"](8,1),t["ɵpod"](9,{"badge-success":0,"badge-danger":1}),(l()(),t["ɵted"](10,null,[" "," "]))],(function(l,n){var e=l(n,9,0,l(n,7,0,"logged_in").includes(n.context.$implicit.data.status),l(n,8,0,"logged_out").includes(n.context.$implicit.data.status));l(n,6,0,"badge",e)}),(function(l,n){l(n,0,0,n.context.$implicit.data.cdIcon),l(n,2,0,n.context.$implicit.data.name),l(n,10,0,n.context.$implicit.data.status)}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"div",[["class","col-6 metadata"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""])),(l()(),t["ɵeld"](3,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,u.b,u.a)),t["ɵdid"](4,2867200,[[2,4],["detailTable",4]],0,s.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],limit:[3,"limit"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.data,e.columns,"flex",0)}),(function(l,n){l(n,2,0,n.component.title)}))}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵand"](16777216,null,null,1,null,b)),t["ɵdid"](1,16384,null,0,i.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,C)),t["ɵdid"](3,16384,null,0,i.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,void 0===n.context.row.default||n.context.row.default===n.context.row.current),l(n,3,0,void 0!==n.context.row.default&&n.context.row.default!==n.context.row.current)}),null)}function _(l){return t["ɵvid"](0,[t["ɵqud"](402653184,1,{highlightTpl:0}),t["ɵqud"](671088640,2,{content:0}),t["ɵqud"](671088640,3,{tree:0}),(l()(),t["ɵeld"](3,0,null,null,13,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,10,"div",[["class","col-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["iSCSI Topology"])),(l()(),t["ɵeld"](7,0,null,null,7,"tree-root",[],null,[[null,"updateData"],["body","keydown"],["body","mousedown"]],(function(l,n,e){var i=!0,u=l.component;return"body:keydown"===n&&(i=!1!==t["ɵnov"](l,9).onKeydown(e)&&i),"body:mousedown"===n&&(i=!1!==t["ɵnov"](l,9).onMousedown(e)&&i),"updateData"===n&&(i=!1!==u.onUpdateData()&&i),i}),a.b,a.a)),t["ɵprd"](131584,null,o.a,o.a,[]),t["ɵdid"](9,573440,[[3,4],["tree",4]],4,r.a,[o.a,d.a],{nodes:[0,"nodes"],options:[1,"options"]},{updateData:"updateData"}),t["ɵqud"](603979776,4,{loadingTemplate:0}),t["ɵqud"](603979776,5,{treeNodeTemplate:0}),t["ɵqud"](603979776,6,{treeNodeWrapperTemplate:0}),t["ɵqud"](603979776,7,{treeNodeFullTemplate:0}),(l()(),t["ɵand"](0,[[5,2],["treeNodeTemplate",2]],null,0,null,f)),(l()(),t["ɵand"](16777216,null,null,1,null,v)),t["ɵdid"](16,16384,null,0,i.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["highlightTpl",2]],null,0,null,S))],(function(l,n){var e=n.component;l(n,9,0,e.nodes,e.treeOptions),l(n,16,0,e.data)}),null)}function R(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-details",[],null,null,null,_,g)),t["ɵdid"](1,638976,null,0,c.a,[m.a,p.a,h.a],null,null)],(function(l,n){l(n,1,0)}),null)}var y=t["ɵccf"]("cd-iscsi-target-details",c.a,R,{selection:"selection",settings:"settings",cephIscsiConfigVersion:"cephIscsiConfigVersion"},{},[])},xvu0:function(l,n,e){"use strict";var t=e("8Y7J"),i=e("EEJc"),u=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("mXUL"),r=e("IZUe"),d=e("ANnk"),c=e("f/UV"),m=e("aexS"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("SVse"),b=e("sne2"),C=e("puGn"),S=e("LqlI"),_=e("XED3"),R=e("kn/O");e.d(n,"a",(function(){return I}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,39,"cd-modal",[],null,null,null,i.c,i.b)),t["ɵdid"](1,49152,null,0,u.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit site name"])),(l()(),t["ɵeld"](4,0,null,1,35,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,34,"form",[["class","form"],["name","editSiteNameForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==t["ɵnov"](l,7).onSubmit(e)&&i),"reset"===n&&(i=!1!==t["ɵnov"](l,7).onReset()&&i),"submit"===n&&(i=!1!==t["ɵnov"](l,10).onSubmit()&&i),i}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,21,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit the site name and click  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Update"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,14,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](19,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==t["ɵnov"](l,27).onTouched()&&i),"compositionstart"===n&&(i=!1!==t["ɵnov"](l,27)._compositionStart()&&i),"compositionend"===n&&(i=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&i),i}),null,null)),t["ɵdid"](25,4210688,null,0,r.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,d.a,[[2,c.a],m.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](29,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](31,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](32,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](33,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](34,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),p.b,p.a)),t["ɵdid"](36,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Update"])),(l()(),t["ɵeld"](38,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](39,49152,null,0,f.a,[v.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.editSiteNameForm),l(n,10,0,e.editSiteNameForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,36,0,e.editSiteNameForm),l(n,39,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass)}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-edit-site-mode-modal",[],null,null,null,w,y)),t["ɵdid"](1,114688,null,0,C.a,[S.a,_.a,R.a],null,null)],(function(l,n){l(n,1,0)}),null)}var I=t["ɵccf"]("cd-edit-site-mode-modal",C.a,k,{},{},[])}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/1.ecdc99fc68ced4743e9f.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/1.ecdc99fc68ced4743e9f.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/1.ecdc99fc68ced4743e9f.js 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/1.ecdc99fc68ced4743e9f.js 2021-04-19 13:53:42.000000000 +0000 @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+26A":function(l,n,e){"use strict";e.d(n,"a",(function(){return d}));var t=e("s7LF"),u=e("LvDl"),i=e("GyhO"),s=e("cp0P"),a=e("NJ9Y"),o=(e("XED3"),e("QFaf")),r=e("kvvV");e("kn/O");class d{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.pools=[],this.directions=[{key:"rx-tx",desc:"Bidirectional"},{key:"rx",desc:"Unidirectional (receive-only)"}],this.createForm()}createForm(){this.importBootstrapForm=new o.a({siteName:new t.i("",{validators:[t.B.required]}),direction:new t.i("rx-tx",{}),pools:new t.k({},{validators:[this.validatePools()]}),token:new t.i("",{validators:[t.B.required,this.validateToken()]})})}ngOnInit(){this.rbdMirroringService.getSiteName().subscribe(l=>{this.importBootstrapForm.get("siteName").setValue(l.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.pools=l.content_data.pools.reduce((l,n)=>(l.push({name:n.name,mirror_mode:n.mirror_mode}),l),[]);const n=this.importBootstrapForm.get("pools");u.each(this.pools,l=>{const e=l.name,u="disabled"===l.mirror_mode,i=n.controls[e];i?u&&i.disabled?i.enable():!u&&i.enabled&&(i.disable(),i.setValue(!0)):n.addControl(e,new t.i({value:!u,disabled:!u}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return l=>{let n=0;return u.each(l.controls,l=>{!0===l.value&&++n}),n>0?null:{requirePool:!0}}}validateToken(){return l=>{try{if(JSON.parse(atob(l.value)))return null}catch(n){}return{invalidToken:!0}}}import(){const l=[],n=[],e=this.importBootstrapForm.get("pools");u.each(e.controls,(e,t)=>{!0===e.value&&(l.push(t),e.disabled||n.push(t))});const t={mirror_mode:"image"};let o=Object(i.a)(this.rbdMirroringService.setSiteName(this.importBootstrapForm.getValue("siteName")),Object(s.a)(n.map(l=>this.rbdMirroringService.updatePool(l,t))));o=l.reduce((l,n)=>Object(i.a)(l,this.rbdMirroringService.importBootstrapToken(n,this.importBootstrapForm.getValue("direction"),this.importBootstrapForm.getValue("token"))),o).pipe(Object(a.a)());const d=()=>{this.rbdMirroringService.refresh(),this.importBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new r.a("rbd/mirroring/bootstrap/import",{}),call:o}).subscribe(void 0,d,()=>{d(),this.modalRef.hide()})}}},"0BYw":function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("EEJc"),c=e("ajRT"),m=e("mXUL"),p=e("IZUe"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("daK0"),S=e("LqlI"),R=e("9nlD"),_=e("Ekvf"),w=e("F83c"),y=e("GiVz");e.d(n,"a",(function(){return A}));var k=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","pool"],["id","pool"],["name","pool"],["placeholder","Pool name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,1)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,3,0,"pool"),l(n,7,0,"pool")}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["-- No rbd pools available --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](-1,null,["-- Select a pool --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.pool_name),l(n,2,0,n.context.$implicit.pool_name)}),(function(l,n){l(n,3,0,n.context.$implicit.pool_name)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","pool"],["id","pool"],["name","pool"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.A]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](9,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,N)),t["ɵdid"](11,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](13,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](15,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"pool"),l(n,7,0,"pool"),l(n,9,0,null===e.pools),l(n,11,0,null!==e.pools&&0===e.pools.length),l(n,13,0,null!==e.pools&&e.pools.length>0),l(n,15,0,e.pools)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Namespace already exists."]))],null,null)}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,51,"cd-modal",[],null,null,null,d.c,d.b)),t["ɵdid"](1,49152,null,0,c.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Create Namespace"])),(l()(),t["ɵeld"](4,0,null,1,47,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,46,"form",[["name","namespaceForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,u.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](9,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,33,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](13,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","pool"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"])),(l()(),t["ɵeld"](18,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](20,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,T)),t["ɵdid"](22,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,D)),t["ɵdid"](24,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](25,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](26,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","namespace"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](31,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](32,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","namespace"],["id","namespace"],["name","namespace"],["placeholder","Namespace name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,33)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,33).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,33)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,33)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](33,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](35,671744,[[3,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](37,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](38,4210688,null,0,p.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](39,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](40,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,x)),t["ɵdid"](42,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,P)),t["ɵdid"](44,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](45,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](46,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](47,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submit()&&t),t}),h.b,h.a)),t["ɵdid"](48,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Create Namespace"])),(l()(),t["ɵeld"](50,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,f.b,f.a)),t["ɵdid"](51,49152,null,0,v.a,[r.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.namespaceForm),l(n,10,0,e.namespaceForm),l(n,13,0),l(n,20,0,!e.poolPermission.read),l(n,22,0,e.poolPermission.read),l(n,24,0,e.namespaceForm.showError("pool",t["ɵnov"](n,7),"required")),l(n,26,0),l(n,35,0,"namespace"),l(n,38,0,""),l(n,40,0,"namespace"),l(n,42,0,e.namespaceForm.showError("namespace",t["ɵnov"](n,7),"required")),l(n,44,0,e.namespaceForm.showError("namespace",t["ɵnov"](n,7),"namespaceExists")),l(n,48,0,e.namespaceForm),l(n,51,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,12,0,t["ɵnov"](n,13).hasErrors,t["ɵnov"](n,13).hasSuccess),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess),l(n,32,0,t["ɵnov"](n,37).ngClassUntouched,t["ɵnov"](n,37).ngClassTouched,t["ɵnov"](n,37).ngClassPristine,t["ɵnov"](n,37).ngClassDirty,t["ɵnov"](n,37).ngClassValid,t["ɵnov"](n,37).ngClassInvalid,t["ɵnov"](n,37).ngClassPending,t["ɵnov"](n,40).validClass,t["ɵnov"](n,40).invalidClass)}))}function B(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-namespace-form-modal",[],null,null,null,q,k)),t["ɵdid"](1,114688,null,0,C.a,[S.a,a.a,R.a,_.a,w.a,y.a],null,null)],(function(l,n){l(n,1,0)}),null)}var A=t["ɵccf"]("cd-rbd-namespace-form-modal",C.a,B,{},{},[])},"0rTx":function(l,n,e){"use strict";var t=e("8Y7J"),u=e("EEJc"),i=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("mXUL"),r=e("IZUe"),d=e("ANnk"),c=e("f/UV"),m=e("aexS"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("2GqK"),S=e("F83c"),R=e("LqlI"),_=e("2EZI"),w=e("kn/O");e.d(n,"a",(function(){return N}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,48,"cd-modal",[],null,null,null,u.c,u.b)),t["ɵdid"](1,49152,null,0,i.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Restore Image"])),(l()(),t["ɵeld"](4,0,null,1,44,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,43,"form",[["class","form"],["name","restoreForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,30,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To restore"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](17,null,["","@",""])),(l()(),t["ɵted"](-1,null,[",  "])),(l()(),t["ɵeld"](19,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["type the image's new name and click"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](22,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Restore Image"])),(l()(),t["ɵted"](-1,null,[". "])),(l()(),t["ɵeld"](25,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](26,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["New Name"])),(l()(),t["ɵeld"](31,0,null,0,8,"input",[["autocomplete","off"],["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,32)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,32).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,32)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,32)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](32,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](34,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](36,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](37,4210688,null,0,r.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](38,4210688,null,0,d.a,[[2,c.a],m.a,t.ElementRef],null,null),t["ɵdid"](39,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](41,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](42,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](43,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.restore()&&t),t}),h.b,h.a)),t["ɵdid"](45,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Restore Image"])),(l()(),t["ɵeld"](47,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,f.b,f.a)),t["ɵdid"](48,49152,null,0,v.a,[p.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.restoreForm),l(n,10,0,e.restoreForm),l(n,26,0),l(n,34,0,"name"),l(n,37,0,""),l(n,39,0,"name"),l(n,41,0,e.restoreForm.showError("name",t["ɵnov"](n,7),"required")),l(n,45,0,e.restoreForm),l(n,48,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,17,0,e.imageSpec,e.imageId),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess),l(n,31,0,t["ɵnov"](n,36).ngClassUntouched,t["ɵnov"](n,36).ngClassTouched,t["ɵnov"](n,36).ngClassPristine,t["ɵnov"](n,36).ngClassDirty,t["ɵnov"](n,36).ngClassValid,t["ɵnov"](n,36).ngClassInvalid,t["ɵnov"](n,36).ngClassPending,t["ɵnov"](n,39).validClass,t["ɵnov"](n,39).invalidClass)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-restore-modal",[],null,null,null,E,y)),t["ɵdid"](1,114688,null,0,C.a,[S.a,R.a,_.a,w.a],null,null)],(function(l,n){l(n,1,0)}),null)}var N=t["ɵccf"]("cd-rbd-trash-restore-modal",C.a,I,{},{},[])},"2GqK":function(l,n,e){"use strict";e.d(n,"a",(function(){return i})),e("F83c"),e("2EZI");var t=e("kvvV"),u=e("jVDg");e("kn/O");class i{constructor(l,n,e,t){this.rbdService=l,this.modalRef=n,this.fb=e,this.taskWrapper=t}ngOnInit(){this.imageSpec=new u.a(this.poolName,this.namespace,this.imageName).toString(),this.restoreForm=this.fb.group({name:this.imageName})}restore(){const l=this.restoreForm.getValue("name"),n=new u.a(this.poolName,this.namespace,this.imageId);this.taskWrapper.wrapTaskAroundCall({task:new t.a("rbd/trash/restore",{image_id_spec:n.toString(),new_image_name:l}),call:this.rbdService.restoreTrash(n,l)}).subscribe(void 0,()=>{this.restoreForm.setErrors({cdSubmitButton:!0})},()=>{this.modalRef.hide()})}}},"2JDI":function(l,n,e){"use strict";e.d(n,"a",(function(){return a}));var t=e("wd/R"),u=(e("F83c"),e("2EZI"),e("1Ni5")),i=e("kvvV"),s=e("jVDg");e("kn/O");class a{constructor(l,n,e,t){this.rbdService=l,this.modalRef=n,this.fb=e,this.taskWrapper=t,this.minDate=new Date,this.bsConfig={dateInputFormat:"YYYY-MM-DD HH:mm:ss",containerClass:"theme-default"},this.createForm()}createForm(){this.moveForm=this.fb.group({expiresAt:["",[u.a.custom("format",l=>!(""===l||t(l,"YYYY-MM-DD HH:mm:ss").isValid())),u.a.custom("expired",l=>t().isAfter(l))]]})}ngOnInit(){this.imageSpec=new s.a(this.poolName,this.namespace,this.imageName),this.imageSpecStr=this.imageSpec.toString(),this.pattern=`${this.poolName}/${this.imageName}`}moveImage(){let l=0;const n=this.moveForm.getValue("expiresAt");n&&(l=t(n).diff(t(),"seconds",!0)),l<0&&(l=0),this.taskWrapper.wrapTaskAroundCall({task:new i.a("rbd/trash/move",{image_spec:this.imageSpecStr}),call:this.rbdService.moveTrash(this.imageSpec,l)}).subscribe(void 0,void 0,()=>{this.modalRef.hide()})}}},"3IYD":function(l,n,e){"use strict";var t=e("8Y7J"),u=e("SVse"),i=e("8xTl"),s=e("EEJc"),a=e("ajRT"),o=e("s7LF"),r=e("+gVj"),d=e("mXUL"),c=e("IZUe"),m=e("ANnk"),p=e("f/UV"),h=e("aexS"),g=e("gp3X"),f=e("sb0X"),v=e("KVJa"),b=e("Z21x"),C=e("sne2"),S=e("Fd71"),R=e("LqlI"),_=e("F83c"),w=e("VXsX"),y=e("9nlD"),k=e("GiVz");e.d(n,"a",(function(){return V}));var E=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[t["ɵpid"](0,u.TitleCasePipe,[]),t["ɵpid"](0,i.a,[]),(l()(),t["ɵeld"](2,0,null,null,40,"cd-modal",[],null,null,null,s.c,s.b)),t["ɵdid"](3,49152,null,0,a.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),t["ɵted"](5,null,[""," ",""])),t["ɵppd"](6,1),t["ɵppd"](7,1),(l()(),t["ɵeld"](8,0,null,1,34,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](9,0,null,null,33,"form",[["name","snapshotForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,11).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,11).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,14).onSubmit()&&u),u}),null,null)),t["ɵdid"](10,16384,null,0,o.G,[],null,null),t["ɵdid"](11,540672,[["formDir",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,o.d,null,[o.l]),t["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),t["ɵdid"](14,16384,null,0,r.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](15,0,null,null,18,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](16,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](17,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","snapshotName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](22,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","snapshotName"],["id","snapshotName"],["name","snapshotName"],["placeholder","Snapshot name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,24)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,24).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,24)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,24)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](24,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](26,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](28,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](29,4210688,null,0,c.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](30,4210688,null,0,m.a,[[2,p.a],h.a,t.ElementRef],null,null),t["ɵdid"](31,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](33,16384,null,0,u.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](34,0,null,null,8,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](36,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submit()&&t),t}),g.b,g.a)),t["ɵdid"](37,114688,null,0,f.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](38,0,[""," ",""])),t["ɵppd"](39,1),t["ɵppd"](40,1),(l()(),t["ɵeld"](41,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,v.b,v.a)),t["ɵdid"](42,49152,null,0,b.a,[u.Location,C.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.modalRef),l(n,11,0,e.snapshotForm),l(n,14,0,e.snapshotForm),l(n,17,0),l(n,26,0,"snapshotName"),l(n,29,0,""),l(n,31,0,"snapshotName"),l(n,33,0,e.snapshotForm.showError("snapshotName",t["ɵnov"](n,11),"required")),l(n,37,0,e.snapshotForm),l(n,42,0,"Close",e.modalRef.hide)}),(function(l,n){var e=n.component,u=t["ɵunv"](n,5,0,l(n,6,0,t["ɵnov"](n,0),e.action)),i=t["ɵunv"](n,5,1,l(n,7,0,t["ɵnov"](n,1),e.resource));l(n,5,0,u,i),l(n,9,0,t["ɵnov"](n,13).ngClassUntouched,t["ɵnov"](n,13).ngClassTouched,t["ɵnov"](n,13).ngClassPristine,t["ɵnov"](n,13).ngClassDirty,t["ɵnov"](n,13).ngClassValid,t["ɵnov"](n,13).ngClassInvalid,t["ɵnov"](n,13).ngClassPending),l(n,16,0,t["ɵnov"](n,17).hasErrors,t["ɵnov"](n,17).hasSuccess),l(n,23,0,t["ɵnov"](n,28).ngClassUntouched,t["ɵnov"](n,28).ngClassTouched,t["ɵnov"](n,28).ngClassPristine,t["ɵnov"](n,28).ngClassDirty,t["ɵnov"](n,28).ngClassValid,t["ɵnov"](n,28).ngClassInvalid,t["ɵnov"](n,28).ngClassPending,t["ɵnov"](n,31).validClass,t["ɵnov"](n,31).invalidClass);var s=t["ɵunv"](n,38,0,l(n,39,0,t["ɵnov"](n,0),e.action)),a=t["ɵunv"](n,38,1,l(n,40,0,t["ɵnov"](n,1),e.resource));l(n,38,0,s,a)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-snapshot-form-modal",[],null,null,null,N,E)),t["ɵdid"](1,114688,null,0,S.a,[R.a,_.a,w.a,y.a,k.a,C.b],null,null)],(function(l,n){l(n,1,0)}),null)}var V=t["ɵccf"]("cd-rbd-snapshot-form-modal",S.a,F,{},{},[])},"3ris":function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("yYhs"),u=e("LvDl"),i=(e("uIqm"),e("oxzT"));e("iExv"),e("uYzU");class s{constructor(l,n,e){this.i18n=l,this.iscsiBackstorePipe=n,this.booleanTextPipe=e,this.icons=i.a,this.metadata={},this.nodes=[],this.treeOptions={useVirtualScroll:!0,actionMapping:{mouse:{click:this.onNodeSelected.bind(this)}}}}set content(l){this.detailTable=l,l&&l.updateColumns()}ngOnInit(){this.columns=[{prop:"displayName",name:this.i18n("Name"),flexGrow:1,cellTemplate:this.highlightTpl},{prop:"current",name:this.i18n("Current"),flexGrow:1,cellTemplate:this.highlightTpl},{prop:"default",name:this.i18n("Default"),flexGrow:1,cellTemplate:this.highlightTpl}]}ngOnChanges(){this.selection&&(this.selectedItem=this.selection,this.generateTree()),this.data=void 0}generateTree(){const l=u.cloneDeep(this.selectedItem.target_controls);this.cephIscsiConfigVersion>10&&u.extend(l,u.cloneDeep(this.selectedItem.auth)),this.metadata={root:l};const n={target:{expanded:u.join(this.selectedItem.cdExecuting?[i.a.large,i.a.spinner,i.a.spin]:[i.a.large,i.a.bullseye]," ")},initiators:{expanded:u.join([i.a.large,i.a.user]," "),leaf:u.join([i.a.user]," ")},groups:{expanded:u.join([i.a.large,i.a.users]," "),leaf:u.join([i.a.users]," ")},disks:{expanded:u.join([i.a.large,i.a.disk]," "),leaf:u.join([i.a.disk]," ")},portals:{expanded:u.join([i.a.large,i.a.server]," "),leaf:u.join([i.a.server]," ")}},e=[];u.forEach(this.selectedItem.disks,l=>{const t="disk_"+l.pool+"_"+l.image;this.metadata[t]={controls:l.controls,backstore:l.backstore},["wwn","lun"].forEach(n=>{n in l&&(this.metadata[t][n]=l[n])}),e.push({name:`${l.pool}/${l.image}`,cdId:t,cdIcon:n.disks.leaf})});const t=[];u.forEach(this.selectedItem.portals,l=>{t.push({name:`${l.host}:${l.ip}`,cdIcon:n.portals.leaf})});const s=[];u.forEach(this.selectedItem.clients,l=>{const e=u.cloneDeep(l.auth);l.info&&(u.extend(e,l.info),delete e.state,u.forEach(Object.keys(l.info.state),n=>{e[n.toLowerCase()]=l.info.state[n]})),this.metadata["client_"+l.client_iqn]=e;const t=[];l.luns.forEach(l=>{t.push({name:`${l.pool}/${l.image}`,cdId:"disk_"+l.pool+"_"+l.image,cdIcon:n.disks.leaf})});let i="";l.info&&(i=Object.keys(l.info.state).includes("LOGGED_IN")?"logged_in":"logged_out"),s.push({name:l.client_iqn,status:i,cdId:"client_"+l.client_iqn,children:t,cdIcon:n.initiators.leaf})});const a=[];u.forEach(this.selectedItem.groups,l=>{const e=[];l.disks.forEach(l=>{e.push({name:`${l.pool}/${l.image}`,cdId:"disk_"+l.pool+"_"+l.image,cdIcon:n.disks.leaf})});const t=[];l.members.forEach(l=>{t.push({name:l,cdId:"client_"+l})}),a.push({name:l.group_id,cdIcon:n.groups.leaf,children:[{name:"Disks",children:e,cdIcon:n.disks.expanded},{name:"Initiators",children:t,cdIcon:n.initiators.expanded}]})}),this.nodes=[{name:this.selectedItem.target_iqn,cdId:"root",isExpanded:!0,cdIcon:n.target.expanded,children:[{name:"Disks",isExpanded:!0,children:e,cdIcon:n.disks.expanded},{name:"Portals",isExpanded:!0,children:t,cdIcon:n.portals.expanded},{name:"Initiators",isExpanded:!0,children:s,cdIcon:n.initiators.expanded},{name:"Groups",isExpanded:!0,children:a,cdIcon:n.groups.expanded}]}]}format(l){return"boolean"==typeof l?this.booleanTextPipe.transform(l):l}onNodeSelected(l,n){if(t.a.ACTIVATE(l,n,!0),n.data.cdId){this.title=n.data.name;const l=this.metadata[n.data.cdId]||{};"root"===n.data.cdId?(this.columns[2].isHidden=!1,this.data=u.map(this.settings.target_default_controls,(n,e)=>({displayName:e,default:n=this.format(n),current:u.isUndefined(l[e])?n:this.format(l[e])})),this.cephIscsiConfigVersion>10&&["user","password","mutual_user","mutual_password"].forEach(n=>{this.data.push({displayName:n,default:null,current:l[n]})})):n.data.cdId.toString().startsWith("disk_")?(this.columns[2].isHidden=!1,this.data=u.map(this.settings.disk_default_controls[l.backstore],(n,e)=>({displayName:e,default:n=this.format(n),current:u.isUndefined(l.controls[e])?n:this.format(l.controls[e])})),this.data.push({displayName:"backstore",default:this.iscsiBackstorePipe.transform(this.settings.default_backstore),current:this.iscsiBackstorePipe.transform(l.backstore)}),["wwn","lun"].forEach(n=>{n in l&&this.data.push({displayName:n,default:void 0,current:l[n]})})):(this.columns[2].isHidden=!0,this.data=u.map(l,(l,n)=>({displayName:n,default:void 0,current:this.format(l)})))}else this.data=void 0;this.detailTable&&this.detailTable.updateColumns()}onUpdateData(){this.tree.treeModel.expandAll()}}},"5GyT":function(l,n,e){"use strict";e.d(n,"a",(function(){return v})),e.d(n,"b",(function(){return f}));var t=e("LvDl"),u=(e("F83c"),e("+fVR")),i=e("OLbh"),s=e("0+/T"),a=(e("sne2"),e("uIqm"),e("x38r")),o=e("oxzT"),r=e("yJti"),d=e("vCyI"),c=e("kvvV"),m=e("jVDg"),p=(e("Fgil"),e("o4+5"),e("aexS"),e("VTlA"),e("kn/O"),e("EgGo")),h=e("2JDI"),g=e("u0yg");const f=new p.a("block/rbd");class v extends u.a{constructor(l,n,e,t,u,i,s,a,r,c){super(),this.authStorageService=l,this.rbdService=n,this.dimlessBinaryPipe=e,this.dimlessPipe=t,this.modalService=u,this.taskWrapper=i,this.taskListService=s,this.i18n=a,this.urlBuilder=r,this.actionLabels=c,this.selection=new d.a,this.builders={"rbd/create":l=>this.createRbdFromTask(l.pool_name,l.namespace,l.image_name),"rbd/delete":l=>this.createRbdFromTaskImageSpec(l.image_spec),"rbd/clone":l=>this.createRbdFromTask(l.child_pool_name,l.child_namespace,l.child_image_name),"rbd/copy":l=>this.createRbdFromTask(l.dest_pool_name,l.dest_namespace,l.dest_image_name)},this.permission=this.authStorageService.getPermissions().rbdImage;const p=()=>this.selection.first()&&new m.a(this.selection.first().pool_name,this.selection.first().namespace,this.selection.first().name).toStringEncoded();this.tableActions=[{permission:"create",icon:o.a.add,routerLink:()=>this.urlBuilder.getCreate(),canBePrimary:l=>!l.hasSingleSelection,name:this.actionLabels.CREATE},{permission:"update",icon:o.a.edit,routerLink:()=>this.urlBuilder.getEdit(p()),name:this.actionLabels.EDIT},{permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>!l.hasSingleSelection||l.first().cdExecuting,icon:o.a.copy,routerLink:()=>"/block/rbd/copy/"+p(),name:this.actionLabels.COPY},{permission:"update",disable:l=>!l.hasSingleSelection||l.first().cdExecuting||!l.first().parent,icon:o.a.flatten,click:()=>this.flattenRbdModal(),name:this.actionLabels.FLATTEN},{permission:"delete",icon:o.a.destroy,click:()=>this.deleteRbdModal(),name:this.actionLabels.DELETE,disable:l=>this.getDeleteDisableDesc(l)},{permission:"delete",icon:o.a.trash,click:()=>this.trashRbdModal(),name:this.actionLabels.TRASH,disable:l=>!l.first()||!l.hasSingleSelection||l.first().image_format===g.a.V1}]}createRbdFromTaskImageSpec(l){const n=m.a.fromString(l);return this.createRbdFromTask(n.poolName,n.namespace,n.imageName)}createRbdFromTask(l,n,e){const t=new g.b;return t.id="-1",t.unique_id="-1",t.name=e,t.namespace=n,t.pool_name=l,t.image_format=g.a.V2,t}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"name",flexGrow:2,cellTransformation:a.a.executing},{name:this.i18n("Pool"),prop:"pool_name",flexGrow:2},{name:this.i18n("Namespace"),prop:"namespace",flexGrow:2},{name:this.i18n("Size"),prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Objects"),prop:"num_objs",flexGrow:1,cellClass:"text-right",pipe:this.dimlessPipe},{name:this.i18n("Object size"),prop:"obj_size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Provisioned"),prop:"disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe},{name:this.i18n("Total provisioned"),prop:"total_disk_usage",cellClass:"text-center",flexGrow:1,pipe:this.dimlessBinaryPipe},{name:this.i18n("Parent"),prop:"parent",flexGrow:2,cellTemplate:this.parentTpl}],this.taskListService.init(()=>this.rbdService.list(),l=>this.prepareResponse(l),l=>this.images=l,()=>this.onFetchError(),l=>["rbd/clone","rbd/copy","rbd/create","rbd/delete","rbd/edit","rbd/flatten","rbd/trash/move"].includes(l.name),(l,n)=>{let e;switch(n.name){case"rbd/copy":e=new m.a(n.metadata.dest_pool_name,n.metadata.dest_namespace,n.metadata.dest_image_name).toString();break;case"rbd/clone":e=new m.a(n.metadata.child_pool_name,n.metadata.child_namespace,n.metadata.child_image_name).toString();break;case"rbd/create":e=new m.a(n.metadata.pool_name,n.metadata.namespace,n.metadata.image_name).toString();break;default:e=n.metadata.image_spec}return e===new m.a(l.pool_name,l.namespace,l.name).toString()},this.builders)}onFetchError(){this.table.reset(),this.viewCacheStatusList=[{status:r.a.ValueException}]}prepareResponse(l){let n=[];const e={};l.forEach(l=>{t.isUndefined(e[l.status])&&(e[l.status]=[]),e[l.status].push(l.pool_name),n=n.concat(l.value)});const u=[];return t.forEach(e,(l,n)=>{u.push({status:parseInt(n,10),statusFor:(l.length>1?"pools ":"pool ")+""+l.join(", ")+""})}),this.viewCacheStatusList=u,n}updateSelection(l){this.selection=l}deleteRbdModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().name,t=new m.a(l,n,e);this.modalRef=this.modalService.show(s.a,{initialState:{itemDescription:"RBD",itemNames:[t],bodyTemplate:this.deleteTpl,bodyContext:{hasSnapshots:this.hasSnapshots(),snapshots:this.listProtectedSnapshots()},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new c.a("rbd/delete",{image_spec:t.toString()}),call:this.rbdService.delete(t)})}})}trashRbdModal(){const l={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,hasSnapshots:this.hasSnapshots()};this.modalRef=this.modalService.show(h.a,{initialState:l})}flattenRbd(l){this.taskWrapper.wrapTaskAroundCall({task:new c.a("rbd/flatten",{image_spec:l.toString()}),call:this.rbdService.flatten(l)}).subscribe(void 0,void 0,()=>{this.modalRef.hide()})}flattenRbdModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().name,t=this.selection.first().parent,u=new m.a(t.pool_name,t.pool_namespace,t.image_name),s=new m.a(l,n,e),a={titleText:"RBD flatten",buttonText:"Flatten",bodyTpl:this.flattenTpl,bodyData:{parent:`${u}@${t.snap_name}`,child:s.toString()},onSubmit:()=>{this.flattenRbd(s)}};this.modalRef=this.modalService.show(i.a,{initialState:a})}hasSnapshots(){return(this.selection.first().snapshots||[]).length>0}hasClonedSnapshots(l){return(l.snapshots||[]).some(l=>l.children&&l.children.length>0)}listProtectedSnapshots(){return this.selection.first().snapshots.reduce((l,n)=>(n.is_protected&&l.push(n.name),l),[])}getDeleteDisableDesc(l){const n=l.first();return n&&this.hasClonedSnapshots(n)?this.i18n("This RBD has cloned snapshots. Please delete related RBDs before deleting this RBD."):!l.first()||!l.hasSingleSelection||this.hasClonedSnapshots(l.first())}}},BH9v:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("aXbf");class s{constructor(l,n){this.control=l,this.formatter=n}setValue(l){const n=this.formatter.toMilliseconds(l);this.control.control.setValue(n+" ms")}ngOnInit(){this.setValue(this.control.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.control.value))}onUpdate(l){this.setValue(l)}}var a=e("ANnk"),o=e("f/UV"),r=e("aexS"),d=e("+gVj"),c=e("LvDl"),m=e("IzCI");class p{constructor(l,n,e,u){this.elementRef=l,this.control=n,this.dimlessBinaryPerSecondPipe=e,this.formatter=u,this.ngModelChange=new t.EventEmitter,this.el=this.elementRef.nativeElement}ngOnInit(){this.setValue(this.el.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.el.value))}setValue(l){/^[\d.]+$/.test(l)&&(l+=this.defaultUnit||"m");const n=this.formatter.toBytes(l,0),e=this.round(n);this.el.value=this.dimlessBinaryPerSecondPipe.transform(e),null!==n?(this.ngModelChange.emit(this.el.value),this.control.control.setValue(this.el.value)):(this.ngModelChange.emit(null),this.control.control.setValue(null))}round(l){if(null!==l&&0!==l){if(!c.isUndefined(this.minBytes)&&lthis.maxBytes)return this.maxBytes;if(!c.isUndefined(this.roundPower)){const n=Math.round(Math.log(l)/Math.log(this.roundPower));return Math.pow(this.roundPower,n)}}return l}onBlur(l){this.setValue(l)}}class h{constructor(l,n){this.formatter=l,this.ngControl=n}setValue(l){const n=this.formatter.toIops(l);this.ngControl.control.setValue(n+" IOPS")}ngOnInit(){this.setValue(this.ngControl.value),this.ngDataReady&&this.ngDataReady.subscribe(()=>this.setValue(this.ngControl.value))}onUpdate(l){this.setValue(l)}}var g=e("mXUL"),f=e("4HWh"),v=e("p4Cf"),b=e("SVse");e("rFfW"),e("o8EM"),e.d(n,"a",(function(){return C})),e.d(n,"b",(function(){return E}));var C=t["ɵcrt"]({encapsulation:0,styles:[[".collapsible[_ngcontent-%COMP%]{cursor:pointer;-moz-user-select:none;user-select:none}"]],data:{}});function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdMilliseconds",""],["class","form-control"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,2).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,2)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,7).onUpdate(e.target.value)&&u),u}),null,null)),t["ɵdid"](2,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](4,671744,null,0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](6,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](7,81920,null,0,s,[u.q,i.a],{ngDataReady:[0,"ngDataReady"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,u.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function R(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdDimlessBinaryPerSecond",""],["class","form-control"],["defaultUnit","b"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,2).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,2)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,7).onBlur(e.target.value)&&u),u}),null,null)),t["ɵdid"](2,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](4,671744,null,0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](6,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](7,81920,null,0,p,[t.ElementRef,u.q,m.a,i.a],{ngDataReady:[0,"ngDataReady"],defaultUnit:[1,"defaultUnit"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,u.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady,"b"),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function _(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,8,"input",[["cdIops",""],["class","form-control"],["type","text"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,2)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,2).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,2)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,2)._compositionEnd(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,7).onUpdate(e.target.value)&&u),u}),null,null)),t["ɵdid"](2,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](4,671744,null,0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](6,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](7,81920,null,0,h,[i.a,u.q],{ngDataReady:[0,"ngDataReady"]},null),t["ɵdid"](8,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](9,16384,null,0,d.h,[[3,u.d],d.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,n.parent.context.$implicit.name),l(n,7,0,e.ngDataReady),l(n,9,0,n.parent.context.$implicit.name)}),(function(l,n){l(n,1,1,[n.parent.context.$implicit.name,n.parent.context.$implicit.name,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,9).validClass,t["ɵnov"](n,9).invalidClass])}))}function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The mininum value is 0"]))],null,null)}function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,29,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,g.b,g.a)),t["ɵdid"](1,1163264,null,2,d.c,[t.ElementRef,d.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](5,null,["",""])),(l()(),t["ɵeld"](6,0,null,null,2,"cd-helper",[],null,null,null,f.b,f.a)),t["ɵdid"](7,49152,null,0,v.a,[],null,null),(l()(),t["ɵted"](8,0,["",""])),(l()(),t["ɵeld"](9,0,null,0,20,"div",[],[[8,"className",0]],null,null,null,null)),(l()(),t["ɵeld"](10,0,null,null,17,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,7,null,null,null,null,null,null,null)),t["ɵdid"](12,16384,null,0,b.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,S)),t["ɵdid"](14,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,R)),t["ɵdid"](16,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,_)),t["ɵdid"](18,278528,null,0,b.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,b.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵeld"](19,0,null,null,8,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](20,0,null,null,7,"button",[["class","btn btn-light"],["data-toggle","button"],["title","Remove the local configuration value. The parent configuration value will be inherited and used instead."],["type","button"]],null,[[null,"click"]],(function(l,n,e){var t=!0;return"click"===n&&(t=!1!==l.component.reset(l.context.$implicit.name)&&t),t}),null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](22,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),t["ɵpod"](23,{active:0}),(l()(),t["ɵeld"](24,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](26,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵpad"](27,1),(l()(),t["ɵand"](16777216,null,null,1,null,w)),t["ɵdid"](29,16384,null,0,b.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,n.context.$implicit.type),l(n,14,0,e.configurationType.milliseconds),l(n,16,0,e.configurationType.bps),l(n,18,0,e.configurationType.iops);var u=l(n,23,0,e.isDisabled(n.context.$implicit.name));l(n,22,0,"btn btn-light",u);var i=l(n,27,0,e.icons.erase);l(n,26,0,i),l(n,29,0,e.form.showError("configuration."+n.context.$implicit.name,t["ɵnov"](n.parent.parent,0),"min"))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess),l(n,4,0,n.context.$implicit.name),l(n,5,0,n.context.$implicit.displayName),l(n,8,0,n.context.$implicit.description),l(n,9,0,t["ɵinlineInterpolate"](1,"cd-col-form-input ",n.parent.context.$implicit.heading,""))}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,5,"h4",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵeld"](2,0,null,null,4,"span",[["class","collapsible"]],null,[[null,"click"]],(function(l,n,e){var t=!0;return"click"===n&&(t=!1!==l.component.toggleSectionVisibility(l.context.$implicit.class)&&t),t}),null,null)),(l()(),t["ɵted"](3,null,[" "," "])),(l()(),t["ɵeld"](4,0,null,null,2,"i",[["aria-hidden","true"]],null,null,null,null,null)),t["ɵprd"](512,null,b["ɵNgClassImpl"],b["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](6,278528,null,0,b.NgClass,[b["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),(l()(),t["ɵeld"](7,0,null,null,2,"div",[],[[8,"className",0],[8,"hidden",0]],null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,y)),t["ɵdid"](9,278528,null,0,b.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,6,0,e.sectionVisibility[n.context.$implicit.class]?e.icons.minusCircle:e.icons.addCircle),l(n,9,0,n.context.$implicit.options)}),(function(l,n){var e=n.component;l(n,3,0,n.context.$implicit.heading),l(n,7,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.class,""),!e.sectionVisibility[n.context.$implicit.class])}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,[["cfgFormGroup",1]],null,8,"fieldset",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,1).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,1).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,4).onSubmit()&&u),u}),null,null)),t["ɵdid"](1,540672,null,0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](3,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](4,16384,null,0,d.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](5,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["RBD Configuration"])),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](8,278528,null,0,b.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.form.get("configuration")),l(n,4,0,e.form.get("configuration")),l(n,8,0,e.rbdConfigurationService.sections)}),(function(l,n){l(n,0,0,t["ɵnov"](n,3).ngClassUntouched,t["ɵnov"](n,3).ngClassTouched,t["ɵnov"](n,3).ngClassPristine,t["ɵnov"](n,3).ngClassDirty,t["ɵnov"](n,3).ngClassValid,t["ɵnov"](n,3).ngClassInvalid,t["ɵnov"](n,3).ngClassPending)}))}},E7j4:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("EEJc"),d=e("ajRT"),c=e("mXUL"),m=e("IZUe"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("+26A"),S=e("LqlI"),R=e("XED3"),_=e("kn/O");e.d(n,"a",(function(){return D}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.key),l(n,2,0,n.context.$implicit.key)}),(function(l,n){l(n,3,0,n.context.$implicit.desc)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,7,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,3).onChange(e.target.checked)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,3).onTouched()&&u),u}),null,null)),t["ɵdid"](2,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](3,16384,null,0,u.c,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.c]),t["ɵdid"](5,671744,[[5,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](7,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](9,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](10,null,["",""]))],(function(l,n){l(n,5,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,8,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""))}),(function(l,n){l(n,1,1,[t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵnov"](n,7).ngClassUntouched,t["ɵnov"](n,7).ngClassTouched,t["ɵnov"](n,7).ngClassPristine,t["ɵnov"](n,7).ngClassDirty,t["ɵnov"](n,7).ngClassValid,t["ɵnov"](n,7).ngClassInvalid,t["ɵnov"](n,7).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass]),l(n,9,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,10,0,n.context.$implicit.name)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["At least one pool is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The token is invalid."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,89,"cd-modal",[],null,null,null,r.c,r.b)),t["ɵdid"](1,49152,null,0,d.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Import Bootstrap Token"])),(l()(),t["ɵeld"](4,0,null,1,85,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,84,"form",[["class","form"],["name","importBootstrapForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,u.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](9,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,71,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To import a bootstrap token which was created by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, provide the generated token, and click "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Import"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](19,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,27).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,27)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](25,4210688,null,0,m.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](29,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](31,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](32,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,y)),t["ɵdid"](34,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](36,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](39,0,null,0,2,"label",[["class","col-form-label"],["for","direction"]],null,null,null,null,null)),(l()(),t["ɵeld"](40,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Direction"])),(l()(),t["ɵeld"](42,0,null,0,9,"select",[["class","form-control custom-select"],["formControlName","direction"],["id","direction"],["name","direction"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,44).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,44).onTouched()&&u),u}),null,null)),t["ɵdid"](43,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](44,16384,null,0,u.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.A]),t["ɵdid"](46,671744,[[3,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](48,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](49,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](51,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](52,0,null,null,12,"div",[["class","form-group"],["formGroupName","pools"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](53,212992,null,0,u.m,[[3,u.d],[8,null],[8,null]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.d,null,[u.m]),t["ɵdid"](55,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](56,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](59,0,null,0,1,"label",[["class","col-form-label required"],["for","pools"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵand"](16777216,null,0,1,null,E)),t["ɵdid"](62,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,I)),t["ɵdid"](64,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](65,0,null,null,17,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](66,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](69,0,null,0,1,"label",[["class","col-form-label required"],["for","token"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Token"])),(l()(),t["ɵeld"](71,0,null,0,7,"textarea",[["class","form-control resize-vertical"],["formControlName","token"],["id","token"],["placeholder","Generated token..."]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,72)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,72).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,72)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,72)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](72,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](74,671744,[[7,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](76,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](77,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵted"](-1,null,[" "])),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](80,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](82,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](83,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](84,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](85,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.import()&&t),t}),h.b,h.a)),t["ɵdid"](86,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Import"])),(l()(),t["ɵeld"](88,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,f.b,f.a)),t["ɵdid"](89,49152,null,0,v.a,[p.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.importBootstrapForm),l(n,10,0,e.importBootstrapForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,34,0,e.importBootstrapForm.showError("siteName",t["ɵnov"](n,7),"required")),l(n,36,0),l(n,46,0,"direction"),l(n,49,0,"direction"),l(n,51,0,e.directions),l(n,53,0,"pools"),l(n,56,0),l(n,62,0,e.pools),l(n,64,0,e.importBootstrapForm.showError("pools",t["ɵnov"](n,7),"requirePool")),l(n,66,0),l(n,74,0,"token"),l(n,77,0,"token"),l(n,80,0,e.importBootstrapForm.showError("token",t["ɵnov"](n,7),"required")),l(n,82,0,e.importBootstrapForm.showError("token",t["ɵnov"](n,7),"invalidToken")),l(n,86,0,e.importBootstrapForm),l(n,89,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass),l(n,35,0,t["ɵnov"](n,36).hasErrors,t["ɵnov"](n,36).hasSuccess),l(n,42,0,t["ɵnov"](n,48).ngClassUntouched,t["ɵnov"](n,48).ngClassTouched,t["ɵnov"](n,48).ngClassPristine,t["ɵnov"](n,48).ngClassDirty,t["ɵnov"](n,48).ngClassValid,t["ɵnov"](n,48).ngClassInvalid,t["ɵnov"](n,48).ngClassPending,t["ɵnov"](n,49).validClass,t["ɵnov"](n,49).invalidClass),l(n,52,0,t["ɵnov"](n,55).ngClassUntouched,t["ɵnov"](n,55).ngClassTouched,t["ɵnov"](n,55).ngClassPristine,t["ɵnov"](n,55).ngClassDirty,t["ɵnov"](n,55).ngClassValid,t["ɵnov"](n,55).ngClassInvalid,t["ɵnov"](n,55).ngClassPending,t["ɵnov"](n,56).hasErrors,t["ɵnov"](n,56).hasSuccess),l(n,65,0,t["ɵnov"](n,66).hasErrors,t["ɵnov"](n,66).hasSuccess),l(n,71,0,t["ɵnov"](n,76).ngClassUntouched,t["ɵnov"](n,76).ngClassTouched,t["ɵnov"](n,76).ngClassPristine,t["ɵnov"](n,76).ngClassDirty,t["ɵnov"](n,76).ngClassValid,t["ɵnov"](n,76).ngClassInvalid,t["ɵnov"](n,76).ngClassPending,t["ɵnov"](n,77).validClass,t["ɵnov"](n,77).invalidClass)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-bootstrap-import-modal",[],null,null,null,V,w)),t["ɵdid"](1,245760,null,0,C.a,[S.a,R.a,_.a],null,null)],(function(l,n){l(n,1,0)}),null)}var D=t["ɵccf"]("cd-bootstrap-import-modal",C.a,T,{},{},[])},EFGL:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("SVse"),i=e("IzCI"),s=e("aXbf"),a=e("dEH0"),o=e("BQkM"),r=e("25BL"),d=e("uIqm");e("aAWM"),e("o8EM"),e("GiVz"),e.d(n,"a",(function(){return c})),e.d(n,"b",(function(){return R}));var c=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function m(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Global"]))],null,null)}function p(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Image"]))],null,null)}function h(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"]))],null,null)}function g(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"div",[],null,null,null,null,null)),t["ɵdid"](1,16384,null,0,u.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,m)),t["ɵdid"](3,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,p)),t["ɵdid"](5,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,h)),t["ɵdid"](7,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null)],(function(l,n){l(n,1,0,n.context.value),l(n,3,0,"global"),l(n,5,0,"image"),l(n,7,0,"pool")}),null)}function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,0),n.parent.context.value));l(n,1,0,e)}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,1),n.parent.context.value));l(n,1,0,e)}))}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),t["ɵppd"](2,1)],null,(function(l,n){var e=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),n.parent.context.value));l(n,1,0,e)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,9,"div",[],null,null,null,null,null)),t["ɵdid"](1,16384,null,0,u.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,f)),t["ɵdid"](3,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,v)),t["ɵdid"](5,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,b)),t["ɵdid"](7,278528,null,0,u.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,C)),t["ɵdid"](9,16384,null,0,u.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,u.NgSwitch],null,null)],(function(l,n){var e=n.component;l(n,1,0,n.context.row.type),l(n,3,0,e.typeField.bps),l(n,5,0,e.typeField.milliseconds),l(n,7,0,e.typeField.iops)}),null)}function R(l){return t["ɵvid"](0,[t["ɵpid"](0,i.a,[s.a]),t["ɵpid"](0,a.a,[]),t["ɵpid"](0,o.a,[]),t["ɵqud"](402653184,1,{configurationSourceTpl:0}),t["ɵqud"](402653184,2,{configurationValueTpl:0}),t["ɵqud"](402653184,3,{poolConfTable:0}),(l()(),t["ɵeld"](6,0,null,null,1,"cd-table",[["identifier","name"]],null,null,null,r.b,r.a)),t["ɵdid"](7,2867200,[[3,4],["poolConfTable",4]],0,d.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],identifier:[2,"identifier"]},null),(l()(),t["ɵand"](0,[[1,2],["configurationSourceTpl",2]],null,0,null,g)),(l()(),t["ɵand"](0,[[2,2],["configurationValueTpl",2]],null,0,null,S))],(function(l,n){var e=n.component;l(n,7,0,e.data,e.poolConfigurationColumns,"name")}),null)}},F83c:function(l,n,e){"use strict";e.d(n,"a",(function(){return m}));var t=e("mrSG"),u=e("IheW"),i=e("LvDl"),s=e("lJxs"),a=e("xTzq"),o=e("jVDg"),r=e("o8EM"),d=e("8Y7J"),c=e("pL04");let m=(()=>{let l=class{constructor(l,n){this.http=l,this.rbdConfigurationService=n}isRBDPool(l){return-1!==i.indexOf(l.application_metadata,"rbd")&&!l.pool_name.includes("/")}create(l){return this.http.post("api/block/image",l,{observe:"response"})}delete(l){return this.http.delete("api/block/image/"+l.toStringEncoded(),{observe:"response"})}update(l,n){return this.http.put("api/block/image/"+l.toStringEncoded(),n,{observe:"response"})}get(l){return this.http.get("api/block/image/"+l.toStringEncoded())}list(){return this.http.get("api/block/image").pipe(Object(s.a)(l=>l.map(l=>(l.value.map(l=>l.configuration?(l.configuration.map(l=>Object.assign(l,this.rbdConfigurationService.getOptionByName(l.name))),l):l),l))))}copy(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/copy`,n,{observe:"response"})}flatten(l){return this.http.post(`api/block/image/${l.toStringEncoded()}/flatten`,null,{observe:"response"})}defaultFeatures(){return this.http.get("api/block/image/default_features")}createSnapshot(l,n){const e={snapshot_name:n};return this.http.post(`api/block/image/${l.toStringEncoded()}/snap`,e,{observe:"response"})}renameSnapshot(l,n,e){const t={new_snap_name:e};return this.http.put(`api/block/image/${l.toStringEncoded()}/snap/${n}`,t,{observe:"response"})}protectSnapshot(l,n,e){const t={is_protected:e};return this.http.put(`api/block/image/${l.toStringEncoded()}/snap/${n}`,t,{observe:"response"})}rollbackSnapshot(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/snap/${n}/rollback`,null,{observe:"response"})}cloneSnapshot(l,n,e){return this.http.post(`api/block/image/${l.toStringEncoded()}/snap/${n}/clone`,e,{observe:"response"})}deleteSnapshot(l,n){return this.http.delete(`api/block/image/${l.toStringEncoded()}/snap/${n}`,{observe:"response"})}listTrash(){return this.http.get("api/block/image/trash/")}createNamespace(l,n){return this.http.post(`api/block/pool/${l}/namespace`,{namespace:n},{observe:"response"})}listNamespaces(l){return this.http.get(`api/block/pool/${l}/namespace/`)}deleteNamespace(l,n){return this.http.delete(`api/block/pool/${l}/namespace/${n}`,{observe:"response"})}moveTrash(l,n){return this.http.post(`api/block/image/${l.toStringEncoded()}/move_trash`,{delay:n},{observe:"response"})}purgeTrash(l){return this.http.post("api/block/image/trash/purge/?pool_name="+l,null,{observe:"response"})}restoreTrash(l,n){return this.http.post(`api/block/image/trash/${l.toStringEncoded()}/restore`,{new_image_name:n},{observe:"response"})}removeTrash(l,n=!1){return this.http.delete(`api/block/image/trash/${l.toStringEncoded()}/?force=${n}`,{observe:"response"})}};return l.ngInjectableDef=d["ɵɵdefineInjectable"]({factory:function(){return new l(d["ɵɵinject"](u.c),d["ɵɵinject"](r.a))},token:l,providedIn:c.a}),t.__decorate([t.__param(1,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String]),t.__metadata("design:returntype",void 0)],l.prototype,"createSnapshot",null),t.__decorate([t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String,String]),t.__metadata("design:returntype",void 0)],l.prototype,"renameSnapshot",null),t.__decorate([t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String,Boolean]),t.__metadata("design:returntype",void 0)],l.prototype,"protectSnapshot",null),t.__decorate([t.__param(1,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[o.a,String]),t.__metadata("design:returntype",void 0)],l.prototype,"restoreTrash",null),l=t.__decorate([a.a,t.__metadata("design:paramtypes",[u.c,r.a])],l),l})()},Fd71:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("s7LF"),u=e("XNiG"),i=(e("F83c"),e("sne2"),e("QFaf")),s=e("kvvV"),a=e("jVDg");e("9nlD"),e("VXsX");class o{constructor(l,n,e,t,u,i){this.modalRef=l,this.rbdService=n,this.taskManagerService=e,this.notificationService=t,this.i18n=u,this.actionLabels=i,this.editing=!1,this.action=this.actionLabels.CREATE,this.resource=this.i18n("RBD Snapshot"),this.createForm()}createForm(){this.snapshotForm=new i.a({snapshotName:new t.i("",{validators:[t.B.required]})})}ngOnInit(){this.onSubmit=new u.a}setSnapName(l){this.snapName=l,this.snapshotForm.get("snapshotName").setValue(l)}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.RENAME:this.actionLabels.CREATE}editAction(){const l=this.snapshotForm.getValue("snapshotName"),n=new a.a(this.poolName,this.namespace,this.imageName),e=new s.a;e.name="rbd/snap/edit",e.metadata={image_spec:n.toString(),snapshot_name:l},this.rbdService.renameSnapshot(n,this.snapName,l).toPromise().then(()=>{this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)}),this.modalRef.hide(),this.onSubmit.next(this.snapName)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}createAction(){const l=this.snapshotForm.getValue("snapshotName"),n=new a.a(this.poolName,this.namespace,this.imageName),e=new s.a;e.name="rbd/snap/create",e.metadata={image_spec:n.toString(),snapshot_name:l},this.rbdService.createSnapshot(n,l).toPromise().then(()=>{this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)}),this.modalRef.hide(),this.onSubmit.next(l)}).catch(()=>{this.snapshotForm.setErrors({cdSubmitButton:!0})})}submit(){this.editing?this.editAction():this.createAction()}}},I4Qz:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("EEJc"),i=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("SVse"),r=e("mXUL"),d=e("ienR"),c=e("z/SZ"),m=e("ANnk"),p=e("f/UV"),h=e("aexS"),g=e("gp3X"),f=e("sb0X"),v=e("KVJa"),b=e("Z21x"),C=e("sne2"),S=e("2JDI"),R=e("F83c"),_=e("LqlI"),w=e("2EZI"),y=e("kn/O");e.d(n,"a",(function(){return T}));var k=t["ɵcrt"]({encapsulation:0,styles:[[".bs-datepicker-head bs-datepicker-navigation-view{display:flex;justify-content:space-between}"]],data:{}});function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"div",[["class","alert alert-warning"],["role","alert"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This image contains snapshot(s), which will prevent it from being removed after moved to trash."]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,['Wrong date format. Please use "YYYY-MM-DD HH:mm:ss".']))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Protection has already expired. Please pick a future date or leave it empty."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,49,"cd-modal",[],null,null,null,u.c,u.b)),t["ɵdid"](1,49152,null,0,i.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Move an image to trash"])),(l()(),t["ɵeld"](4,0,null,1,45,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,44,"form",[["class","form"],["name","moveForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,31,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](13,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](14,0,null,null,7,"p",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To move "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](17,null,["",""])),(l()(),t["ɵted"](-1,null,[" to trash, click "])),(l()(),t["ɵeld"](19,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Move Image"])),(l()(),t["ɵted"](-1,null,[". Optionally, you can pick an expiration date."])),(l()(),t["ɵeld"](22,0,null,null,20,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](23,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](26,0,null,0,1,"label",[["class","col-form-label"],["for","expires"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Protection expires at"])),(l()(),t["ɵeld"](28,16777216,null,0,10,"input",[["bsDatepicker",""],["class","form-control"],["formControlName","expiresAt"],["placeholder","NOT PROTECTED"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"],[null,"keyup.esc"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,29)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,29).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,29)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,29)._compositionEnd(e.target.value)&&u),"change"===n&&(u=!1!==t["ɵnov"](l,31).onChange(e)&&u),"keyup.esc"===n&&(u=!1!==t["ɵnov"](l,31).hide()&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,31).onBlur()&&u),u}),null,null)),t["ɵdid"](29,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵdid"](30,737280,null,0,d.c,[d.a,t.ElementRef,t.Renderer2,t.ViewContainerRef,c.a],{bsConfig:[0,"bsConfig"],minDate:[1,"minDate"]},null),t["ɵdid"](31,16384,null,0,d.f,[d.c,d.l,t.Renderer2,t.ElementRef,t.ChangeDetectorRef],null,null),t["ɵprd"](1024,null,s.o,(function(l){return[l]}),[d.f]),t["ɵprd"](1024,null,s.p,(function(l,n){return[l,n]}),[s.e,d.f]),t["ɵdid"](34,671744,[[1,4]],0,s.j,[[3,s.d],[6,s.o],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](36,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](37,4210688,null,0,m.a,[[2,p.a],h.a,t.ElementRef],null,null),t["ɵdid"](38,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,I)),t["ɵdid"](40,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](42,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](43,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](45,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.moveImage()&&t),t}),g.b,g.a)),t["ɵdid"](46,114688,null,0,f.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Move Image"])),(l()(),t["ɵeld"](48,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,v.b,v.a)),t["ɵdid"](49,49152,null,0,b.a,[o.Location,C.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.moveForm),l(n,10,0,e.moveForm),l(n,13,0,e.hasSnapshots),l(n,23,0),l(n,30,0,e.bsConfig,e.minDate),l(n,34,0,"expiresAt"),l(n,38,0,"expiresAt"),l(n,40,0,e.moveForm.showError("expiresAt",t["ɵnov"](n,7),"format")),l(n,42,0,e.moveForm.showError("expiresAt",t["ɵnov"](n,7),"expired")),l(n,46,0,e.moveForm),l(n,49,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,17,0,e.imageSpecStr),l(n,22,0,t["ɵnov"](n,23).hasErrors,t["ɵnov"](n,23).hasSuccess),l(n,28,0,t["ɵnov"](n,36).ngClassUntouched,t["ɵnov"](n,36).ngClassTouched,t["ɵnov"](n,36).ngClassPristine,t["ɵnov"](n,36).ngClassDirty,t["ɵnov"](n,36).ngClassValid,t["ɵnov"](n,36).ngClassInvalid,t["ɵnov"](n,36).ngClassPending,t["ɵnov"](n,38).validClass,t["ɵnov"](n,38).invalidClass)}))}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-move-modal",[],null,null,null,F,k)),t["ɵdid"](1,114688,null,0,S.a,[R.a,_.a,w.a,y.a],null,null)],(function(l,n){l(n,1,0)}),null)}var T=t["ɵccf"]("cd-rbd-trash-move-modal",S.a,V,{},{},[])},JBea:function(l,n,e){"use strict";e.d(n,"a",(function(){return t})),e("lArG");class t{constructor(){}ngOnChanges(){this.selection&&(this.rbdDashboardUrl=`rbd-details?var-Pool=${this.selection.pool_name}&var-Image=${this.selection.name}`)}}},"JIi+":function(l,n,e){"use strict";var t=e("8Y7J"),u=e("978R"),i=e("z/SZ"),s=e("2uy1"),a=e("SVse"),o=e("pKUh"),r=e("2ZVE"),d=e("25BL"),c=e("uIqm"),m=e("NUGo"),p=e("S7zO"),h=e("VTlA"),g=e("ufoC"),f=e("mSOc"),v=e("wd/R"),b=e("LRne"),C=e("F83c"),S=e("OLbh"),R=e("0+/T"),_=e("sne2"),w=e("x38r"),y=e("vCyI"),k=e("QTAa"),E=e("kvvV"),I=e("jVDg"),N=e("a0VL"),F=e("Fgil"),V=e("aexS"),T=e("9nlD"),D=e("VXsX"),x=e("Fd71"),P=e("LvDl"),q=e("oxzT");class B{constructor(l,n,e){this.i18n=l,this.create={permission:"create",icon:q.a.add,name:n.CREATE},this.rename={permission:"update",icon:q.a.edit,name:n.RENAME},this.protect={permission:"update",icon:q.a.lock,visible:l=>l.hasSingleSelection&&!l.first().is_protected,name:n.PROTECT},this.unprotect={permission:"update",icon:q.a.unlock,visible:l=>l.hasSingleSelection&&l.first().is_protected,name:n.UNPROTECT},this.clone={permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>this.getCloneDisableDesc(l,e),icon:q.a.clone,name:n.CLONE},this.copy={permission:"create",canBePrimary:l=>l.hasSingleSelection,disable:l=>!l.hasSingleSelection||l.first().cdExecuting,icon:q.a.copy,name:n.COPY},this.rollback={permission:"update",icon:q.a.undo,name:n.ROLLBACK},this.deleteSnap={permission:"delete",icon:q.a.destroy,disable:l=>{const n=l.first();return!l.hasSingleSelection||n.cdExecuting||n.is_protected},name:n.DELETE},this.ordering=[this.create,this.rename,this.protect,this.unprotect,this.clone,this.copy,this.rollback,this.deleteSnap]}getCloneDisableDesc(l,n){return!(l&&l.hasSingleSelection&&!l.first().cdExecuting)||!P.includes(n,"layering")&&this.i18n("Parent image must support Layering")}}class A{}class M{constructor(l,n,e,t,u,i,s,a,o,r,d){this.authStorageService=l,this.modalService=n,this.dimlessBinaryPipe=e,this.cdDatePipe=t,this.rbdService=u,this.taskManagerService=i,this.notificationService=s,this.summaryService=a,this.taskListService=o,this.i18n=r,this.actionLabels=d,this.snapshots=[],this.selection=new y.a,this.builders={"rbd/snap/create":l=>{const n=new A;return n.name=l.snapshot_name,n}},this.permission=this.authStorageService.getPermissions().rbdImage}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"name",cellTransformation:w.a.executing,flexGrow:2},{name:this.i18n("Size"),prop:"size",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("Provisioned"),prop:"disk_usage",flexGrow:1,cellClass:"text-right",pipe:this.dimlessBinaryPipe},{name:this.i18n("State"),prop:"is_protected",flexGrow:1,cellTransformation:w.a.badge,customTemplateConfig:{map:{true:{value:this.i18n("PROTECTED"),class:"badge-success"},false:{value:this.i18n("UNPROTECTED"),class:"badge-info"}}}},{name:this.i18n("Created"),prop:"timestamp",flexGrow:1,pipe:this.cdDatePipe}]}ngOnChanges(){const l=new I.a(this.poolName,this.namespace,this.rbdName),n=new B(this.i18n,this.actionLabels,this.featuresName);n.create.click=()=>this.openCreateSnapshotModal(),n.rename.click=()=>this.openEditSnapshotModal(),n.protect.click=()=>this.toggleProtection(),n.unprotect.click=()=>this.toggleProtection();const e=()=>this.selection.first()&&`${l.toStringEncoded()}/${encodeURIComponent(this.selection.first().name)}`;n.clone.routerLink=()=>"/block/rbd/clone/"+e(),n.copy.routerLink=()=>"/block/rbd/copy/"+e(),n.rollback.click=()=>this.rollbackModal(),n.deleteSnap.click=()=>this.deleteSnapshotModal(),this.tableActions=n.ordering,this.taskListService.init(()=>Object(b.a)(this.snapshots),null,l=>this.data=l,()=>this.data=this.snapshots,n=>["rbd/snap/create","rbd/snap/delete","rbd/snap/edit","rbd/snap/rollback"].includes(n.name)&&l.toString()===n.metadata.image_spec,(l,n)=>l.name===n.metadata.snapshot_name,this.builders)}openSnapshotModal(l,n=null){this.modalRef=this.modalService.show(x.a),this.modalRef.content.poolName=this.poolName,this.modalRef.content.imageName=this.rbdName,this.modalRef.content.namespace=this.namespace,n?this.modalRef.content.setEditing():n=`${this.rbdName}_${v().toISOString(!0)}`,this.modalRef.content.setSnapName(n),this.modalRef.content.onSubmit.subscribe(n=>{const e=new k.a;e.name=l,e.metadata={image_name:this.rbdName,pool_name:this.poolName,snapshot_name:n},this.summaryService.addRunningTask(e),this.ngOnChanges()})}openCreateSnapshotModal(){this.openSnapshotModal("rbd/snap/create")}openEditSnapshotModal(){this.openSnapshotModal("rbd/snap/edit",this.selection.first().name)}toggleProtection(){const l=this.selection.first().name,n=this.selection.first().is_protected,e=new E.a;e.name="rbd/snap/edit";const t=new I.a(this.poolName,this.namespace,this.rbdName);e.metadata={image_spec:t.toString(),snapshot_name:l},this.rbdService.protectSnapshot(t,l,!n).toPromise().then(()=>{const l=new k.a;l.name=e.name,l.metadata=e.metadata,this.summaryService.addRunningTask(l),this.ngOnChanges(),this.taskManagerService.subscribe(e.name,e.metadata,l=>{this.notificationService.notifyTask(l)})})}_asyncTask(l,n,e){const t=new E.a;t.name=n,t.metadata={image_spec:new I.a(this.poolName,this.namespace,this.rbdName).toString(),snapshot_name:e};const u=new I.a(this.poolName,this.namespace,this.rbdName);this.rbdService[l](u,e).toPromise().then(()=>{const l=new k.a;l.name=t.name,l.metadata=t.metadata,this.summaryService.addRunningTask(l),this.modalRef.hide(),this.ngOnChanges(),this.taskManagerService.subscribe(l.name,l.metadata,l=>{this.notificationService.notifyTask(l)})}).catch(()=>{this.modalRef.content.stopLoadingSpinner()})}rollbackModal(){const l=this.selection.selected[0].name,n=new I.a(this.poolName,this.namespace,this.rbdName).toString(),e={titleText:this.i18n("RBD snapshot rollback"),buttonText:this.i18n("Rollback"),bodyTpl:this.rollbackTpl,bodyData:{snapName:`${n}@${l}`},onSubmit:()=>{this._asyncTask("rollbackSnapshot","rbd/snap/rollback",l)}};this.modalRef=this.modalService.show(S.a,{initialState:e})}deleteSnapshotModal(){const l=this.selection.selected[0].name;this.modalRef=this.modalService.show(R.a,{initialState:{itemDescription:this.i18n("RBD snapshot"),itemNames:[l],submitAction:()=>this._asyncTask("deleteSnapshot","rbd/snap/delete",l)}})}updateSelection(l){this.selection=l}}var O=e("LqlI"),L=e("GiVz"),j=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function U(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["You are about to rollback"])),(l()(),t["ɵeld"](2,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](3,null,[" ",""])),(l()(),t["ɵted"](-1,null,[".\n"]))],null,(function(l,n){l(n,3,0,n.context.$implicit.snapName)}))}function G(l){return t["ɵvid"](0,[t["ɵqud"](671088640,1,{nameTpl:0}),t["ɵqud"](402653184,2,{rollbackTpl:0}),(l()(),t["ɵeld"](2,0,null,null,3,"cd-table",[["columnMode","flex"],["selectionType","single"]],null,[[null,"updateSelection"]],(function(l,n,e){var t=!0;return"updateSelection"===n&&(t=!1!==l.component.updateSelection(e)&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],selectionType:[3,"selectionType"]},{updateSelection:"updateSelection"}),(l()(),t["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,m.b,m.a)),t["ɵdid"](5,114688,null,0,p.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵand"](0,[[2,2],["rollbackTpl",2]],null,0,null,U))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex","single"),l(n,5,0,e.permission,e.selection,e.tableActions)}),null)}var $=e("EFGL"),X=e("aAWM"),z=e("aXbf"),W=e("o8EM"),J=e("a278"),Y=e("insk"),K=e("cUpR"),Z=e("20UP"),H=e("nSDx"),Q=e("o4+5"),ll=e("JBea");e.d(n,"b",(function(){return nl})),e.d(n,"c",(function(){return gl})),e.d(n,"a",(function(){return vl}));var nl=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function el(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Only available for RBD images with "])),(l()(),t["ɵeld"](2,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["fast-diff"])),(l()(),t["ɵted"](-1,null,[" enabled"]))],null,null)}function tl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[["class","badge badge-dark mr-2"]],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""]))],null,(function(l,n){l(n,2,0,n.context.$implicit)}))}function ul(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"span",[["class","form-text text-muted"],["placement","top"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,u.c,[t.ViewContainerRef,i.a,u.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"],placement:[1,"placement"]},null),(l()(),t["ɵted"](-1,null,["N/A"]))],(function(l,n){l(n,2,0,t["ɵnov"](n.parent.parent,5),"top")}),null)}function il(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,[" "," "])),t["ɵppd"](2,1)],null,(function(l,n){var e=n.component,u=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),e.selection.disk_usage));l(n,1,0,u)}))}function sl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"span",[["class","form-text text-muted"],["placement","top"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,u.c,[t.ViewContainerRef,i.a,u.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"],placement:[1,"placement"]},null),(l()(),t["ɵted"](-1,null,["N/A"]))],(function(l,n){l(n,2,0,t["ɵnov"](n.parent.parent,5),"top")}),null)}function al(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,[" "," "])),t["ɵppd"](2,1)],null,(function(l,n){var e=n.component,u=t["ɵunv"](n,1,0,l(n,2,0,t["ɵnov"](n.parent.parent,2),e.selection.total_disk_usage));l(n,1,0,u)}))}function ol(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["/",""]))],null,(function(l,n){l(n,1,0,n.component.selection.parent.pool_namespace)}))}function rl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""])),(l()(),t["ɵand"](16777216,null,null,1,null,ol)),t["ɵdid"](3,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵted"](4,null,["/","@",""]))],(function(l,n){l(n,3,0,n.component.selection.parent.pool_namespace)}),(function(l,n){var e=n.component;l(n,1,0,e.selection.parent.pool_name),l(n,4,0,e.selection.parent.image_name,e.selection.parent.snap_name)}))}function dl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["-"]))],null,null)}function cl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,114,"tabset",[],[[2,"tab-container",null]],null,null,o.b,o.a)),t["ɵdid"](1,180224,null,0,r.e,[r.f,t.Renderer2,t.ElementRef],null,null),(l()(),t["ɵeld"](2,0,null,0,99,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](3,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](4,0,null,null,97,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,96,"tbody",[],null,null,null,null,null)),(l()(),t["ɵeld"](6,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](7,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Name"])),(l()(),t["ɵeld"](9,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),t["ɵted"](10,null,["",""])),(l()(),t["ɵeld"](11,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool"])),(l()(),t["ɵeld"](14,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](15,null,["",""])),(l()(),t["ɵeld"](16,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Data Pool"])),(l()(),t["ɵeld"](19,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](20,null,["",""])),t["ɵppd"](21,1),(l()(),t["ɵeld"](22,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Created"])),(l()(),t["ɵeld"](25,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](26,null,["",""])),t["ɵppd"](27,1),(l()(),t["ɵeld"](28,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](29,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Size"])),(l()(),t["ɵeld"](31,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](32,null,["",""])),t["ɵppd"](33,1),(l()(),t["ɵeld"](34,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Objects"])),(l()(),t["ɵeld"](37,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](38,null,["",""])),t["ɵppd"](39,1),(l()(),t["ɵeld"](40,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](41,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Object size"])),(l()(),t["ɵeld"](43,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](44,null,["",""])),t["ɵppd"](45,1),(l()(),t["ɵeld"](46,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](47,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Features"])),(l()(),t["ɵeld"](49,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,tl)),t["ɵdid"](51,278528,null,0,a.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](52,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](53,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Provisioned"])),(l()(),t["ɵeld"](55,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,ul)),t["ɵdid"](57,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,il)),t["ɵdid"](59,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](60,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](61,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Total provisioned"])),(l()(),t["ɵeld"](63,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,sl)),t["ɵdid"](65,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,al)),t["ɵdid"](67,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](68,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](69,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Striping unit"])),(l()(),t["ɵeld"](71,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](72,null,["",""])),t["ɵppd"](73,1),(l()(),t["ɵeld"](74,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](75,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Striping count"])),(l()(),t["ɵeld"](77,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](78,null,["",""])),(l()(),t["ɵeld"](79,0,null,null,7,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](80,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Parent"])),(l()(),t["ɵeld"](82,0,null,null,4,"td",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,rl)),t["ɵdid"](84,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,dl)),t["ɵdid"](86,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](87,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](88,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Block name prefix"])),(l()(),t["ɵeld"](90,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](91,null,["",""])),(l()(),t["ɵeld"](92,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](93,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Order"])),(l()(),t["ɵeld"](95,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](96,null,["",""])),(l()(),t["ɵeld"](97,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),t["ɵeld"](98,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Format Version"])),(l()(),t["ɵeld"](100,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),t["ɵted"](101,null,["",""])),(l()(),t["ɵeld"](102,0,null,0,4,"tab",[["heading","Snapshots"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](103,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](104,0,null,null,2,"cd-rbd-snapshot-list",[],null,null,null,G,j)),t["ɵprd"](131584,null,h.a,h.a,[g.a,f.a]),t["ɵdid"](106,638976,null,0,M,[V.a,O.b,F.a,N.a,C.a,D.a,T.a,f.a,h.a,L.a,_.b],{snapshots:[0,"snapshots"],featuresName:[1,"featuresName"],poolName:[2,"poolName"],namespace:[3,"namespace"],rbdName:[4,"rbdName"]},null),(l()(),t["ɵeld"](107,0,null,0,3,"tab",[["heading","Configuration"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](108,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](109,0,null,null,1,"cd-rbd-configuration-table",[],null,null,null,$.b,$.a)),t["ɵdid"](110,638976,null,0,X.a,[z.a,W.a,L.a],{data:[0,"data"]},null),(l()(),t["ɵeld"](111,0,null,0,3,"tab",[["heading","Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](112,212992,null,0,r.b,[r.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵeld"](113,0,null,null,1,"cd-grafana",[["grafanaStyle","one"],["uid","YhCYGcuZz"]],null,null,null,J.b,J.a)),t["ɵdid"](114,638976,null,0,Y.a,[K.b,Z.a,L.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var e=n.component;l(n,3,0,"Details"),l(n,51,0,e.selection.features_name),l(n,57,0,-1===(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,59,0,-1!==(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,65,0,-1===(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,67,0,-1!==(null==e.selection.features_name?null:e.selection.features_name.indexOf("fast-diff"))),l(n,84,0,e.selection.parent),l(n,86,0,!e.selection.parent),l(n,103,0,"Snapshots"),l(n,106,0,e.selection.snapshots,e.selection.features_name,e.selection.pool_name,e.selection.namespace,e.selection.name),l(n,108,0,"Configuration"),l(n,110,0,e.selection.configuration),l(n,112,0,"Performance"),l(n,114,0,e.rbdDashboardUrl,"one","YhCYGcuZz")}),(function(l,n){var e=n.component;l(n,0,0,t["ɵnov"](n,1).clazz),l(n,2,0,t["ɵnov"](n,3).id,t["ɵnov"](n,3).active,t["ɵnov"](n,3).addClass,t["ɵnov"](n,3).role,t["ɵnov"](n,3).ariaLabelledby),l(n,10,0,e.selection.name),l(n,15,0,e.selection.pool_name);var u=t["ɵunv"](n,20,0,l(n,21,0,t["ɵnov"](n.parent,0),e.selection.data_pool));l(n,20,0,u);var i=t["ɵunv"](n,26,0,l(n,27,0,t["ɵnov"](n.parent,1),e.selection.timestamp));l(n,26,0,i);var s=t["ɵunv"](n,32,0,l(n,33,0,t["ɵnov"](n.parent,2),e.selection.size));l(n,32,0,s);var a=t["ɵunv"](n,38,0,l(n,39,0,t["ɵnov"](n.parent,3),e.selection.num_objs));l(n,38,0,a);var o=t["ɵunv"](n,44,0,l(n,45,0,t["ɵnov"](n.parent,2),e.selection.obj_size));l(n,44,0,o);var r=t["ɵunv"](n,72,0,l(n,73,0,t["ɵnov"](n.parent,2),e.selection.stripe_unit));l(n,72,0,r),l(n,78,0,e.selection.stripe_count),l(n,91,0,e.selection.block_name_prefix),l(n,96,0,e.selection.order),l(n,101,0,e.selection.image_format),l(n,102,0,t["ɵnov"](n,103).id,t["ɵnov"](n,103).active,t["ɵnov"](n,103).addClass,t["ɵnov"](n,103).role,t["ɵnov"](n,103).ariaLabelledby),l(n,107,0,t["ɵnov"](n,108).id,t["ɵnov"](n,108).active,t["ɵnov"](n,108).addClass,t["ɵnov"](n,108).role,t["ɵnov"](n,108).ariaLabelledby),l(n,111,0,t["ɵnov"](n,112).id,t["ɵnov"](n,112).active,t["ɵnov"](n,112).addClass,t["ɵnov"](n,112).role,t["ɵnov"](n,112).ariaLabelledby)}))}function ml(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,16777216,null,null,2,"strong",[["tooltip","This setting overrides the global value"]],null,null,null,null,null)),t["ɵdid"](2,212992,null,0,u.c,[t.ViewContainerRef,i.a,u.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"]},null),(l()(),t["ɵted"](-1,null,["Image"])),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,2,0,"This setting overrides the global value")}),null)}function pl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,16777216,null,null,2,"span",[["tooltip","This is the global value. No value for this option has been set for this image."]],null,null,null,null,null)),t["ɵdid"](1,212992,null,0,u.c,[t.ViewContainerRef,i.a,u.a,t.ElementRef,t.Renderer2,s.a],{tooltip:[0,"tooltip"]},null),(l()(),t["ɵted"](-1,null,["Global"])),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,"This is the global value. No value for this option has been set for this image.")}),null)}function hl(l){return t["ɵvid"](0,[(l()(),t["ɵand"](16777216,null,null,1,null,ml)),t["ɵdid"](1,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),t["ɵand"](0,[["global",2]],null,0,null,pl))],(function(l,n){l(n,1,0,n.context.value-0,t["ɵnov"](n,2))}),null)}function gl(l){return t["ɵvid"](0,[t["ɵpid"](0,H.a,[]),t["ɵpid"](0,N.a,[a.DatePipe]),t["ɵpid"](0,F.a,[z.a]),t["ɵpid"](0,Q.a,[z.a]),t["ɵqud"](402653184,1,{poolConfigurationSourceTpl:0}),(l()(),t["ɵand"](0,[["usageNotAvailableTooltipTpl",2]],null,0,null,el)),(l()(),t["ɵand"](16777216,null,null,1,null,cl)),t["ɵdid"](7,16384,null,0,a.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["poolConfigurationSourceTpl",2]],null,0,null,hl))],(function(l,n){l(n,7,0,n.component.selection)}),null)}function fl(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-details",[],null,null,null,gl,nl)),t["ɵdid"](1,573440,null,0,ll.a,[],null,null)],null,null)}var vl=t["ɵccf"]("cd-rbd-details",ll.a,fl,{selection:"selection",images:"images"},{},[])},L4us:function(l,n,e){"use strict";var t=e("s7LF"),u=(e("XED3"),e("QFaf")),i=e("kvvV");e("kn/O");class s{}e.d(n,"a",(function(){return a}));class a{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.bsConfig={containerClass:"theme-default"},this.createForm()}createForm(){this.editPeerForm=new u.a({clusterName:new t.i("",{validators:[t.B.required,this.validateClusterName]}),clientID:new t.i("",{validators:[t.B.required,this.validateClientID]}),monAddr:new t.i("",{validators:[this.validateMonAddr]}),key:new t.i("",{validators:[this.validateKey]})})}ngOnInit(){this.pattern=`${this.poolName}/${this.peerUUID}`,"edit"===this.mode&&this.rbdMirroringService.getPeer(this.poolName,this.peerUUID).subscribe(l=>{this.setResponse(l)})}validateClusterName(l){if(!l.value.match(/^[\w\-_]*$/))return{invalidClusterName:{value:l.value}}}validateClientID(l){if(!l.value.match(/^(?!client\.)[\w\-_.]*$/))return{invalidClientID:{value:l.value}}}validateMonAddr(l){if(!l.value.match(/^[,; ]*([\w.\-_\[\]]+(:[\d]+)?[,; ]*)*$/))return{invalidMonAddr:{value:l.value}}}validateKey(l){try{if(""===l.value||atob(l.value))return null}catch(n){}return{invalidKey:{value:l.value}}}setResponse(l){this.response=l,this.editPeerForm.get("clusterName").setValue(l.cluster_name),this.editPeerForm.get("clientID").setValue(l.client_id),this.editPeerForm.get("monAddr").setValue(l.mon_host),this.editPeerForm.get("key").setValue(l.key)}update(){const l=new s;let n;l.cluster_name=this.editPeerForm.getValue("clusterName"),l.client_id=this.editPeerForm.getValue("clientID"),l.mon_host=this.editPeerForm.getValue("monAddr"),l.key=this.editPeerForm.getValue("key"),n=this.taskWrapper.wrapTaskAroundCall("edit"===this.mode?{task:new i.a("rbd/mirroring/peer/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePeer(this.poolName,this.peerUUID,l)}:{task:new i.a("rbd/mirroring/peer/add",{pool_name:this.poolName}),call:this.rbdMirroringService.addPeer(this.poolName,l)}),n.subscribe(void 0,()=>this.editPeerForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},MyVl:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("LvDl"),s=e("jtHE"),a=e("cp0P"),o=e("SxV6"),r=e("eIep"),d=(e("Ekvf"),e("F83c"),e("sne2"),e("oxzT")),c=e("QFaf"),m=e("PhyI"),p=e("kvvV"),h=e("jVDg"),g=(e("Fgil"),e("aexS"),e("aXbf"),e("kn/O"),e("u0yg"));class f{constructor(){this.features=[]}}class v{constructor(){this.features=[]}}var b=e("lArG");class C extends b.a{constructor(){super(...arguments),this.features=[]}}class S{constructor(){this.features=[]}}var R=function(l){return l.editing="editing",l.cloning="cloning",l.copying="copying",l}({});e.d(n,"a",(function(){return _}));class _{constructor(l,n,e,u,i,a,o,r,c,m){this.authStorageService=l,this.route=n,this.poolService=e,this.rbdService=u,this.formatter=i,this.taskWrapper=a,this.dimlessBinaryPipe=o,this.i18n=r,this.actionLabels=c,this.router=m,this.namespaces=[],this.namespacesByPoolCache={},this.pools=null,this.allPools=null,this.dataPools=null,this.allDataPools=null,this.featuresList=[],this.initializeConfigData=new t.EventEmitter,this.advancedEnabled=!1,this.rbdFormMode=R,this.defaultObjectSize="4 MiB",this.objectSizes=["4 KiB","8 KiB","16 KiB","32 KiB","64 KiB","128 KiB","256 KiB","512 KiB","1 MiB","2 MiB","4 MiB","8 MiB","16 MiB","32 MiB"],this.rbdImage=new s.a(1),this.icons=d.a,this.poolPermission=this.authStorageService.getPermissions().pool,this.resource=this.i18n("RBD"),this.features={"deep-flatten":{desc:this.i18n("Deep flatten"),requires:null,allowEnable:!1,allowDisable:!0},layering:{desc:this.i18n("Layering"),requires:null,allowEnable:!1,allowDisable:!1},"exclusive-lock":{desc:this.i18n("Exclusive lock"),requires:null,allowEnable:!0,allowDisable:!0},"object-map":{desc:this.i18n("Object map (requires exclusive-lock)"),requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},journaling:{desc:this.i18n("Journaling (requires exclusive-lock)"),requires:"exclusive-lock",allowEnable:!0,allowDisable:!0,initDisabled:!0},"fast-diff":{desc:this.i18n("Fast diff (interlocked with object-map)"),requires:"object-map",allowEnable:!0,allowDisable:!0,interlockedWith:"object-map",initDisabled:!0}},this.featuresList=this.objToArray(this.features),this.createForm()}objToArray(l){return i.map(l,(l,n)=>Object.assign(l,{key:n}))}createForm(){this.rbdForm=new c.a({parent:new u.i(""),name:new u.i("",{validators:[u.B.required,u.B.pattern(/^[^@/]+?$/)]}),pool:new u.i(null,{validators:[u.B.required]}),namespace:new u.i(null),useDataPool:new u.i(!1),dataPool:new u.i(null),size:new u.i(null,{updateOn:"blur"}),obj_size:new u.i(this.defaultObjectSize),features:new c.a(this.featuresList.reduce((l,n)=>(l[n.key]=new u.i({value:!1,disabled:!!n.initDisabled}),l),{})),stripingUnit:new u.i(null),stripingCount:new u.i(null,{updateOn:"blur"})},this.validateRbdForm(this.formatter))}disableForEdit(){this.rbdForm.get("parent").disable(),this.rbdForm.get("pool").disable(),this.rbdForm.get("namespace").disable(),this.rbdForm.get("useDataPool").disable(),this.rbdForm.get("dataPool").disable(),this.rbdForm.get("obj_size").disable(),this.rbdForm.get("stripingUnit").disable(),this.rbdForm.get("stripingCount").disable(),this.rbdImage.subscribe(l=>{l.image_format===g.a.V1&&(this.rbdForm.get("deep-flatten").disable(),this.rbdForm.get("layering").disable(),this.rbdForm.get("exclusive-lock").disable())})}disableForClone(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}disableForCopy(){this.rbdForm.get("parent").disable(),this.rbdForm.get("size").disable()}ngOnInit(){let l;this.router.url.startsWith("/block/rbd/edit")?(this.mode=this.rbdFormMode.editing,this.action=this.actionLabels.EDIT,this.disableForEdit()):this.router.url.startsWith("/block/rbd/clone")?(this.mode=this.rbdFormMode.cloning,this.disableForClone(),this.action=this.actionLabels.CLONE):this.router.url.startsWith("/block/rbd/copy")?(this.mode=this.rbdFormMode.copying,this.action=this.actionLabels.COPY,this.disableForCopy()):this.action=this.actionLabels.CREATE,function(l){l.RbdServiceGet="rbdService.get",l.PoolServiceList="poolService.list"}(l||(l={}));const n={};this.mode===this.rbdFormMode.editing||this.mode===this.rbdFormMode.cloning||this.mode===this.rbdFormMode.copying?this.route.params.subscribe(e=>{const t=h.a.fromString(decodeURIComponent(e.image_spec));e.snap&&(this.snapName=decodeURIComponent(e.snap)),n[l.RbdServiceGet]=this.rbdService.get(t)}):this.rbdService.defaultFeatures().subscribe(l=>{this.setFeatures(l)}),this.mode!==this.rbdFormMode.editing&&this.poolPermission.read&&(n[l.PoolServiceList]=this.poolService.list(["pool_name","type","flags_names","application_metadata"])),Object(a.a)(n).subscribe(n=>{if(n[l.PoolServiceList]){const e=[],t=[];for(const u of n[l.PoolServiceList])this.rbdService.isRBDPool(u)&&("replicated"===u.type?(e.push(u),t.push(u)):"erasure"===u.type&&-1!==u.flags_names.indexOf("ec_overwrites")&&t.push(u));if(this.pools=e,this.allPools=e,this.dataPools=t,this.allDataPools=t,1===this.pools.length){const l=this.pools[0].pool_name;this.rbdForm.get("pool").setValue(l),this.onPoolChange(l)}}if(n[l.RbdServiceGet]){const e=n[l.RbdServiceGet];this.setResponse(e,this.snapName),this.rbdImage.next(e)}}),i.each(this.features,l=>{this.rbdForm.get("features").get(l.key).valueChanges.subscribe(n=>this.featureFormUpdate(l.key,n))})}onPoolChange(l){const n=this.allDataPools?this.allDataPools.filter(n=>n.pool_name!==l):[];this.rbdForm.getValue("dataPool")===l&&this.rbdForm.get("dataPool").setValue(null),this.dataPools=n,this.namespaces=null,l in this.namespacesByPoolCache?this.namespaces=this.namespacesByPoolCache[l]:this.rbdService.listNamespaces(l).subscribe(n=>{n=n.map(l=>l.namespace),this.namespacesByPoolCache[l]=n,this.namespaces=n}),this.rbdForm.get("namespace").setValue(null)}onUseDataPoolChange(){this.rbdForm.getValue("useDataPool")||(this.rbdForm.get("dataPool").setValue(null),this.onDataPoolChange(null))}onDataPoolChange(l){const n=this.allPools.filter(n=>n.pool_name!==l);this.rbdForm.getValue("pool")===l&&this.rbdForm.get("pool").setValue(null),this.pools=n}validateRbdForm(l){return n=>{const e=n.get("useDataPool"),t=n.get("dataPool");let u=null;e.value&&null==t.value&&(u={required:!0}),t.setErrors(u);const i=n.get("size"),s=n.get("obj_size"),a=l.toBytes(null!=s.value?s.value:this.defaultObjectSize),o=n.get("stripingCount"),r=null!=o.value?o.value:1;let d=null;null===i.value?d={required:!0}:r*a>l.toBytes(i.value)&&(d={invalidSizeObject:!0}),i.setErrors(d);const c=n.get("stripingUnit");let m=null;null===c.value&&null!==o.value?m={required:!0}:null!==c.value&&l.toBytes(c.value)>a&&(m={invalidStripingUnit:!0}),c.setErrors(m);let p=null;return null===o.value&&null!==c.value?p={required:!0}:r<1&&(p={min:!0}),o.setErrors(p),null}}getDependendChildFeatures(l){return i.filter(this.features,n=>n.requires===l)||[]}deepBoxCheck(l,n){this.getDependendChildFeatures(l).forEach(l=>{const e=this.rbdForm.get(l.key);n?e.enable({emitEvent:!1}):(e.disable({emitEvent:!1}),e.setValue(!1,{emitEvent:!1}),this.deepBoxCheck(l.key,n));const t=this.rbdForm.get("features");this.mode===this.rbdFormMode.editing&&t.get(l.key).enabled&&((-1===this.response.features_name.indexOf(l.key)||l.allowDisable)&&(-1!==this.response.features_name.indexOf(l.key)||l.allowEnable)||t.get(l.key).disable())})}interlockCheck(l,n){const e=this.featuresList.find(n=>n.key===l);if(this.response){const l=null!=e.interlockedWith,n=this.featuresList.find(l=>l.interlockedWith===e.key),t=!!this.response.features_name.find(l=>l===e.key);if(l){if(t!==!!this.response.features_name.find(l=>l===e.interlockedWith))return}else if(n&&!!this.response.features_name.find(l=>l===n.key)!==t)return}n?i.filter(this.features,n=>n.interlockedWith===l).forEach(l=>this.rbdForm.get(l.key).setValue(!0,{emitEvent:!1})):e.interlockedWith&&this.rbdForm.get("features").get(e.interlockedWith).setValue(!1)}featureFormUpdate(l,n){if(n){const n=this.features[l].requires;if(n&&!this.rbdForm.getValue(n))return void this.rbdForm.get("features."+l).setValue(!1)}this.deepBoxCheck(l,n),this.interlockCheck(l,n)}setFeatures(l){const n=this.rbdForm.get("features");i.forIn(this.features,e=>{-1!==l.indexOf(e.key)&&n.get(e.key).setValue(!0),this.featureFormUpdate(e.key,n.get(e.key).value)})}setResponse(l,n){this.response=l;const e=new h.a(l.pool_name,l.namespace,l.name).toString();if(this.mode===this.rbdFormMode.cloning)this.rbdForm.get("parent").setValue(`${e}@${n}`);else if(this.mode===this.rbdFormMode.copying)n?this.rbdForm.get("parent").setValue(`${e}@${n}`):this.rbdForm.get("parent").setValue(""+e);else if(l.parent){const n=l.parent;this.rbdForm.get("parent").setValue(`${n.pool_name}/${n.image_name}@${n.snap_name}`)}this.mode===this.rbdFormMode.editing&&this.rbdForm.get("name").setValue(l.name),this.rbdForm.get("pool").setValue(l.pool_name),this.onPoolChange(l.pool_name),this.rbdForm.get("namespace").setValue(l.namespace),l.data_pool&&(this.rbdForm.get("useDataPool").setValue(!0),this.rbdForm.get("dataPool").setValue(l.data_pool)),this.rbdForm.get("size").setValue(this.dimlessBinaryPipe.transform(l.size)),this.rbdForm.get("obj_size").setValue(this.dimlessBinaryPipe.transform(l.obj_size)),this.setFeatures(l.features_name),this.rbdForm.get("stripingUnit").setValue(this.dimlessBinaryPipe.transform(l.stripe_unit)),this.rbdForm.get("stripingCount").setValue(l.stripe_count),this.initializeConfigData.emit({initialData:this.response.configuration,sourceType:m.a.image})}createRequest(){const l=new C;return l.pool_name=this.rbdForm.getValue("pool"),l.namespace=this.rbdForm.getValue("namespace"),l.name=this.rbdForm.getValue("name"),l.size=this.formatter.toBytes(this.rbdForm.getValue("size")),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),i.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(),l}createAction(){const l=this.createRequest();return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/create",{pool_name:l.pool_name,namespace:l.namespace,image_name:l.name}),call:this.rbdService.create(l)})}editRequest(){const l=new S;return l.name=this.rbdForm.getValue("name"),l.size=this.formatter.toBytes(this.rbdForm.getValue("size")),i.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.configuration=this.getDirtyConfigurationValues(),l}cloneRequest(){const l=new f;return l.child_pool_name=this.rbdForm.getValue("pool"),l.child_namespace=this.rbdForm.getValue("namespace"),l.child_image_name=this.rbdForm.getValue("name"),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),i.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(!0,m.a.image),l}editAction(){const l=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/edit",{image_spec:l.toString()}),call:this.rbdService.update(l,this.editRequest())})}cloneAction(){const l=this.cloneRequest(),n=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/clone",{parent_image_spec:n.toString(),parent_snap_name:this.snapName,child_pool_name:l.child_pool_name,child_namespace:l.child_namespace,child_image_name:l.child_image_name}),call:this.rbdService.cloneSnapshot(n,this.snapName,l)})}copyRequest(){const l=new v;return this.snapName&&(l.snapshot_name=this.snapName),l.dest_pool_name=this.rbdForm.getValue("pool"),l.dest_namespace=this.rbdForm.getValue("namespace"),l.dest_image_name=this.rbdForm.getValue("name"),l.obj_size=this.formatter.toBytes(this.rbdForm.getValue("obj_size")),i.forIn(this.features,n=>{this.rbdForm.getValue(n.key)&&l.features.push(n.key)}),l.stripe_unit=this.formatter.toBytes(this.rbdForm.getValue("stripingUnit")),l.stripe_count=this.rbdForm.getValue("stripingCount"),l.data_pool=this.rbdForm.getValue("dataPool"),l.configuration=this.getDirtyConfigurationValues(!0,m.a.image),l}copyAction(){const l=this.copyRequest(),n=new h.a(this.response.pool_name,this.response.namespace,this.response.name);return this.taskWrapper.wrapTaskAroundCall({task:new p.a("rbd/copy",{src_image_spec:n.toString(),dest_pool_name:l.dest_pool_name,dest_namespace:l.dest_namespace,dest_image_name:l.dest_image_name}),call:this.rbdService.copy(n,l)})}submit(){this.mode||this.rbdImage.next("create"),this.rbdImage.pipe(Object(o.a)(),Object(r.a)(()=>this.mode===this.rbdFormMode.editing?this.editAction():this.mode===this.rbdFormMode.cloning?this.cloneAction():this.mode===this.rbdFormMode.copying?this.copyAction():this.createAction())).subscribe(()=>{},()=>this.rbdForm.setErrors({cdSubmitButton:!0}),()=>this.router.navigate(["/block/rbd"]))}}},QUzE:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("ANnk"),i=e("f/UV"),s=e("aexS"),a=e("s7LF"),o=e("+gVj"),r=e("EEJc"),d=e("ajRT"),c=e("mXUL"),m=e("IZUe"),p=e("SVse"),h=e("gp3X"),g=e("sb0X"),f=e("OcYo"),v=e("EApP"),b=e("GiVz"),C=e("KVJa"),S=e("Z21x"),R=e("sne2"),_=e("SuaG"),w=e("LqlI"),y=e("XED3"),k=e("kn/O");e.d(n,"a",(function(){return D}));var E=t["ɵcrt"]({encapsulation:0,styles:[[".form-group.ng-invalid[_ngcontent-%COMP%] .invalid-feedback[_ngcontent-%COMP%]{display:block}"]],data:{}});function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,7,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,3).onChange(e.target.checked)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,3).onTouched()&&u),u}),null,null)),t["ɵdid"](2,4210688,null,0,u.a,[[2,i.a],s.a,t.ElementRef],null,null),t["ɵdid"](3,16384,null,0,a.c,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.c]),t["ɵdid"](5,671744,[[3,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](7,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](9,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](10,null,["",""]))],(function(l,n){l(n,5,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,8,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""))}),(function(l,n){l(n,1,1,[t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,""),t["ɵnov"](n,7).ngClassUntouched,t["ɵnov"](n,7).ngClassTouched,t["ɵnov"](n,7).ngClassPristine,t["ɵnov"](n,7).ngClassDirty,t["ɵnov"](n,7).ngClassValid,t["ɵnov"](n,7).ngClassInvalid,t["ɵnov"](n,7).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass]),l(n,9,0,t["ɵinlineInterpolate"](1,"",n.context.$implicit.name,"")),l(n,10,0,n.context.$implicit.name)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["At least one pool is required."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,74,"cd-modal",[],null,null,null,r.c,r.b)),t["ɵdid"](1,49152,null,0,d.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Create Bootstrap Token"])),(l()(),t["ɵeld"](4,0,null,1,70,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,69,"form",[["class","form"],["name","createBootstrapForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,a.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,a.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,a.d,null,[a.l]),t["ɵdid"](9,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,59,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To create a bootstrap token which can be imported by a peer site cluster, provide the local site's name, select which pools will have mirroring enabled, and click  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Generate"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](19,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,27).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,27)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](25,4210688,null,0,m.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,u.a,[[2,i.a],s.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](29,671744,[[1,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](31,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](32,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,I)),t["ɵdid"](34,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,12,"div",[["class","form-group"],["formGroupName","pools"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](36,212992,null,0,a.m,[[3,a.d],[8,null],[8,null]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.d,null,[a.m]),t["ɵdid"](38,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](39,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](42,0,null,0,1,"label",[["class","col-form-label required"],["for","pools"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](45,278528,null,0,p.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](47,16384,null,0,p.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](48,0,null,null,3,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](49,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.generate()&&t),t}),h.b,h.a)),t["ɵdid"](50,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Generate"])),(l()(),t["ɵeld"](52,0,null,null,14,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,c.b,c.a)),t["ɵdid"](53,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](56,0,null,0,2,"label",[["class","col-form-label"],["for","token"]],null,null,null,null,null)),(l()(),t["ɵeld"](57,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Token"])),(l()(),t["ɵeld"](59,0,null,0,7,"textarea",[["class","form-control resize-vertical"],["formControlName","token"],["id","token"],["placeholder","Generated token..."],["readonly",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,60)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,60).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,60)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,60)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](60,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](62,671744,[[5,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](64,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](65,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵted"](-1,null,[" "])),(l()(),t["ɵeld"](67,0,null,null,3,"button",[["aria-label","Copy to Clipboard"],["cdCopy2ClipboardButton","token"],["class","btn btn-primary mb-3 float-right"],["title","Copy to Clipboard"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==t["ɵnov"](l,68).onClick()&&u),u}),null,null)),t["ɵdid"](68,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵeld"](69,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Copy to Clipboard"])),(l()(),t["ɵeld"](71,0,null,null,3,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](72,0,null,null,2,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](73,0,null,null,1,"cd-back-button",[["name","Close"]],null,null,null,C.b,C.a)),t["ɵdid"](74,49152,null,0,S.a,[p.Location,R.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.createBootstrapForm),l(n,10,0,e.createBootstrapForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,34,0,e.createBootstrapForm.showError("siteName",t["ɵnov"](n,7),"required")),l(n,36,0,"pools"),l(n,39,0),l(n,45,0,e.pools),l(n,47,0,e.createBootstrapForm.showError("pools",t["ɵnov"](n,7),"requirePool")),l(n,50,0,e.createBootstrapForm),l(n,53,0),l(n,62,0,"token"),l(n,65,0,"token"),l(n,68,0,"token"),l(n,74,0,"Close",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass),l(n,35,0,t["ɵnov"](n,38).ngClassUntouched,t["ɵnov"](n,38).ngClassTouched,t["ɵnov"](n,38).ngClassPristine,t["ɵnov"](n,38).ngClassDirty,t["ɵnov"](n,38).ngClassValid,t["ɵnov"](n,38).ngClassInvalid,t["ɵnov"](n,38).ngClassPending,t["ɵnov"](n,39).hasErrors,t["ɵnov"](n,39).hasSuccess),l(n,52,0,t["ɵnov"](n,53).hasErrors,t["ɵnov"](n,53).hasSuccess),l(n,59,0,t["ɵnov"](n,64).ngClassUntouched,t["ɵnov"](n,64).ngClassTouched,t["ɵnov"](n,64).ngClassPristine,t["ɵnov"](n,64).ngClassDirty,t["ɵnov"](n,64).ngClassValid,t["ɵnov"](n,64).ngClassInvalid,t["ɵnov"](n,64).ngClassPending,t["ɵnov"](n,65).validClass,t["ɵnov"](n,65).invalidClass)}))}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-bootstrap-create-modal",[],null,null,null,V,E)),t["ɵdid"](1,245760,null,0,_.a,[w.a,y.a,k.a],null,null)],(function(l,n){l(n,1,0)}),null)}var D=t["ɵccf"]("cd-bootstrap-create-modal",_.a,T,{},{},[])},RIVN:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("C6Ij"),i=e("AWcq"),s=e("NUGo"),a=e("S7zO"),o=e("SVse");class r{transform(l){return"warning"===l?"badge badge-warning":"error"===l?"badge badge-danger":"success"===l?"badge badge-success":"badge badge-info"}}var d=e("25BL"),c=e("uIqm"),m=e("XED3"),p=e("85J/");class h{constructor(l,n,e){this.rbdMirroringService=l,this.cephShortVersionPipe=n,this.i18n=e}ngOnInit(){this.columns=[{prop:"instance_id",name:this.i18n("Instance"),flexGrow:2},{prop:"id",name:this.i18n("ID"),flexGrow:2},{prop:"server_hostname",name:this.i18n("Hostname"),flexGrow:2},{prop:"version",name:this.i18n("Version"),pipe:this.cephShortVersionPipe,flexGrow:2},{prop:"health",name:this.i18n("Health"),cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.data=l.content_data.daemons})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}var g=e("GiVz"),f=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.health_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function b(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{healthTmpl:0}),(l()(),t["ɵeld"](2,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"}),(l()(),t["ɵand"](0,[[1,2],["healthTmpl",2]],null,0,null,v))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex",-1)}),null)}var C=e("HDdC"),S=e("0+/T"),R=e("oxzT"),_=e("vCyI"),w=e("kvvV"),y=e("aexS"),k=e("kn/O"),E=e("aa9H"),I=e("L4us");class N{constructor(l,n,e,t,u){this.authStorageService=l,this.rbdMirroringService=n,this.modalService=e,this.taskWrapper=t,this.i18n=u,this.selection=new _.a,this.data=[],this.permission=this.authStorageService.getPermissions().rbdMirroring;const i={permission:"update",icon:R.a.edit,click:()=>this.editModeModal(),name:this.i18n("Edit Mode"),canBePrimary:()=>!0},s={permission:"create",icon:R.a.add,name:this.i18n("Add Peer"),click:()=>this.editPeersModal("add"),disable:()=>!this.selection.first()||"disabled"===this.selection.first().mirror_mode,visible:()=>!this.getPeerUUID(),canBePrimary:()=>!1},a={permission:"update",icon:R.a.exchange,name:this.i18n("Edit Peer"),click:()=>this.editPeersModal("edit"),visible:()=>!!this.getPeerUUID()},o={permission:"delete",icon:R.a.destroy,name:this.i18n("Delete Peer"),click:()=>this.deletePeersModal(),visible:()=>!!this.getPeerUUID()};this.tableActions=[i,s,a,o]}ngOnInit(){this.columns=[{prop:"name",name:this.i18n("Name"),flexGrow:2},{prop:"mirror_mode",name:this.i18n("Mode"),flexGrow:2},{prop:"leader_id",name:this.i18n("Leader"),flexGrow:2},{prop:"image_local_count",name:this.i18n("# Local"),flexGrow:2},{prop:"image_remote_count",name:this.i18n("# Remote"),flexGrow:2},{prop:"health",name:this.i18n("Health"),cellTemplate:this.healthTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.data=l.content_data.pools})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}editModeModal(){const l={poolName:this.selection.first().name};this.modalRef=this.modalService.show(E.a,{initialState:l})}editPeersModal(l){const n={poolName:this.selection.first().name,mode:l};"edit"===l&&(n.peerUUID=this.getPeerUUID()),this.modalRef=this.modalService.show(I.a,{initialState:n})}deletePeersModal(){const l=this.selection.first().name,n=this.getPeerUUID();this.modalRef=this.modalService.show(S.a,{initialState:{itemDescription:this.i18n("mirror peer"),itemNames:[`${l} (${n})`],submitActionObservable:()=>new C.a(e=>{this.taskWrapper.wrapTaskAroundCall({task:new w.a("rbd/mirroring/peer/delete",{pool_name:l}),call:this.rbdMirroringService.deletePeer(l,n)}).subscribe(void 0,l=>e.error(l),()=>{this.rbdMirroringService.refresh(),e.complete()})})}})}getPeerUUID(){const l=this.selection.first(),n=this.data.find(n=>l&&l.name===n.name);if(n&&n.peer_uuids)return n.peer_uuids[0]}updateSelection(l){this.selection=l}}var F=e("LqlI"),V=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.health_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function D(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{healthTmpl:0}),(l()(),t["ɵeld"](2,0,null,null,3,"cd-table",[["columnMode","flex"],["forceIdentifier","true"],["identifier","name"],["selectionType","single"]],null,[[null,"fetchData"],[null,"updateSelection"]],(function(l,n,e){var t=!0,u=l.component;return"fetchData"===n&&(t=!1!==u.refresh()&&t),"updateSelection"===n&&(t=!1!==u.updateSelection(e)&&t),t}),d.b,d.a)),t["ɵdid"](3,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"],identifier:[4,"identifier"],forceIdentifier:[5,"forceIdentifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection"}),(l()(),t["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,s.b,s.a)),t["ɵdid"](5,114688,null,0,a.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵand"](0,[[1,2],["healthTmpl",2]],null,0,null,T))],(function(l,n){var e=n.component;l(n,3,0,e.data,e.columns,"flex",-1,"name","true","single"),l(n,5,0,e.permission,e.selection,e.tableActions)}),null)}var x=e("7qid"),P=e("38Bd"),q=e("pKUh"),B=e("2ZVE");class A{constructor(l,n){this.rbdMirroringService=l,this.i18n=n,this.image_error={data:[],columns:{}},this.image_syncing={data:[],columns:{}},this.image_ready={data:[],columns:{}}}ngOnInit(){this.image_error.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"description",name:this.i18n("Issue"),flexGrow:4},{prop:"state",name:this.i18n("State"),cellTemplate:this.stateTmpl,flexGrow:1}],this.image_syncing.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"progress",name:this.i18n("Progress"),cellTemplate:this.progressTmpl,flexGrow:2},{prop:"state",name:this.i18n("State"),cellTemplate:this.syncTmpl,flexGrow:1}],this.image_ready.columns=[{prop:"pool_name",name:this.i18n("Pool"),flexGrow:2},{prop:"name",name:this.i18n("Image"),flexGrow:2},{prop:"description",name:this.i18n("Description"),flexGrow:4},{prop:"state",name:this.i18n("State"),cellTemplate:this.stateTmpl,flexGrow:1}],this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.image_error.data=l.content_data.image_error,this.image_syncing.data=l.content_data.image_syncing,this.image_ready.data=l.content_data.image_ready})}ngOnDestroy(){this.subs.unsubscribe()}refresh(){this.rbdMirroringService.refresh()}}var M=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function O(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_error.data,e.image_error.columns,"flex",-1)}),null)}function L(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_syncing.data,e.image_syncing.columns,"flex",-1)}),null)}function j(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-table",[["columnMode","flex"]],null,[[null,"fetchData"]],(function(l,n,e){var t=!0;return"fetchData"===n&&(t=!1!==l.component.refresh()&&t),t}),d.b,d.a)),t["ɵdid"](1,2867200,null,0,c.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoReload:[3,"autoReload"]},{fetchData:"fetchData"})],(function(l,n){var e=n.component;l(n,1,0,e.image_ready.data,e.image_ready.columns,"flex",-1)}),null)}function U(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"span",[],null,null,null,null,null)),t["ɵprd"](512,null,o["ɵNgClassImpl"],o["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](2,278528,null,0,o.NgClass,[o["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),t["ɵppd"](3,1),(l()(),t["ɵted"](4,null,["",""]))],(function(l,n){var e=t["ɵunv"](n,2,0,l(n,3,0,t["ɵnov"](n.parent,0),n.context.row.state_color));l(n,2,0,e)}),(function(l,n){l(n,4,0,n.context.value)}))}function G(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","badge badge-info"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Syncing"]))],null,null)}function $(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"progressbar",[["type","info"]],[[1,"max",0],[2,"progress",null]],null,null,x.b,x.a)),t["ɵdid"](1,49152,null,0,P.b,[P.c],{type:[0,"type"],value:[1,"value"]},null)],(function(l,n){l(n,1,0,"info",n.context.value)}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).max,t["ɵnov"](n,1).addClass)}))}function X(l){return t["ɵvid"](0,[t["ɵpid"](0,r,[]),t["ɵqud"](402653184,1,{stateTmpl:0}),t["ɵqud"](402653184,2,{syncTmpl:0}),t["ɵqud"](402653184,3,{progressTmpl:0}),(l()(),t["ɵeld"](4,0,null,null,13,"tabset",[],[[2,"tab-container",null]],null,null,q.b,q.a)),t["ɵdid"](5,180224,[["tabset",4]],0,B.e,[B.f,t.Renderer2,t.ElementRef],null,null),(l()(),t["ɵeld"](6,0,null,0,3,"tab",[["heading","Issues"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](7,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,O)),t["ɵdid"](9,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](10,0,null,0,3,"tab",[["heading","Syncing"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](11,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,L)),t["ɵdid"](13,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](14,0,null,0,3,"tab",[["heading","Ready"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),t["ɵdid"](15,212992,null,0,B.b,[B.e,t.ElementRef,t.Renderer2],{heading:[0,"heading"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,j)),t["ɵdid"](17,16384,null,0,o.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["stateTmpl",2]],null,0,null,U)),(l()(),t["ɵand"](0,[[2,2],["syncTmpl",2]],null,0,null,G)),(l()(),t["ɵand"](0,[[3,2],["progressTmpl",2]],null,0,null,$))],(function(l,n){l(n,7,0,"Issues"),l(n,9,0,null==t["ɵnov"](n,5).tabs[0]?null:t["ɵnov"](n,5).tabs[0].active),l(n,11,0,"Syncing"),l(n,13,0,null==t["ɵnov"](n,5).tabs[1]?null:t["ɵnov"](n,5).tabs[1].active),l(n,15,0,"Ready"),l(n,17,0,null==t["ɵnov"](n,5).tabs[2]?null:t["ɵnov"](n,5).tabs[2].active)}),(function(l,n){l(n,4,0,t["ɵnov"](n,5).clazz),l(n,6,0,t["ɵnov"](n,7).id,t["ɵnov"](n,7).active,t["ɵnov"](n,7).addClass,t["ɵnov"](n,7).role,t["ɵnov"](n,7).ariaLabelledby),l(n,10,0,t["ɵnov"](n,11).id,t["ɵnov"](n,11).active,t["ɵnov"](n,11).addClass,t["ɵnov"](n,11).role,t["ɵnov"](n,11).ariaLabelledby),l(n,14,0,t["ɵnov"](n,15).id,t["ɵnov"](n,15).active,t["ɵnov"](n,15).addClass,t["ɵnov"](n,15).role,t["ɵnov"](n,15).ariaLabelledby)}))}var z=e("cxJu");e.d(n,"a",(function(){return K}));var W=t["ɵcrt"]({encapsulation:0,styles:[["cd-mirroring cd-table-actions.float-right ul{right:0!important;left:auto!important}"]],data:{}});function J(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-view-cache",[],null,null,null,u.b,u.a)),t["ɵdid"](1,114688,null,0,i.a,[],{status:[0,"status"]},null),(l()(),t["ɵeld"](2,0,null,null,7,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,6,"div",[["class","col-md-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,3,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name:"])),(l()(),t["ɵted"](7,null,[" ",""])),(l()(),t["ɵeld"](8,0,null,null,1,"cd-table-actions",[["class","table-actions float-right"]],null,null,null,s.b,s.a)),t["ɵdid"](9,114688,null,0,a.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),t["ɵeld"](10,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,4,"div",[["class","col-sm-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Daemons"])),(l()(),t["ɵeld"](14,0,null,null,1,"cd-mirroring-daemons",[],null,null,null,b,f)),t["ɵdid"](15,245760,null,0,h,[m.a,p.a,g.a],null,null),(l()(),t["ɵeld"](16,0,null,null,4,"div",[["class","col-sm-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pools"])),(l()(),t["ɵeld"](19,0,null,null,1,"cd-mirroring-pools",[],null,null,null,D,V)),t["ɵdid"](20,245760,null,0,N,[y.a,m.a,F.b,k.a,g.a],null,null),(l()(),t["ɵeld"](21,0,null,null,5,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](22,0,null,null,4,"div",[["class","col-md-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](23,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Images"])),(l()(),t["ɵeld"](25,0,null,null,1,"cd-mirroring-images",[],null,null,null,X,M)),t["ɵdid"](26,245760,null,0,A,[m.a,g.a],null,null)],(function(l,n){var e=n.component;l(n,1,0,e.status),l(n,9,0,e.permission,e.selection,e.tableActions),l(n,15,0),l(n,20,0),l(n,26,0)}),(function(l,n){l(n,7,0,n.component.siteName)}))}function Y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-mirroring",[],null,null,null,J,W)),t["ɵdid"](1,245760,null,0,z.a,[y.a,m.a,F.b,g.a],null,null)],(function(l,n){l(n,1,0)}),null)}var K=t["ɵccf"]("cd-mirroring",z.a,Y,{},{},[])},Sofw:function(l,n,e){"use strict";e.d(n,"a",(function(){return a}));var t=e("s7LF"),u=(e("my5R"),e("mtw6")),i=e("QFaf"),s=e("1Ni5");e("aexS"),e("9nlD");class a{constructor(l,n,e,t,u){this.authStorageService=l,this.bsModalRef=n,this.iscsiService=e,this.notificationService=t,this.i18n=u,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.permission=this.authStorageService.getPermissions().iscsi}ngOnInit(){this.hasPermission=this.permission.update,this.createForm(),this.iscsiService.getDiscovery().subscribe(l=>{this.discoveryForm.patchValue(l)})}createForm(){this.discoveryForm=new i.a({user:new t.i({value:"",disabled:!this.hasPermission}),password:new t.i({value:"",disabled:!this.hasPermission}),mutual_user:new t.i({value:"",disabled:!this.hasPermission}),mutual_password:new t.i({value:"",disabled:!this.hasPermission})}),s.a.validateIf(this.discoveryForm.get("user"),()=>this.discoveryForm.getValue("password")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("password"),()=>this.discoveryForm.getValue("user")||this.discoveryForm.getValue("mutual_user")||this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("mutual_user"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("mutual_user"),()=>this.discoveryForm.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_password")]),s.a.validateIf(this.discoveryForm.get("mutual_password"),()=>this.discoveryForm.getValue("mutual_user"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[this.discoveryForm.get("user"),this.discoveryForm.get("password"),this.discoveryForm.get("mutual_user")])}submitAction(){this.iscsiService.updateDiscovery(this.discoveryForm.value).subscribe(()=>{this.notificationService.show(u.a.success,this.i18n("Updated discovery authentication")),this.bsModalRef.hide()},()=>{this.discoveryForm.setErrors({cdSubmitButton:!0})})}}},SuaG:function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("s7LF"),u=e("LvDl"),i=e("GyhO"),s=e("cp0P"),a=e("vkgz"),o=e("NJ9Y"),r=(e("XED3"),e("QFaf")),d=e("kvvV");e("kn/O");class c{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.pools=[],this.createForm()}createForm(){this.createBootstrapForm=new r.a({siteName:new t.i("",{validators:[t.B.required]}),pools:new t.k({},{validators:[this.validatePools()]}),token:new t.i("",{})})}ngOnInit(){this.createBootstrapForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(l=>{this.createBootstrapForm.get("siteName").setValue(l.site_name)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.pools=l.content_data.pools.reduce((l,n)=>(l.push({name:n.name,mirror_mode:n.mirror_mode}),l),[]);const n=this.createBootstrapForm.get("pools");u.each(this.pools,l=>{const e=l.name,u="disabled"===l.mirror_mode,i=n.controls[e];i?u&&i.disabled?i.enable():!u&&i.enabled&&(i.disable(),i.setValue(!0)):n.addControl(e,new t.i({value:!u,disabled:!u}))})})}ngOnDestroy(){this.subs&&this.subs.unsubscribe()}validatePools(){return l=>{let n=0;return u.each(l.controls,l=>{!0===l.value&&++n}),n>0?null:{requirePool:!0}}}generate(){this.createBootstrapForm.get("token").setValue("");let l="";const n=[],e=this.createBootstrapForm.get("pools");u.each(e.controls,(e,t)=>{!0===e.value&&(l=t,e.disabled||n.push(t))});const t={mirror_mode:"image"},r=Object(i.a)(this.rbdMirroringService.setSiteName(this.createBootstrapForm.getValue("siteName")),Object(s.a)(n.map(l=>this.rbdMirroringService.updatePool(l,t))),this.rbdMirroringService.createBootstrapToken(l).pipe(Object(a.a)(l=>this.createBootstrapForm.get("token").setValue(l.token)))).pipe(Object(o.a)()),c=()=>{this.rbdMirroringService.refresh(),this.createBootstrapForm.setErrors({cdSubmitButton:!0})};this.taskWrapper.wrapTaskAroundCall({task:new d.a("rbd/mirroring/bootstrap/create",{}),call:r}).subscribe(void 0,c,c)}}},VBM6:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("EEJc"),i=e("ajRT"),s=e("SVse"),a=e("s7LF"),o=e("+gVj"),r=e("mXUL"),d=e("IZUe"),c=e("ANnk"),m=e("f/UV"),p=e("aexS"),h=e("gp3X"),g=e("sb0X"),f=e("KVJa"),v=e("Z21x"),b=e("sne2"),C=e("L4us"),S=e("LqlI"),R=e("XED3"),_=e("kn/O");e.d(n,"a",(function(){return B}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function y(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Edit"]))],null,null)}function k(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Add"]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Edit"]))],null,null)}function I(l){return t["ɵvid"](0,[(l()(),t["ɵted"](-1,null,["Add"]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The cluster name is not valid."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The CephX ID is not valid."]))],null,null)}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["The monitory address is not valid."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX key must be base64 encoded."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,110,"cd-modal",[],null,null,null,u.c,u.b)),t["ɵdid"](1,49152,null,0,i.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,7,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,5,null,null,null,null,null,null,null)),t["ɵdid"](4,16384,null,0,s.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,y)),t["ɵdid"](6,278528,null,0,s.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](8,16384,null,0,s.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],null,null),(l()(),t["ɵted"](-1,null,[" pool mirror peer"])),(l()(),t["ɵeld"](10,0,null,1,100,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](11,0,null,null,99,"form",[["class","form"],["name","editPeerForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,13).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,13).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,16).onSubmit()&&u),u}),null,null)),t["ɵdid"](12,16384,null,0,a.G,[],null,null),t["ɵdid"](13,540672,[["formDir",4]],0,a.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,a.d,null,[a.l]),t["ɵdid"](15,16384,null,0,a.s,[[4,a.d]],null,null),t["ɵdid"](16,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](17,0,null,null,86,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](18,0,null,null,14,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,13,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](20,0,null,null,5,null,null,null,null,null,null,null)),t["ɵdid"](21,16384,null,0,s.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](23,278528,null,0,s.NgSwitchCase,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](25,16384,null,0,s.NgSwitchDefault,[t.ViewContainerRef,t.TemplateRef,s.NgSwitch],null,null),(l()(),t["ɵted"](-1,null,[" the pool mirror peer attributes for pool "])),(l()(),t["ɵeld"](27,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](28,null,["",""])),(l()(),t["ɵted"](-1,null,[" and click "])),(l()(),t["ɵeld"](30,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Submit"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](33,0,null,null,18,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](34,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](37,0,null,0,1,"label",[["class","col-form-label required"],["for","clusterName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Cluster Name"])),(l()(),t["ɵeld"](39,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","clusterName"],["id","clusterName"],["name","clusterName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,42)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,42).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,42)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,42)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](40,4210688,null,0,d.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](41,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](42,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](44,671744,[[1,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](46,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](47,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,N)),t["ɵdid"](49,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,F)),t["ɵdid"](51,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](52,0,null,null,17,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](53,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](56,0,null,0,1,"label",[["class","col-form-label required"],["for","clientID"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX ID"])),(l()(),t["ɵeld"](58,0,null,0,7,"input",[["class","form-control"],["formControlName","clientID"],["id","clientID"],["name","clientID"],["placeholder","CephX ID..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,60)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,60).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,60)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,60)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](59,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](60,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](62,671744,[[3,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](64,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](65,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,V)),t["ɵdid"](67,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,T)),t["ɵdid"](69,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](70,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](71,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](74,0,null,0,2,"label",[["class","col-form-label"],["for","monAddr"]],null,null,null,null,null)),(l()(),t["ɵeld"](75,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Monitor Addresses"])),(l()(),t["ɵeld"](77,0,null,0,7,"input",[["class","form-control"],["formControlName","monAddr"],["id","monAddr"],["name","monAddr"],["placeholder","Comma-delimited addresses..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,79)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,79).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,79)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,79)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](78,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](79,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](81,671744,[[5,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](83,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](84,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,D)),t["ɵdid"](86,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](87,0,null,null,16,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,r.b,r.a)),t["ɵdid"](88,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](91,0,null,0,2,"label",[["class","col-form-label"],["for","key"]],null,null,null,null,null)),(l()(),t["ɵeld"](92,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["CephX Key"])),(l()(),t["ɵeld"](94,0,null,0,7,"input",[["class","form-control"],["formControlName","key"],["id","key"],["name","key"],["placeholder","Base64-encoded key..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,96)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,96).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,96)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,96)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](95,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](96,16384,null,0,a.e,[t.Renderer2,t.ElementRef,[2,a.b]],null,null),t["ɵprd"](1024,null,a.p,(function(l){return[l]}),[a.e]),t["ɵdid"](98,671744,[[7,4]],0,a.j,[[3,a.d],[8,null],[8,null],[6,a.p],[2,a.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,a.q,null,[a.j]),t["ɵdid"](100,16384,null,0,a.r,[[4,a.q]],null,null),t["ɵdid"](101,16384,null,0,o.h,[[3,a.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,x)),t["ɵdid"](103,16384,null,0,s.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](104,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](105,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](106,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),h.b,h.a)),t["ɵdid"](107,114688,null,0,g.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Submit"])),(l()(),t["ɵeld"](109,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,f.b,f.a)),t["ɵdid"](110,49152,null,0,v.a,[s.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,4,0,e.mode),l(n,6,0,"edit"),l(n,13,0,e.editPeerForm),l(n,16,0,e.editPeerForm),l(n,21,0,e.mode),l(n,23,0,"edit"),l(n,34,0),l(n,40,0,""),l(n,44,0,"clusterName"),l(n,47,0,"clusterName"),l(n,49,0,e.editPeerForm.showError("clusterName",t["ɵnov"](n,13),"required")),l(n,51,0,e.editPeerForm.showError("clusterName",t["ɵnov"](n,13),"invalidClusterName")),l(n,53,0),l(n,62,0,"clientID"),l(n,65,0,"clientID"),l(n,67,0,e.editPeerForm.showError("clientID",t["ɵnov"](n,13),"required")),l(n,69,0,e.editPeerForm.showError("clientID",t["ɵnov"](n,13),"invalidClientID")),l(n,71,0),l(n,81,0,"monAddr"),l(n,84,0,"monAddr"),l(n,86,0,e.editPeerForm.showError("monAddr",t["ɵnov"](n,13),"invalidMonAddr")),l(n,88,0),l(n,98,0,"key"),l(n,101,0,"key"),l(n,103,0,e.editPeerForm.showError("key",t["ɵnov"](n,13),"invalidKey")),l(n,107,0,e.editPeerForm),l(n,110,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,11,0,t["ɵnov"](n,15).ngClassUntouched,t["ɵnov"](n,15).ngClassTouched,t["ɵnov"](n,15).ngClassPristine,t["ɵnov"](n,15).ngClassDirty,t["ɵnov"](n,15).ngClassValid,t["ɵnov"](n,15).ngClassInvalid,t["ɵnov"](n,15).ngClassPending),l(n,28,0,e.poolName),l(n,33,0,t["ɵnov"](n,34).hasErrors,t["ɵnov"](n,34).hasSuccess),l(n,39,0,t["ɵnov"](n,46).ngClassUntouched,t["ɵnov"](n,46).ngClassTouched,t["ɵnov"](n,46).ngClassPristine,t["ɵnov"](n,46).ngClassDirty,t["ɵnov"](n,46).ngClassValid,t["ɵnov"](n,46).ngClassInvalid,t["ɵnov"](n,46).ngClassPending,t["ɵnov"](n,47).validClass,t["ɵnov"](n,47).invalidClass),l(n,52,0,t["ɵnov"](n,53).hasErrors,t["ɵnov"](n,53).hasSuccess),l(n,58,0,t["ɵnov"](n,64).ngClassUntouched,t["ɵnov"](n,64).ngClassTouched,t["ɵnov"](n,64).ngClassPristine,t["ɵnov"](n,64).ngClassDirty,t["ɵnov"](n,64).ngClassValid,t["ɵnov"](n,64).ngClassInvalid,t["ɵnov"](n,64).ngClassPending,t["ɵnov"](n,65).validClass,t["ɵnov"](n,65).invalidClass),l(n,70,0,t["ɵnov"](n,71).hasErrors,t["ɵnov"](n,71).hasSuccess),l(n,77,0,t["ɵnov"](n,83).ngClassUntouched,t["ɵnov"](n,83).ngClassTouched,t["ɵnov"](n,83).ngClassPristine,t["ɵnov"](n,83).ngClassDirty,t["ɵnov"](n,83).ngClassValid,t["ɵnov"](n,83).ngClassInvalid,t["ɵnov"](n,83).ngClassPending,t["ɵnov"](n,84).validClass,t["ɵnov"](n,84).invalidClass),l(n,87,0,t["ɵnov"](n,88).hasErrors,t["ɵnov"](n,88).hasSuccess),l(n,94,0,t["ɵnov"](n,100).ngClassUntouched,t["ɵnov"](n,100).ngClassTouched,t["ɵnov"](n,100).ngClassPristine,t["ɵnov"](n,100).ngClassDirty,t["ɵnov"](n,100).ngClassValid,t["ɵnov"](n,100).ngClassInvalid,t["ɵnov"](n,100).ngClassPending,t["ɵnov"](n,101).validClass,t["ɵnov"](n,101).invalidClass)}))}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-pool-edit-peer-modal",[],null,null,null,P,w)),t["ɵdid"](1,114688,null,0,C.a,[S.a,R.a,_.a],null,null)],(function(l,n){l(n,1,0)}),null)}var B=t["ɵccf"]("cd-pool-edit-peer-modal",C.a,q,{},{},[])},WkyA:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{constructor(){}}},WxU5:function(l,n,e){"use strict";e.d(n,"a",(function(){return u})),e("Ekvf"),e("F83c"),e("2EZI");var t=e("kvvV");e("aexS"),e("kn/O");class u{constructor(l,n,e,t,u,i){this.authStorageService=l,this.rbdService=n,this.modalRef=e,this.fb=t,this.poolService=u,this.taskWrapper=i,this.poolPermission=this.authStorageService.getPermissions().pool}createForm(){this.purgeForm=this.fb.group({poolName:""})}ngOnInit(){this.poolPermission.read&&this.poolService.list(["pool_name","application_metadata"]).then(l=>{this.pools=l.filter(l=>l.application_metadata.includes("rbd")).map(l=>l.pool_name)}),this.createForm()}purge(){const l=this.purgeForm.getValue("poolName")||"";this.taskWrapper.wrapTaskAroundCall({task:new t.a("rbd/trash/purge",{pool_name:l}),call:this.rbdService.purgeTrash(l)}).subscribe(void 0,()=>{this.purgeForm.setErrors({cdSubmitButton:!0})},()=>{this.modalRef.hide()})}}},XED3:function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("mrSG"),u=e("IheW"),i=e("2Vo4"),s=e("pLZG"),a=e("xTzq"),o=e("lOp/"),r=e("8Y7J"),d=e("pL04");let c=(()=>{let l=class{constructor(l,n){this.http=l,this.timerService=n,this.REFRESH_INTERVAL=3e4,this.summaryDataSource=new i.a(null),this.summaryData$=this.summaryDataSource.asObservable()}startPolling(){return this.timerService.get(()=>this.retrieveSummaryObservable(),this.REFRESH_INTERVAL).subscribe(this.retrieveSummaryObserver())}refresh(){return this.retrieveSummaryObservable().subscribe(this.retrieveSummaryObserver())}retrieveSummaryObservable(){return this.http.get("api/block/mirroring/summary")}retrieveSummaryObserver(){return l=>{this.summaryDataSource.next(l)}}subscribeSummary(l,n){return this.summaryData$.pipe(Object(s.a)(l=>!!l)).subscribe(l,n)}getPool(l){return this.http.get("api/block/mirroring/pool/"+l)}updatePool(l,n){return this.http.put("api/block/mirroring/pool/"+l,n,{observe:"response"})}getSiteName(){return this.http.get("api/block/mirroring/site_name")}setSiteName(l){return this.http.put("api/block/mirroring/site_name",{site_name:l},{observe:"response"})}createBootstrapToken(l){return this.http.post(`api/block/mirroring/pool/${l}/bootstrap/token`,{})}importBootstrapToken(l,n,e){return this.http.post(`api/block/mirroring/pool/${l}/bootstrap/peer`,{direction:n,token:e},{observe:"response"})}getPeer(l,n){return this.http.get(`api/block/mirroring/pool/${l}/peer/${n}`)}addPeer(l,n){return this.http.post(`api/block/mirroring/pool/${l}/peer`,n,{observe:"response"})}updatePeer(l,n,e){return this.http.put(`api/block/mirroring/pool/${l}/peer/${n}`,e,{observe:"response"})}deletePeer(l,n){return this.http.delete(`api/block/mirroring/pool/${l}/peer/${n}`,{observe:"response"})}};return l.ngInjectableDef=r["ɵɵdefineInjectable"]({factory:function(){return new l(r["ɵɵinject"](u.c),r["ɵɵinject"](o.a))},token:l,providedIn:d.a}),t.__decorate([t.__param(0,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[String]),t.__metadata("design:returntype",void 0)],l.prototype,"setSiteName",null),t.__decorate([t.__param(1,a.b),t.__param(2,a.b),t.__metadata("design:type",Function),t.__metadata("design:paramtypes",[String,String,String]),t.__metadata("design:returntype",void 0)],l.prototype,"importBootstrapToken",null),l=t.__decorate([a.a,t.__metadata("design:paramtypes",[u.c,o.a])],l),l})()},Z4cD:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),u=e("LvDl"),i=(e("my5R"),e("QFaf"));class s{constructor(l,n){this.modalRef=l,this.iscsiService=n}ngOnInit(){const l={backstore:new t.i(this.imagesSettings[this.image].backstore),lun:new t.i(this.imagesSettings[this.image].lun),wwn:new t.i(this.imagesSettings[this.image].wwn)};u.forEach(this.backstores,n=>{const e=this.imagesSettings[this.image][n]||{};u.forIn(this.disk_default_controls[n],(n,u)=>{l[u]=new t.i(e[u])})}),this.settingsForm=new i.a(l)}getDiskControlLimits(l,n){return this.disk_controls_limits?this.disk_controls_limits[l][n]:{type:"int"}}save(){const l=this.settingsForm.controls.backstore.value,n=this.settingsForm.controls.lun.value,e=this.settingsForm.controls.wwn.value,t={};u.forIn(this.settingsForm.controls,(n,e)=>{""!==n.value&&null!==n.value&&e in this.disk_default_controls[this.settingsForm.value.backstore]&&(t[e]=n.value,u.forEach(this.backstores,t=>{t!==l&&e in(this.imagesSettings[this.image][t]||{})&&(this.imagesSettings[this.image][t][e]=n.value)}))}),this.imagesSettings[this.image].backstore=l,this.imagesSettings[this.image].lun=n,this.imagesSettings[this.image].wwn=e,this.imagesSettings[this.image][l]=t,this.imagesSettings=Object.assign({},this.imagesSettings),this.control.updateValueAndValidity({emitEvent:!1}),this.modalRef.hide()}}},Z5tW:function(l,n,e){"use strict";e.d(n,"a",(function(){return r}));var t=e("cp0P"),u=(e("Ekvf"),e("F83c"),e("0+/T")),i=(e("sne2"),e("oxzT")),s=e("mtw6"),a=e("vCyI"),o=(e("aexS"),e("9nlD"),e("daK0"));class r{constructor(l,n,e,t,u,s,o){this.authStorageService=l,this.rbdService=n,this.poolService=e,this.modalService=t,this.notificationService=u,this.i18n=s,this.actionLabels=o,this.selection=new a.a,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"create",icon:i.a.add,click:()=>this.createModal(),name:this.actionLabels.CREATE},{permission:"delete",icon:i.a.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:this.i18n("Namespace"),prop:"namespace",flexGrow:1},{name:this.i18n("Pool"),prop:"pool",flexGrow:1},{name:this.i18n("Total images"),prop:"num_images",flexGrow:1}],this.refresh()}refresh(){this.poolService.list(["pool_name","type","application_metadata"]).then(l=>{l=l.filter(l=>this.rbdService.isRBDPool(l)&&"replicated"===l.type);const n=[];l.forEach(l=>{n.push(this.rbdService.listNamespaces(l.pool_name))}),n.length>0?Object(t.a)(n).subscribe(n=>{const e=[];for(let t=0;t{e.push({id:`${u}/${l.namespace}`,pool:u,namespace:l.namespace,num_images:l.num_images})})}this.namespaces=e}):this.namespaces=[]})}updateSelection(l){this.selection=l}createModal(){this.modalRef=this.modalService.show(o.a),this.modalRef.content.onSubmit.subscribe(()=>{this.refresh()})}deleteModal(){const l=this.selection.first().pool,n=this.selection.first().namespace;this.modalRef=this.modalService.show(u.a,{initialState:{itemDescription:"Namespace",itemNames:[`${l}/${n}`],submitAction:()=>this.rbdService.deleteNamespace(l,n).subscribe(()=>{this.notificationService.show(s.a.success,this.i18n("Deleted namespace '{{pool}}/{{namespace}}'",{pool:l,namespace:n})),this.modalRef.hide(),this.refresh()},()=>{this.modalRef.content.stopLoadingSpinner()})}})}getDeleteDisableDesc(){const l=this.selection.first();return!l||l.num_images>0&&this.i18n("Namespace contains images")}}},a6qe:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),u=e("LvDl"),i=(e("my5R"),e("QFaf"));class s{constructor(l,n){this.modalRef=l,this.iscsiService=n}ngOnInit(){const l={};u.forIn(this.target_default_controls,(n,e)=>{l[e]=new t.i(this.target_controls.value[e])}),this.settingsForm=new i.a(l)}save(){const l={};u.forIn(this.settingsForm.controls,(n,e)=>{""!==n.value&&null!==n.value&&(l[e]=n.value)}),this.target_controls.setValue(l),this.modalRef.hide()}getTargetControlLimits(l){return this.target_controls_limits?this.target_controls_limits[l]:["Yes","No"].includes(this.target_default_controls[l])?{type:"bool"}:{type:"int"}}}},aAWM:function(l,n,e){"use strict";e("uIqm");var t=e("PhyI");class u{transform(l){return{0:"global",1:"pool",2:"image"}[l]}}e("aXbf"),e("o8EM"),e.d(n,"a",(function(){return i}));class i{constructor(l,n,e){this.formatterService=l,this.rbdConfigurationService=n,this.i18n=e,this.sourceField=t.a,this.typeField=t.b}ngOnInit(){this.poolConfigurationColumns=[{prop:"displayName",name:this.i18n("Name")},{prop:"description",name:this.i18n("Description")},{prop:"name",name:this.i18n("Key")},{prop:"source",name:this.i18n("Source"),cellTemplate:this.configurationSourceTpl,pipe:new u},{prop:"value",name:this.i18n("Value"),cellTemplate:this.configurationValueTpl}]}ngOnChanges(){this.data&&(this.data=this.data.filter(l=>this.rbdConfigurationService.getOptionFields().map(l=>l.name).includes(l.name)))}}},aa9H:function(l,n,e){"use strict";var t=e("s7LF"),u=(e("XED3"),e("QFaf")),i=e("kvvV");e("kn/O");class s{}e.d(n,"a",(function(){return a}));class a{constructor(l,n,e,t){this.modalRef=l,this.i18n=n,this.rbdMirroringService=e,this.taskWrapper=t,this.bsConfig={containerClass:"theme-default"},this.peerExists=!1,this.mirrorModes=[{id:"disabled",name:this.i18n("Disabled")},{id:"pool",name:this.i18n("Pool")},{id:"image",name:this.i18n("Image")}],this.createForm()}createForm(){this.editModeForm=new u.a({mirrorMode:new t.i("",{validators:[t.B.required,this.validateMode.bind(this)]})})}ngOnInit(){this.pattern=""+this.poolName,this.rbdMirroringService.getPool(this.poolName).subscribe(l=>{this.setResponse(l)}),this.subs=this.rbdMirroringService.subscribeSummary(l=>{this.peerExists=!1;const n=l.content_data.pools.find(l=>this.poolName===l.name);this.peerExists=n&&n.peer_uuids.length})}ngOnDestroy(){this.subs.unsubscribe()}validateMode(l){return"disabled"===l.value&&this.peerExists?{cannotDisable:{value:l.value}}:null}setResponse(l){this.editModeForm.get("mirrorMode").setValue(l.mirror_mode)}update(){const l=new s;l.mirror_mode=this.editModeForm.getValue("mirrorMode"),this.taskWrapper.wrapTaskAroundCall({task:new i.a("rbd/mirroring/pool/edit",{pool_name:this.poolName}),call:this.rbdMirroringService.updatePool(this.poolName,l)}).subscribe(void 0,()=>this.editModeForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},bUo2:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("gp3X"),i=e("sb0X"),s=e("EEJc"),a=e("ajRT"),o=e("s7LF"),r=e("+gVj"),d=e("mXUL"),c=e("ANnk"),m=e("f/UV"),p=e("aexS"),h=e("SVse"),g=e("D4zM"),f=e("OcYo"),v=e("EApP"),b=e("GiVz"),C=e("KVJa"),S=e("Z21x"),R=e("sne2"),_=e("Sofw"),w=e("LqlI"),y=e("my5R"),k=e("9nlD");e.d(n,"a",(function(){return M}));var E=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'."]))],null,null)}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'."]))],null,null)}function T(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User names must have a length of 8 to 64 characters and can contain alphanumeric characters, '.', '@', '-', '_' or ':'."]))],null,null)}function x(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function P(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Passwords must have a length of 12 to 16 characters and can contain alphanumeric characters, '@', '-', '_' or '/'."]))],null,null)}function q(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.submitAction()&&t),t}),u.b,u.a)),t["ɵdid"](1,114688,null,0,i.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Submit"]))],(function(l,n){l(n,1,0,n.component.discoveryForm)}),null)}function B(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,106,"cd-modal",[],null,null,null,s.c,s.b)),t["ɵdid"](1,49152,null,0,a.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Discovery Authentication"])),(l()(),t["ɵeld"](4,0,null,1,102,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,101,"form",[["name","discoveryForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,o.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,o.d,null,[o.l]),t["ɵdid"](9,16384,null,0,o.s,[[4,o.d]],null,null),t["ɵdid"](10,16384,null,0,r.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,89,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](13,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["User"])),(l()(),t["ɵeld"](18,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,7,"input",[["autocomplete","off"],["class","form-control"],["formControlName","user"],["id","user"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,20)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,20).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,20)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,20)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](20,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](22,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](24,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](25,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](26,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](28,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,N)),t["ɵdid"](30,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](31,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](32,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](35,0,null,0,1,"label",[["class","cd-col-form-label"],["for","password"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Password"])),(l()(),t["ɵeld"](37,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](38,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](39,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,40)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,40).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,40)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,40)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](40,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](42,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](44,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](45,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](46,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](47,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](48,0,null,null,1,"button",[["cdPasswordButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==t["ɵnov"](l,49).onClick()&&u),u}),null,null)),t["ɵdid"](49,81920,null,0,g.a,[t.ElementRef,t.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),t["ɵeld"](50,0,null,null,1,"button",[["cdCopy2ClipboardButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==t["ɵnov"](l,51).onClick()&&u),u}),null,null)),t["ɵdid"](51,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](53,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](55,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](56,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](57,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](60,0,null,0,2,"label",[["class","cd-col-form-label"],["for","mutual_user"]],null,null,null,null,null)),(l()(),t["ɵeld"](61,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mutual User"])),(l()(),t["ɵeld"](63,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](64,0,null,null,7,"input",[["autocomplete","off"],["class","form-control"],["formControlName","mutual_user"],["id","mutual_user"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,65)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,65).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,65)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,65)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](65,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](67,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](69,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](70,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](71,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,T)),t["ɵdid"](73,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,D)),t["ɵdid"](75,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](76,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,d.b,d.a)),t["ɵdid"](77,1163264,null,2,r.c,[t.ElementRef,r.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](80,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mutual_password"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mutual Password"])),(l()(),t["ɵeld"](82,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),t["ɵeld"](83,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),t["ɵeld"](84,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","mutual_password"],["id","mutual_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,85)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,85).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,85)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,85)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](85,16384,null,0,o.e,[t.Renderer2,t.ElementRef,[2,o.b]],null,null),t["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),t["ɵdid"](87,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,o.q,null,[o.j]),t["ɵdid"](89,16384,null,0,o.r,[[4,o.q]],null,null),t["ɵdid"](90,4210688,null,0,c.a,[[2,m.a],p.a,t.ElementRef],null,null),t["ɵdid"](91,16384,null,0,r.h,[[3,o.d],r.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](92,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),t["ɵeld"](93,0,null,null,1,"button",[["cdPasswordButton","mutual_password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==t["ɵnov"](l,94).onClick()&&u),u}),null,null)),t["ɵdid"](94,81920,null,0,g.a,[t.ElementRef,t.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),t["ɵeld"](95,0,null,null,1,"button",[["cdCopy2ClipboardButton","mutual_password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==t["ɵnov"](l,96).onClick()&&u),u}),null,null)),t["ɵdid"](96,81920,null,0,f.a,[t.ElementRef,t.Renderer2,v.j,b.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,x)),t["ɵdid"](98,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,P)),t["ɵdid"](100,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](101,0,null,null,5,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](102,0,null,null,4,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,q)),t["ɵdid"](104,16384,null,0,h.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](105,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,C.b,C.a)),t["ɵdid"](106,49152,null,0,S.a,[h.Location,R.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.bsModalRef),l(n,7,0,e.discoveryForm),l(n,10,0,e.discoveryForm),l(n,13,0),l(n,22,0,"user"),l(n,26,0,"user"),l(n,28,0,e.discoveryForm.showError("user",t["ɵnov"](n,7),"required")),l(n,30,0,e.discoveryForm.showError("user",t["ɵnov"](n,7),"pattern")),l(n,32,0),l(n,42,0,"password"),l(n,46,0,"password"),l(n,49,0,"password"),l(n,51,0,"password"),l(n,53,0,e.discoveryForm.showError("password",t["ɵnov"](n,7),"required")),l(n,55,0,e.discoveryForm.showError("password",t["ɵnov"](n,7),"pattern")),l(n,57,0),l(n,67,0,"mutual_user"),l(n,71,0,"mutual_user"),l(n,73,0,e.discoveryForm.showError("mutual_user",t["ɵnov"](n,7),"required")),l(n,75,0,e.discoveryForm.showError("mutual_user",t["ɵnov"](n,7),"pattern")),l(n,77,0),l(n,87,0,"mutual_password"),l(n,91,0,"mutual_password"),l(n,94,0,"mutual_password"),l(n,96,0,"mutual_password"),l(n,98,0,e.discoveryForm.showError("mutual_password",t["ɵnov"](n,7),"required")),l(n,100,0,e.discoveryForm.showError("mutual_password",t["ɵnov"](n,7),"pattern")),l(n,104,0,e.hasPermission),l(n,106,0,"Cancel",e.bsModalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,12,0,t["ɵnov"](n,13).hasErrors,t["ɵnov"](n,13).hasSuccess),l(n,19,0,t["ɵnov"](n,24).ngClassUntouched,t["ɵnov"](n,24).ngClassTouched,t["ɵnov"](n,24).ngClassPristine,t["ɵnov"](n,24).ngClassDirty,t["ɵnov"](n,24).ngClassValid,t["ɵnov"](n,24).ngClassInvalid,t["ɵnov"](n,24).ngClassPending,t["ɵnov"](n,26).validClass,t["ɵnov"](n,26).invalidClass),l(n,31,0,t["ɵnov"](n,32).hasErrors,t["ɵnov"](n,32).hasSuccess),l(n,39,0,t["ɵnov"](n,44).ngClassUntouched,t["ɵnov"](n,44).ngClassTouched,t["ɵnov"](n,44).ngClassPristine,t["ɵnov"](n,44).ngClassDirty,t["ɵnov"](n,44).ngClassValid,t["ɵnov"](n,44).ngClassInvalid,t["ɵnov"](n,44).ngClassPending,t["ɵnov"](n,46).validClass,t["ɵnov"](n,46).invalidClass),l(n,56,0,t["ɵnov"](n,57).hasErrors,t["ɵnov"](n,57).hasSuccess),l(n,64,0,t["ɵnov"](n,69).ngClassUntouched,t["ɵnov"](n,69).ngClassTouched,t["ɵnov"](n,69).ngClassPristine,t["ɵnov"](n,69).ngClassDirty,t["ɵnov"](n,69).ngClassValid,t["ɵnov"](n,69).ngClassInvalid,t["ɵnov"](n,69).ngClassPending,t["ɵnov"](n,71).validClass,t["ɵnov"](n,71).invalidClass),l(n,76,0,t["ɵnov"](n,77).hasErrors,t["ɵnov"](n,77).hasSuccess),l(n,84,0,t["ɵnov"](n,89).ngClassUntouched,t["ɵnov"](n,89).ngClassTouched,t["ɵnov"](n,89).ngClassPristine,t["ɵnov"](n,89).ngClassDirty,t["ɵnov"](n,89).ngClassValid,t["ɵnov"](n,89).ngClassInvalid,t["ɵnov"](n,89).ngClassPending,t["ɵnov"](n,91).validClass,t["ɵnov"](n,91).invalidClass)}))}function A(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-discovery-modal",[],null,null,null,B,E)),t["ɵdid"](1,114688,null,0,_.a,[p.a,w.a,y.a,k.a,b.a],null,null)],(function(l,n){l(n,1,0)}),null)}var M=t["ɵccf"]("cd-iscsi-target-discovery-modal",_.a,A,{},{},[])},chpi:function(l,n,e){"use strict";e.d(n,"a",(function(){return h}));var t=e("LvDl"),u=e("wd/R"),i=(e("F83c"),e("0+/T")),s=(e("sne2"),e("uIqm"),e("x38r")),a=e("oxzT"),o=e("yJti"),r=e("vCyI"),d=e("kvvV"),c=e("jVDg"),m=(e("a0VL"),e("aexS"),e("VTlA"),e("kn/O"),e("WxU5")),p=e("2GqK");class h{constructor(l,n,e,t,u,i,s,o){this.authStorageService=l,this.rbdService=n,this.modalService=e,this.cdDatePipe=t,this.taskListService=u,this.taskWrapper=i,this.i18n=s,this.actionLabels=o,this.icons=a.a,this.executingTasks=[],this.selection=new r.a,this.disablePurgeBtn=!0,this.permission=this.authStorageService.getPermissions().rbdImage,this.tableActions=[{permission:"update",icon:a.a.undo,click:()=>this.restoreModal(),name:this.actionLabels.RESTORE},{permission:"delete",icon:a.a.destroy,click:()=>this.deleteModal(),name:this.actionLabels.DELETE}]}ngOnInit(){this.columns=[{name:this.i18n("ID"),prop:"id",flexGrow:1,cellTransformation:s.a.executing},{name:this.i18n("Name"),prop:"name",flexGrow:1},{name:this.i18n("Pool"),prop:"pool_name",flexGrow:1},{name:this.i18n("Namespace"),prop:"namespace",flexGrow:1},{name:this.i18n("Status"),prop:"deferment_end_time",flexGrow:1,cellTemplate:this.expiresTpl},{name:this.i18n("Deleted At"),prop:"deletion_time",flexGrow:1,pipe:this.cdDatePipe}],this.taskListService.init(()=>this.rbdService.listTrash(),l=>this.prepareResponse(l),l=>this.images=l,()=>this.onFetchError(),l=>["rbd/trash/remove","rbd/trash/restore"].includes(l.name),(l,n)=>new c.a(l.pool_name,l.namespace,l.id).toString()===n.metadata.image_id_spec,void 0)}prepareResponse(l){let n=[];const e={};l.forEach(l=>{t.isUndefined(e[l.status])&&(e[l.status]=[]),e[l.status].push(l.pool_name),n=n.concat(l.value),this.disablePurgeBtn=!n.length});const i=[];return t.forEach(e,(l,n)=>{i.push({status:parseInt(n,10),statusFor:(l.length>1?"pools ":"pool ")+""+l.join(", ")+""})}),this.viewCacheStatusList=i,n.forEach(l=>{l.cdIsExpired=u().isAfter(l.deferment_end_time)}),n}onFetchError(){this.table.reset(),this.viewCacheStatusList=[{status:o.a.ValueException}]}updateSelection(l){this.selection=l}restoreModal(){const l={poolName:this.selection.first().pool_name,namespace:this.selection.first().namespace,imageName:this.selection.first().name,imageId:this.selection.first().id};this.modalRef=this.modalService.show(p.a,{initialState:l})}deleteModal(){const l=this.selection.first().pool_name,n=this.selection.first().namespace,e=this.selection.first().id,t=this.selection.first().deferment_end_time,u=new c.a(l,n,e);this.modalRef=this.modalService.show(i.a,{initialState:{itemDescription:"RBD",itemNames:[u],bodyTemplate:this.deleteTpl,bodyContext:{$implicit:t},submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new d.a("rbd/trash/remove",{image_id_spec:u.toString()}),call:this.rbdService.removeTrash(u,!0)})}})}isExpired(l){return u().isAfter(l)}purgeModal(){this.modalService.show(m.a)}}},cxJu:function(l,n,e){"use strict";e.d(n,"a",(function(){return r}));var t=e("quSY"),u=(e("XED3"),e("oxzT")),i=e("vCyI"),s=(e("aexS"),e("SuaG")),a=e("+26A"),o=e("puGn");class r{constructor(l,n,e,s){this.authStorageService=l,this.rbdMirroringService=n,this.modalService=e,this.i18n=s,this.selection=new i.a,this.peersExist=!0,this.subs=new t.a,this.permission=this.authStorageService.getPermissions().rbdMirroring;const a={permission:"update",icon:u.a.edit,click:()=>this.editSiteNameModal(),name:this.i18n("Edit Site Name"),canBePrimary:()=>!0,disable:()=>!1},o={permission:"update",icon:u.a.upload,click:()=>this.createBootstrapModal(),name:this.i18n("Create Bootstrap Token"),disable:()=>!1},r={permission:"update",icon:u.a.download,click:()=>this.importBootstrapModal(),name:this.i18n("Import Bootstrap Token"),disable:()=>this.peersExist};this.tableActions=[a,o,r]}ngOnInit(){this.subs.add(this.rbdMirroringService.startPolling()),this.subs.add(this.rbdMirroringService.subscribeSummary(l=>{this.status=l.content_data.status,this.siteName=l.site_name,this.peersExist=!!l.content_data.pools.find(l=>l.peer_uuids.length>0)}))}ngOnDestroy(){this.subs.unsubscribe()}editSiteNameModal(){this.modalRef=this.modalService.show(o.a,{initialState:{siteName:this.siteName}})}createBootstrapModal(){this.modalRef=this.modalService.show(s.a,{initialState:{siteName:this.siteName}})}importBootstrapModal(){this.modalRef=this.modalService.show(a.a,{initialState:{siteName:this.siteName}})}}},daK0:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("s7LF"),u=e("XNiG"),i=(e("Ekvf"),e("F83c"),e("mtw6")),s=e("QFaf"),a=e("kvvV");e("aexS"),e("9nlD");class o{constructor(l,n,e,t,u,i){this.modalRef=l,this.authStorageService=n,this.notificationService=e,this.poolService=t,this.rbdService=u,this.i18n=i,this.pools=null,this.editing=!1,this.poolPermission=this.authStorageService.getPermissions().pool,this.createForm()}createForm(){this.namespaceForm=new s.a({pool:new t.i(""),namespace:new t.i("")},this.validator(),this.asyncValidator())}validator(){return l=>{const n=l.get("pool"),e=l.get("namespace");let t=null;n.value||(t={required:!0}),n.setErrors(t);let u=null;return e.value||(u={required:!0}),e.setErrors(u),null}}asyncValidator(){return l=>new Promise(n=>{const e=l.get("pool"),t=l.get("namespace");this.rbdService.listNamespaces(e.value).subscribe(l=>{if(l.some(l=>l.namespace===t.value)){const l={namespaceExists:!0};t.setErrors(l),n(l)}else n(null)})})}ngOnInit(){this.onSubmit=new u.a,this.poolPermission.read&&this.poolService.list(["pool_name","type","application_metadata"]).then(l=>{const n=[];for(const e of l)this.rbdService.isRBDPool(e)&&"replicated"===e.type&&n.push(e);if(this.pools=n,1===this.pools.length){const l=this.pools[0].pool_name;this.namespaceForm.get("pool").setValue(l)}})}submit(){const l=this.namespaceForm.getValue("pool"),n=this.namespaceForm.getValue("namespace"),e=new a.a;e.name="rbd/namespace/create",e.metadata={pool:l,namespace:n},this.rbdService.createNamespace(l,n).toPromise().then(()=>{this.notificationService.show(i.a.success,this.i18n("Created namespace '{{pool}}/{{namespace}}'",{pool:l,namespace:n})),this.modalRef.hide(),this.onSubmit.next()}).catch(()=>{this.namespaceForm.setErrors({cdSubmitButton:!0})})}}},"e/kN":function(l,n,e){"use strict";e.d(n,"a",(function(){return c}));var t=e("LvDl"),u=(e("my5R"),e("+fVR")),i=e("0+/T"),s=(e("sne2"),e("uIqm"),e("x38r")),a=e("oxzT"),o=e("vCyI"),r=e("kvvV"),d=(e("FFMq"),e("G1/K"),e("aexS"),e("VTlA"),e("kn/O"),e("Sofw"));class c extends u.a{constructor(l,n,e,t,u,i,s,r,d){super(),this.authStorageService=l,this.i18n=n,this.iscsiService=e,this.joinPipe=t,this.taskListService=u,this.notAvailablePipe=i,this.modalService=s,this.taskWrapper=r,this.actionLabels=d,this.available=void 0,this.selection=new o.a,this.targets=[],this.icons=a.a,this.builders={"iscsi/target/create":l=>({target_iqn:l.target_iqn})},this.permission=this.authStorageService.getPermissions().iscsi,this.tableActions=[{permission:"create",icon:a.a.add,routerLink:()=>"/block/iscsi/targets/create",name:this.actionLabels.CREATE},{permission:"update",icon:a.a.edit,routerLink:()=>"/block/iscsi/targets/edit/"+this.selection.first().target_iqn,name:this.actionLabels.EDIT,disable:()=>this.getEditDisableDesc()},{permission:"delete",icon:a.a.destroy,click:()=>this.deleteIscsiTargetModal(),name:this.actionLabels.DELETE,disable:()=>this.getDeleteDisableDesc()}]}ngOnInit(){this.columns=[{name:this.i18n("Target"),prop:"target_iqn",flexGrow:2,cellTransformation:s.a.executing},{name:this.i18n("Portals"),prop:"cdPortals",pipe:this.joinPipe,flexGrow:2},{name:this.i18n("Images"),prop:"cdImages",pipe:this.joinPipe,flexGrow:2},{name:this.i18n("# Sessions"),prop:"info.num_sessions",pipe:this.notAvailablePipe,flexGrow:1}],this.iscsiService.status().subscribe(l=>{this.available=l.available,l.available?(this.iscsiService.version().subscribe(l=>{this.cephIscsiConfigVersion=l.ceph_iscsi_config_version,this.taskListService.init(()=>this.iscsiService.listTargets(),l=>this.prepareResponse(l),l=>this.targets=l,()=>this.onFetchError(),this.taskFilter,this.itemFilter,this.builders)}),this.iscsiService.settings().subscribe(l=>{this.settings=l})):this.status=l.message})}ngOnDestroy(){this.summaryDataSubscription&&this.summaryDataSubscription.unsubscribe()}getEditDisableDesc(){const l=this.selection.first();return l&&l.cdExecuting?l.cdExecuting:l&&t.isUndefined(l.info)?this.i18n("Unavailable gateway(s)"):!l}getDeleteDisableDesc(){const l=this.selection.first();return l&&l.cdExecuting?l.cdExecuting:l&&t.isUndefined(l.info)?this.i18n("Unavailable gateway(s)"):l&&l.info&&l.info.num_sessions?this.i18n("Target has active sessions"):!l}prepareResponse(l){return l.forEach(l=>{l.cdPortals=l.portals.map(l=>`${l.host}:${l.ip}`),l.cdImages=l.disks.map(l=>`${l.pool}/${l.image}`)}),l}onFetchError(){this.table.reset()}itemFilter(l,n){return l.target_iqn===n.metadata.target_iqn}taskFilter(l){return["iscsi/target/create","iscsi/target/edit","iscsi/target/delete"].includes(l.name)}updateSelection(l){this.selection=l}deleteIscsiTargetModal(){const l=this.selection.first().target_iqn;this.modalRef=this.modalService.show(i.a,{initialState:{itemDescription:this.i18n("iSCSI target"),itemNames:[l],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new r.a("iscsi/target/delete",{target_iqn:l}),call:this.iscsiService.deleteTarget(l)})}})}configureDiscoveryAuth(){this.modalService.show(d.a,{})}}},eF8U:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("mXUL");e("jMP8"),e.d(n,"a",(function(){return c})),e.d(n,"b",(function(){return S}));var c=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function m(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function p(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,12,"select",[["class","form-control custom-select"]],[[8,"id",0],[8,"name",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.A]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](8,0,null,null,2,"option",[],null,null,null,null,null)),t["ɵdid"](9,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{ngValue:[0,"ngValue"]},null),t["ɵdid"](10,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,m)),t["ɵdid"](12,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.setting),l(n,7,0,e.setting),l(n,9,0,null),l(n,10,0,null),l(n,12,0,e.limits.values)}),(function(l,n){var e=n.component;l(n,0,1,[t["ɵinlineInterpolate"](1,"",e.setting,""),t["ɵinlineInterpolate"](1,"",e.setting,""),t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass])}))}function h(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,8,"input",[["class","form-control"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,1)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&u),"change"===n&&(u=!1!==t["ɵnov"](l,2).onChange(e.target.value)&&u),"input"===n&&(u=!1!==t["ɵnov"](l,2).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,2).onTouched()&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵdid"](2,16384,null,0,u.w,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l,n){return[l,n]}),[u.e,u.w]),t["ɵdid"](4,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](6,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](7,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](8,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.setting),l(n,8,0,e.setting)}),(function(l,n){l(n,0,0,t["ɵnov"](n,6).ngClassUntouched,t["ɵnov"](n,6).ngClassTouched,t["ɵnov"](n,6).ngClassPristine,t["ɵnov"](n,6).ngClassDirty,t["ɵnov"](n,6).ngClassValid,t["ɵnov"](n,6).ngClassInvalid,t["ɵnov"](n,6).ngClassPending,t["ɵnov"](n,8).validClass,t["ɵnov"](n,8).invalidClass)}))}function g(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,1)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.setting),l(n,7,0,e.setting)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,25,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,0,"br",[],null,null,null,null,null)),(l()(),t["ɵeld"](2,0,null,null,11,"div",[["class","custom-control custom-radio custom-control-inline"]],null,null,null,null,null)),(l()(),t["ɵeld"](3,0,null,null,8,"input",[["class","custom-control-input"],["type","radio"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,4)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,4).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,4)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,4)._compositionEnd(e.target.value)&&u),"change"===n&&(u=!1!==t["ɵnov"](l,5).onChange()&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,5).onTouched()&&u),u}),null,null)),t["ɵdid"](4,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵdid"](5,212992,null,0,u.x,[t.Renderer2,t.ElementRef,u.D,t.Injector],{formControlName:[0,"formControlName"],value:[1,"value"]},null),t["ɵprd"](1024,null,u.p,(function(l,n){return[l,n]}),[u.e,u.x]),t["ɵdid"](7,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](9,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](10,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](11,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](12,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](-1,null,["Yes"])),(l()(),t["ɵeld"](14,0,null,null,11,"div",[["class","custom-control custom-radio custom-control-inline"]],null,null,null,null,null)),(l()(),t["ɵeld"](15,0,null,null,8,"input",[["class","custom-control-input"],["type","radio"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,16)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,16).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,16)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,16)._compositionEnd(e.target.value)&&u),"change"===n&&(u=!1!==t["ɵnov"](l,17).onChange()&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,17).onTouched()&&u),u}),null,null)),t["ɵdid"](16,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵdid"](17,212992,null,0,u.x,[t.Renderer2,t.ElementRef,u.D,t.Injector],{formControlName:[0,"formControlName"],value:[1,"value"]},null),t["ɵprd"](1024,null,u.p,(function(l,n){return[l,n]}),[u.e,u.x]),t["ɵdid"](19,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](21,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](22,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](23,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](24,0,null,null,1,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](-1,null,["No"]))],(function(l,n){var e=n.component;l(n,5,0,e.setting,!0),l(n,7,0,e.setting),l(n,11,0,e.setting),l(n,17,0,e.setting,!1),l(n,19,0,e.setting),l(n,23,0,e.setting)}),(function(l,n){var e=n.component;l(n,3,0,e.setting+"True",t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending,t["ɵnov"](n,11).validClass,t["ɵnov"](n,11).invalidClass),l(n,12,0,e.setting+"True"),l(n,15,0,e.setting+"False",t["ɵnov"](n,21).ngClassUntouched,t["ɵnov"](n,21).ngClassTouched,t["ɵnov"](n,21).ngClassPristine,t["ɵnov"](n,21).ngClassDirty,t["ɵnov"](n,21).ngClassValid,t["ɵnov"](n,21).ngClassInvalid,t["ɵnov"](n,21).ngClassPending,t["ɵnov"](n,23).validClass,t["ɵnov"](n,23).invalidClass),l(n,24,0,e.setting+"False")}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"span",[],null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,h)),t["ɵdid"](2,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,g)),t["ɵdid"](4,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,f)),t["ɵdid"](6,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0,"int"===e.limits.type),l(n,4,0,"str"===e.limits.type),l(n,6,0,"bool"===e.limits.type)}),null)}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](2,null,["Must be greater than or equal to ","."]))],null,(function(l,n){l(n,2,0,n.component.limits.min)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](2,null,["Must be less than or equal to ","."]))],null,(function(l,n){l(n,2,0,n.component.limits.max)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,17,"div",[["class","form-group"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"has-error",null],[2,"has-success",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,1).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,1).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,4).onSubmit()&&u),u}),d.b,d.a)),t["ɵdid"](1,540672,null,0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](3,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](4,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),t["ɵdid"](5,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](8,0,null,0,1,"label",[["class","col-form-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),t["ɵted"](9,null,["",""])),(l()(),t["ɵand"](16777216,null,0,1,null,p)),t["ɵdid"](11,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,v)),t["ɵdid"](13,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,b)),t["ɵdid"](15,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,C)),t["ɵdid"](17,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.settingsForm),l(n,4,0,e.settingsForm),l(n,5,0),l(n,11,0,"enum"===e.limits.type),l(n,13,0,"enum"!==e.limits.type),l(n,15,0,e.settingsForm.showError(e.setting,e.formDir,"min")),l(n,17,0,e.settingsForm.showError(e.setting,e.formDir,"max"))}),(function(l,n){var e=n.component;l(n,0,0,t["ɵnov"](n,3).ngClassUntouched,t["ɵnov"](n,3).ngClassTouched,t["ɵnov"](n,3).ngClassPristine,t["ɵnov"](n,3).ngClassDirty,t["ɵnov"](n,3).ngClassValid,t["ɵnov"](n,3).ngClassInvalid,t["ɵnov"](n,3).ngClassPending,t["ɵnov"](n,5).hasErrors,t["ɵnov"](n,5).hasSuccess),l(n,8,0,t["ɵinlineInterpolate"](1,"",e.setting,"")),l(n,9,0,e.setting)}))}},gr3l:function(l,n,e){"use strict";e.d(n,"a",(function(){return h}));var t=e("s7LF"),u=e("LvDl"),i=e("cp0P"),s=(e("my5R"),e("F83c"),e("DNAf")),a=e("a96k"),o=(e("sne2"),e("oxzT")),r=e("QFaf"),d=e("1Ni5"),c=e("kvvV"),m=(e("kn/O"),e("Z4cD")),p=e("a6qe");class h{constructor(l,n,e,t,u,i,a,r){this.iscsiService=l,this.modalService=n,this.rbdService=e,this.router=t,this.route=u,this.i18n=i,this.taskWrapper=a,this.actionLabels=r,this.api_version=0,this.minimum_gateways=1,this.icons=o.a,this.isEdit=!1,this.portalsSelections=[],this.imagesInitiatorSelections=[],this.groupDiskSelections=[],this.groupMembersSelections=[],this.imagesSettings={},this.messages={portals:new s.a({noOptions:this.i18n("There are no portals available.")},this.i18n),images:new s.a({noOptions:this.i18n("There are no images available.")},this.i18n),initiatorImage:new s.a({noOptions:this.i18n("There are no images available. Please make sure you add an image to the target.")},this.i18n),groupInitiator:new s.a({noOptions:this.i18n("There are no initiators available. Please make sure you add an initiator to the target.")},this.i18n)},this.IQN_REGEX=/^iqn\.(19|20)\d\d-(0[1-9]|1[0-2])\.\D{2,3}(\.[A-Za-z0-9-]+)+(:[A-Za-z0-9-\.]+)*$/,this.USER_REGEX=/^[\w\.:@_-]{8,64}$/,this.PASSWORD_REGEX=/^[\w@\-_\/]{12,16}$/,this.resource=this.i18n("target")}ngOnInit(){const l=[this.iscsiService.listTargets(),this.rbdService.list(),this.iscsiService.portals(),this.iscsiService.settings(),this.iscsiService.version()];this.router.url.startsWith("/block/iscsi/targets/edit")&&(this.isEdit=!0,this.route.params.subscribe(n=>{this.target_iqn=decodeURIComponent(n.target_iqn),l.push(this.iscsiService.getTarget(this.target_iqn))})),this.action=this.isEdit?this.actionLabels.EDIT:this.actionLabels.CREATE,Object(i.a)(l).subscribe(l=>{const n=u(l[0]).filter(l=>l.target_iqn!==this.target_iqn).flatMap(l=>l.disks).map(l=>`${l.pool}/${l.image}`).value();"api_version"in l[3]&&(this.api_version=l[3].api_version),this.minimum_gateways=l[3].config.minimum_gateways,this.target_default_controls=l[3].target_default_controls,this.target_controls_limits=l[3].target_controls_limits,this.disk_default_controls=l[3].disk_default_controls,this.disk_controls_limits=l[3].disk_controls_limits,this.backstores=l[3].backstores,this.default_backstore=l[3].default_backstore,this.unsupported_rbd_features=l[3].unsupported_rbd_features,this.required_rbd_features=l[3].required_rbd_features,this.imagesAll=u(l[1]).flatMap(l=>l.value).filter(l=>!l.namespace&&-1===n.indexOf(`${l.pool_name}/${l.name}`)&&0!==this.getValidBackstores(l).length).value(),this.imagesSelections=this.imagesAll.map(l=>new a.a(!1,`${l.pool_name}/${l.name}`,""));const e=[];l[2].forEach(l=>{l.ip_addresses.forEach(n=>{e.push(new a.a(!1,l.name+":"+n,""))})}),this.portalsSelections=[...e],this.cephIscsiConfigVersion=l[4].ceph_iscsi_config_version,this.createForm(),l[5]&&this.resolveModel(l[5])})}createForm(){if(this.targetForm=new r.a({target_iqn:new t.i("iqn.2001-07.com.ceph:"+Date.now(),{validators:[t.B.required,t.B.pattern(this.IQN_REGEX)]}),target_controls:new t.i({}),portals:new t.i([],{validators:[d.a.custom("minGateways",l=>u.uniq(l.map(l=>l.split(":")[0])).length{const n=this.getLunIds(l);return n.length!==u.uniq(n).length}),d.a.custom("dupWwn",l=>{const n=this.getWwns(l);return n.length!==u.uniq(n).length})]}),initiators:new t.f([]),groups:new t.f([]),acl_enabled:new t.i(!1)}),this.cephIscsiConfigVersion>10){const l=new r.a({user:new t.i(""),password:new t.i(""),mutual_user:new t.i(""),mutual_password:new t.i("")});this.setAuthValidator(l),this.targetForm.addControl("auth",l)}}resolveModel(l){this.targetForm.patchValue({target_iqn:l.target_iqn,target_controls:l.target_controls,acl_enabled:l.acl_enabled}),this.cephIscsiConfigVersion>10&&this.targetForm.patchValue({auth:l.auth});const n=[];u.forEach(l.portals,l=>{n.push(`${l.host}:${l.ip}`)}),this.targetForm.patchValue({portals:n});const e=[];u.forEach(l.disks,l=>{const n=`${l.pool}/${l.image}`;e.push(n),this.imagesSettings[n]={backstore:l.backstore},this.imagesSettings[n][l.backstore]=l.controls,"lun"in l&&(this.imagesSettings[n].lun=l.lun),"wwn"in l&&(this.imagesSettings[n].wwn=l.wwn),this.onImageSelection({option:{name:n,selected:!0}})}),this.targetForm.patchValue({disks:e}),u.forEach(l.clients,l=>{const n=this.addInitiator();l.luns=u.map(l.luns,l=>`${l.pool}/${l.image}`),n.patchValue(l)}),u.forEach(l.groups,l=>{const n=this.addGroup();l.disks=u.map(l.disks,l=>`${l.pool}/${l.image}`),n.patchValue(l),u.forEach(l.members,l=>{this.onGroupMemberSelection({option:new a.a(!0,l,"")})})})}hasAdvancedSettings(l){return Object.values(l).length>0}get portals(){return this.targetForm.get("portals")}onPortalSelection(){this.portals.setValue(this.portals.value)}removePortal(l,n){return this.portalsSelections.forEach(l=>{l.name===n&&(l.selected=!1)}),this.portals.value.splice(l,1),this.portals.setValue(this.portals.value),!1}get disks(){return this.targetForm.get("disks")}removeImage(l,n){return this.imagesSelections.forEach(l=>{l.name===n&&(l.selected=!1)}),this.disks.value.splice(l,1),this.removeImageRefs(n),this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1}),!1}removeImageRefs(l){this.initiators.controls.forEach(n=>{const e=n.value.luns.filter(n=>n!==l);n.get("luns").setValue(e)}),this.groups.controls.forEach(n=>{const e=n.value.disks.filter(n=>n!==l);n.get("disks").setValue(e)}),u.forEach(this.imagesInitiatorSelections,(n,e)=>{this.imagesInitiatorSelections[e]=n.filter(n=>n.name!==l)}),u.forEach(this.groupDiskSelections,(n,e)=>{this.groupDiskSelections[e]=n.filter(n=>n.name!==l)})}getDefaultBackstore(l){let n=this.default_backstore;const e=this.getImageById(l);return this.validFeatures(e,this.default_backstore)||this.backstores.forEach(l=>{l!==this.default_backstore&&this.validFeatures(e,l)&&(n=l)}),n}isLunIdInUse(l,n){const e=this.disks.value.filter(l=>l!==n);return this.getLunIds(e).includes(l)}getLunIds(l){return u.map(l,l=>this.imagesSettings[l].lun)}nextLunId(l){const n=this.disks.value.filter(n=>n!==l),e=this.getLunIds(n);let t=0;for(;e.includes(t);)t++;return t}getWwns(l){return u.map(l,l=>this.imagesSettings[l].wwn).filter(l=>u.isString(l)&&""!==l)}onImageSelection(l){const n=l.option;if(n.selected){if(this.imagesSettings[n.name])this.isLunIdInUse(this.imagesSettings[n.name].lun,n.name)&&(this.imagesSettings[n.name].lun=this.nextLunId(n.name));else{const l=this.getDefaultBackstore(n.name);this.imagesSettings[n.name]={backstore:l,lun:this.nextLunId(n.name)},this.imagesSettings[n.name][l]={}}u.forEach(this.imagesInitiatorSelections,(l,e)=>{l.push(new a.a(!1,n.name,"")),this.imagesInitiatorSelections[e]=[...l]}),u.forEach(this.groupDiskSelections,(l,e)=>{l.push(new a.a(!1,n.name,"")),this.groupDiskSelections[e]=[...l]})}else this.removeImageRefs(n.name);this.targetForm.get("disks").updateValueAndValidity({emitEvent:!1})}get initiators(){return this.targetForm.get("initiators")}addInitiator(){const l=new r.a({client_iqn:new t.i("",{validators:[t.B.required,d.a.custom("notUnique",l=>{const n=this.initiators.controls.reduce((function(l,n){return l.concat(n.value.client_iqn)}),[]);return n.indexOf(l)!==n.lastIndexOf(l)}),t.B.pattern(this.IQN_REGEX)]}),auth:new r.a({user:new t.i(""),password:new t.i(""),mutual_user:new t.i(""),mutual_password:new t.i("")}),luns:new t.i([]),cdIsInGroup:new t.i(!1)});this.setAuthValidator(l),this.initiators.push(l),u.forEach(this.groupMembersSelections,(l,n)=>{l.push(new a.a(!1,"","")),this.groupMembersSelections[n]=[...l]});const n=u.map(this.targetForm.getValue("disks"),l=>new a.a(!1,l,""));return this.imagesInitiatorSelections.push(n),l}setAuthValidator(l){d.a.validateIf(l.get("user"),()=>l.getValue("password")||l.getValue("mutual_user")||l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[l.get("password"),l.get("mutual_user"),l.get("mutual_password")]),d.a.validateIf(l.get("password"),()=>l.getValue("user")||l.getValue("mutual_user")||l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[l.get("user"),l.get("mutual_user"),l.get("mutual_password")]),d.a.validateIf(l.get("mutual_user"),()=>l.getValue("mutual_password"),[t.B.required],[t.B.pattern(this.USER_REGEX)],[l.get("user"),l.get("password"),l.get("mutual_password")]),d.a.validateIf(l.get("mutual_password"),()=>l.getValue("mutual_user"),[t.B.required],[t.B.pattern(this.PASSWORD_REGEX)],[l.get("user"),l.get("password"),l.get("mutual_user")])}removeInitiator(l){const n=this.initiators.value[l];this.initiators.removeAt(l),u.forEach(this.groupMembersSelections,(n,e)=>{n.splice(l,1),this.groupMembersSelections[e]=[...n]}),this.groups.controls.forEach(l=>{const e=l.value.members.filter(l=>l!==n.client_iqn);l.get("members").setValue(e)}),this.imagesInitiatorSelections.splice(l,1)}updatedInitiatorSelector(){this.initiators.controls.forEach(l=>{l.get("client_iqn").updateValueAndValidity({emitEvent:!1})}),u.forEach(this.groupMembersSelections,(l,n)=>{u.forEach(l,(l,n)=>{const e=l.name;l.name=this.initiators.controls[n].value.client_iqn,this.groups.controls.forEach(n=>{const t=n.value.members,u=t.indexOf(e);-1!==u&&(t[u]=l.name),n.get("members").setValue(t)})}),this.groupMembersSelections[n]=[...this.groupMembersSelections[n]]})}removeInitiatorImage(l,n,e,t){const u=l.getValue("luns");return u.splice(n,1),l.patchValue({luns:u}),this.imagesInitiatorSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),!1}get groups(){return this.targetForm.get("groups")}addGroup(){const l=new r.a({group_id:new t.i("",{validators:[t.B.required]}),members:new t.i([]),disks:new t.i([])});this.groups.push(l);const n=u.map(this.targetForm.getValue("disks"),l=>new a.a(!1,l,""));this.groupDiskSelections.push(n);const e=u.map(this.initiators.value,l=>new a.a(!1,l.client_iqn,"",!l.cdIsInGroup));return this.groupMembersSelections.push(e),l}removeGroup(l){this.groups.removeAt(l),this.groupDiskSelections.splice(l,1)}onGroupMemberSelection(l){const n=l.option;let e;this.initiators.controls.forEach((l,t)=>{l.value.client_iqn===n.name&&(l.patchValue({luns:[]}),l.get("cdIsInGroup").setValue(n.selected),e=t)}),u.forEach(this.groupMembersSelections,l=>{l[e].enabled=!n.selected})}removeGroupInitiator(l,n,e){const t=l.getValue("members")[n];l.getValue("members").splice(n,1),this.groupMembersSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),this.groupMembersSelections[e]=[...this.groupMembersSelections[e]],this.onGroupMemberSelection({option:new a.a(!1,t,"")})}removeGroupDisk(l,n,e){const t=l.getValue("disks")[n];l.getValue("disks").splice(n,1),this.groupDiskSelections[e].forEach(l=>{l.name===t&&(l.selected=!1)}),this.groupDiskSelections[e]=[...this.groupDiskSelections[e]]}submit(){const l=u.cloneDeep(this.targetForm.value),n={target_iqn:this.targetForm.getValue("target_iqn"),target_controls:this.targetForm.getValue("target_controls"),acl_enabled:this.targetForm.getValue("acl_enabled"),portals:[],disks:[],clients:[],groups:[]};if(this.cephIscsiConfigVersion>10){const l=this.targetForm.get("auth");l.getValue("user")||l.get("user").setValue(""),l.getValue("password")||l.get("password").setValue(""),l.getValue("mutual_user")||l.get("mutual_user").setValue(""),l.getValue("mutual_password")||l.get("mutual_password").setValue("");const e=this.targetForm.getValue("acl_enabled");n.auth={user:e?"":l.getValue("user"),password:e?"":l.getValue("password"),mutual_user:e?"":l.getValue("mutual_user"),mutual_password:e?"":l.getValue("mutual_password")}}let e;l.disks.forEach(l=>{const e=l.split("/"),t=this.imagesSettings[l].backstore;n.disks.push({pool:e[0],image:e[1],backstore:t,controls:this.imagesSettings[l][t],lun:this.imagesSettings[l].lun,wwn:this.imagesSettings[l].wwn})}),l.portals.forEach(l=>{const e=l.indexOf(":");n.portals.push({host:l.substring(0,e),ip:l.substring(e+1)})}),n.acl_enabled&&(l.initiators.forEach(l=>{l.auth.user||(l.auth.user=""),l.auth.password||(l.auth.password=""),l.auth.mutual_user||(l.auth.mutual_user=""),l.auth.mutual_password||(l.auth.mutual_password=""),delete l.cdIsInGroup;const n=[];l.luns.forEach(l=>{const e=l.split("/");n.push({pool:e[0],image:e[1]})}),l.luns=n}),n.clients=l.initiators),n.acl_enabled&&(l.groups.forEach(l=>{const n=[];l.disks.forEach(l=>{const e=l.split("/");n.push({pool:e[0],image:e[1]})}),l.disks=n}),n.groups=l.groups),this.isEdit?(n.new_target_iqn=n.target_iqn,n.target_iqn=this.target_iqn,e=this.taskWrapper.wrapTaskAroundCall({task:new c.a("iscsi/target/edit",{target_iqn:n.target_iqn}),call:this.iscsiService.updateTarget(this.target_iqn,n)})):e=this.taskWrapper.wrapTaskAroundCall({task:new c.a("iscsi/target/create",{target_iqn:n.target_iqn}),call:this.iscsiService.createTarget(n)}),e.subscribe(void 0,()=>{this.targetForm.setErrors({cdSubmitButton:!0})},()=>this.router.navigate(["/block/iscsi/targets"]))}targetSettingsModal(){const l={target_controls:this.targetForm.get("target_controls"),target_default_controls:this.target_default_controls,target_controls_limits:this.target_controls_limits};this.modalRef=this.modalService.show(p.a,{initialState:l})}imageSettingsModal(l){const n={imagesSettings:this.imagesSettings,image:l,api_version:this.api_version,disk_default_controls:this.disk_default_controls,disk_controls_limits:this.disk_controls_limits,backstores:this.getValidBackstores(this.getImageById(l)),control:this.targetForm.get("disks")};this.modalRef=this.modalService.show(m.a,{initialState:n})}validFeatures(l,n){const e=l.features,t=this.required_rbd_features[n];return(e&t)===t&&0==(e&this.unsupported_rbd_features[n])}getImageById(l){return this.imagesAll.find(n=>l===`${n.pool_name}/${n.name}`)}getValidBackstores(l){return this.backstores.filter(n=>this.validFeatures(l,n))}}},jMP8:function(l,n,e){"use strict";e.d(n,"a",(function(){return u}));var t=e("s7LF");e("QFaf");class u{ngOnInit(){const l=[];"min"in this.limits&&l.push(t.B.min(this.limits.min)),"max"in this.limits&&l.push(t.B.max(this.limits.max)),this.settingsForm.get(this.setting).setValidators(l)}}},"k/xb":function(l,n,e){"use strict";e.d(n,"a",(function(){return u})),e.d(n,"b",(function(){return S})),e.d(n,"c",(function(){return i})),e.d(n,"d",(function(){return s})),e.d(n,"j",(function(){return a})),e.d(n,"k",(function(){return o})),e.d(n,"l",(function(){return r})),e.d(n,"m",(function(){return d})),e.d(n,"n",(function(){return c})),e.d(n,"o",(function(){return m})),e.d(n,"p",(function(){return p})),e.d(n,"q",(function(){return h})),e.d(n,"e",(function(){return g})),e.d(n,"f",(function(){return f})),e.d(n,"g",(function(){return v})),e.d(n,"h",(function(){return b})),e.d(n,"i",(function(){return C}));var t=e("sne2");e("Vhfg"),e("gr3l"),e("e/kN"),e("roDX"),e("cxJu"),e("MyVl"),e("5GyT"),e("Z5tW"),e("WkyA"),e("chpi");class u{}const i={breadcrumbs:"Images"},s={breadcrumbs:"Namespaces"},a={breadcrumbs:"Trash"},o={breadcrumbs:"Overall Performance"},r={breadcrumbs:t.a.CREATE},d={breadcrumbs:t.a.EDIT},c={breadcrumbs:t.a.CLONE},m={breadcrumbs:t.a.COPY},p={breadcrumbs:t.a.COPY},h={breadcrumbs:"Mirroring"},g={breadcrumbs:"iSCSI"},f={breadcrumbs:"Overview"},v={breadcrumbs:"Targets"},b={breadcrumbs:t.a.CREATE},C={breadcrumbs:t.a.EDIT};class S{}},kccj:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{}},l7Jr:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("mXUL"),i=e("+gVj"),s=e("eF8U"),a=e("jMP8"),o=e("EEJc"),r=e("ajRT"),d=e("s7LF"),c=e("SVse"),m=e("gp3X"),p=e("sb0X"),h=e("KVJa"),g=e("Z21x"),f=e("sne2"),v=e("a6qe"),b=e("LqlI"),C=e("my5R");e.d(n,"a",(function(){return y}));var S=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function R(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,u.b,u.a)),t["ɵdid"](1,1163264,null,2,i.c,[t.ElementRef,i.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,2,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"cd-iscsi-setting",[],null,null,null,s.b,s.a)),t["ɵdid"](6,114688,null,0,a.a,[],{settingsForm:[0,"settingsForm"],formDir:[1,"formDir"],setting:[2,"setting"],limits:[3,"limits"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,6,0,e.settingsForm,t["ɵnov"](n.parent,7),n.context.$implicit.key,e.getTargetControlLimits(n.context.$implicit.key))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess)}))}function _(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,23,"cd-modal",[],null,null,null,o.c,o.b)),t["ɵdid"](1,49152,null,0,r.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Advanced Settings"])),(l()(),t["ɵeld"](4,0,null,1,19,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,18,"form",[["name","settingsForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,d.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,d.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,d.d,null,[d.l]),t["ɵdid"](9,16384,null,0,d.s,[[4,d.d]],null,null),t["ɵdid"](10,16384,null,0,i.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,5,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,1,"p",[["class","alert-warning"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Changing these parameters from their default values is usually not necessary."])),(l()(),t["ɵand"](16777216,null,null,2,null,R)),t["ɵdid"](15,278528,null,0,c.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),t["ɵpid"](0,c.KeyValuePipe,[t.KeyValueDiffers]),(l()(),t["ɵeld"](17,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](18,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](19,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.save()&&t),t}),m.b,m.a)),t["ɵdid"](20,114688,null,0,p.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Confirm"])),(l()(),t["ɵeld"](22,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,h.b,h.a)),t["ɵdid"](23,49152,null,0,g.a,[c.Location,f.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.settingsForm),l(n,10,0,e.settingsForm),l(n,15,0,t["ɵunv"](n,15,0,t["ɵnov"](n,16).transform(e.settingsForm.controls))),l(n,20,0,e.settingsForm),l(n,23,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending)}))}function w(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-iqn-settings-modal",[],null,null,null,_,S)),t["ɵdid"](1,114688,null,0,v.a,[b.a,C.a],null,null)],(function(l,n){l(n,1,0)}),null)}var y=t["ɵccf"]("cd-iscsi-target-iqn-settings-modal",v.a,w,{},{},[])},lArG:function(l,n,e){"use strict";e.d(n,"a",(function(){return t}));class t{}},"lz+O":function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("ANnk"),s=e("f/UV"),a=e("aexS"),o=e("+gVj"),r=e("SVse"),d=e("EEJc"),c=e("ajRT"),m=e("mXUL"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("sne2"),b=e("WxU5"),C=e("F83c"),S=e("LqlI"),R=e("2EZI"),_=e("Ekvf"),w=e("kn/O");e.d(n,"a",(function(){return V}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","poolName"],["placeholder","Pool name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,1)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,1)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,1)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.e,[t.Renderer2,t.ElementRef,[2,u.b]],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.e]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,3,0,"poolName"),l(n,7,0,"poolName")}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","poolName"],["id","poolName"],["name","poolName"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,1).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,1).onTouched()&&u),u}),null,null)),t["ɵdid"](1,16384,null,0,u.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.A]),t["ɵdid"](3,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](5,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](6,4210688,null,0,i.a,[[2,s.a],a.a,t.ElementRef],null,null),t["ɵdid"](7,16384,null,0,o.h,[[3,u.d],o.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](8,0,null,null,3,"option",[["value",""]],null,null,null,null,null)),t["ɵdid"](9,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{value:[0,"value"]},null),t["ɵdid"](10,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](-1,null,["All"])),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](13,278528,null,0,r.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"poolName"),l(n,7,0,"poolName"),l(n,9,0,""),l(n,10,0,""),l(n,13,0,e.pools)}),(function(l,n){l(n,0,0,t["ɵnov"](n,5).ngClassUntouched,t["ɵnov"](n,5).ngClassTouched,t["ɵnov"](n,5).ngClassPristine,t["ɵnov"](n,5).ngClassDirty,t["ɵnov"](n,5).ngClassValid,t["ɵnov"](n,5).ngClassInvalid,t["ɵnov"](n,5).ngClassPending,t["ɵnov"](n,7).validClass,t["ɵnov"](n,7).invalidClass)}))}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,41,"cd-modal",[],null,null,null,d.c,d.b)),t["ɵdid"](1,49152,null,0,c.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Purge Trash"])),(l()(),t["ɵeld"](4,0,null,1,37,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,36,"form",[["class","form"],["name","purgeForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,u.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](9,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](10,16384,null,0,o.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,23,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,12,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To purge, select one or"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](16,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["All"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](19,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["pools and click"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](22,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Purge Trash"])),(l()(),t["ɵted"](-1,null,[".  "])),(l()(),t["ɵeld"](25,0,null,null,9,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,m.b,m.a)),t["ɵdid"](26,1163264,null,2,o.c,[t.ElementRef,o.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](29,0,null,0,1,"label",[["class","col-form-label mx-auto"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Pool:"])),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](32,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,I)),t["ɵdid"](34,16384,null,0,r.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](35,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](36,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](37,0,null,null,2,"cd-submit-button",[["id","purgeFormButton"]],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.purge()&&t),t}),p.b,p.a)),t["ɵdid"](38,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Purge Trash"])),(l()(),t["ɵeld"](40,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](41,49152,null,0,f.a,[r.Location,v.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.purgeForm),l(n,10,0,e.purgeForm),l(n,26,0),l(n,32,0,!e.poolPermission.read),l(n,34,0,e.poolPermission.read),l(n,38,0,e.purgeForm),l(n,41,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,25,0,t["ɵnov"](n,26).hasErrors,t["ɵnov"](n,26).hasSuccess)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-rbd-trash-purge-modal",[],null,null,null,N,y)),t["ɵdid"](1,114688,null,0,b.a,[a.a,C.a,S.a,R.a,_.a,w.a],null,null)],(function(l,n){l(n,1,0)}),null)}var V=t["ɵccf"]("cd-rbd-trash-purge-modal",b.a,F,{},{},[])},my5R:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("mrSG"),u=e("IheW"),i=e("xTzq"),s=e("8Y7J"),a=e("pL04");let o=(()=>{let l=class{constructor(l){this.http=l}listTargets(){return this.http.get("api/iscsi/target")}getTarget(l){return this.http.get("api/iscsi/target/"+l)}updateTarget(l,n){return this.http.put("api/iscsi/target/"+l,n,{observe:"response"})}status(){return this.http.get("ui-api/iscsi/status")}settings(){return this.http.get("ui-api/iscsi/settings")}version(){return this.http.get("ui-api/iscsi/version")}portals(){return this.http.get("ui-api/iscsi/portals")}createTarget(l){return this.http.post("api/iscsi/target",l,{observe:"response"})}deleteTarget(l){return this.http.delete("api/iscsi/target/"+l,{observe:"response"})}getDiscovery(){return this.http.get("api/iscsi/discoveryauth")}updateDiscovery(l){return this.http.put("api/iscsi/discoveryauth",l)}overview(){return this.http.get("ui-api/iscsi/overview")}};return l.ngInjectableDef=s["ɵɵdefineInjectable"]({factory:function(){return new l(s["ɵɵinject"](u.c))},token:l,providedIn:a.a}),l=t.__decorate([i.a,t.__metadata("design:paramtypes",[u.c])],l),l})()},nP0W:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("s7LF"),i=e("EEJc"),s=e("ajRT"),a=e("+gVj"),o=e("mXUL"),r=e("ANnk"),d=e("f/UV"),c=e("aexS"),m=e("SVse"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("sne2"),b=e("aa9H"),C=e("LqlI"),S=e("GiVz"),R=e("XED3"),_=e("kn/O");e.d(n,"a",(function(){return N}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,u.v,[t.ElementRef,t.Renderer2,[2,u.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,u.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.id),l(n,2,0,n.context.$implicit.id)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Peer clusters must be removed prior to disabling mirror."]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,46,"cd-modal",[],null,null,null,i.c,i.b)),t["ɵdid"](1,49152,null,0,s.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit pool mirror mode"])),(l()(),t["ɵeld"](4,0,null,1,42,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,41,"form",[["class","form"],["name","editModeForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,u.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,u.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,u.d,null,[u.l]),t["ɵdid"](9,16384,null,0,u.s,[[4,u.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,28,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,8,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,7,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["To edit the mirror mode for pool  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](16,null,["",""])),(l()(),t["ɵted"](-1,null,[", select a new mode from the list and click  "])),(l()(),t["ɵeld"](18,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Update"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](21,0,null,null,18,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](22,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](25,0,null,0,2,"label",[["class","col-form-label"],["for","mirrorMode"]],null,null,null,null,null)),(l()(),t["ɵeld"](26,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Mode"])),(l()(),t["ɵeld"](28,0,null,0,9,"select",[["class","form-control custom-select"],["formControlName","mirrorMode"],["id","mirrorMode"],["name","mirrorMode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,30).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,30).onTouched()&&u),u}),null,null)),t["ɵdid"](29,4210688,null,0,r.a,[[2,d.a],c.a,t.ElementRef],null,null),t["ɵdid"](30,16384,null,0,u.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,u.p,(function(l){return[l]}),[u.A]),t["ɵdid"](32,671744,[[1,4]],0,u.j,[[3,u.d],[8,null],[8,null],[6,u.p],[2,u.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,u.q,null,[u.j]),t["ɵdid"](34,16384,null,0,u.r,[[4,u.q]],null,null),t["ɵdid"](35,16384,null,0,a.h,[[3,u.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,y)),t["ɵdid"](37,278528,null,0,m.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,0,1,null,k)),t["ɵdid"](39,16384,null,0,m.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](40,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](41,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](42,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),p.b,p.a)),t["ɵdid"](43,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Update"])),(l()(),t["ɵeld"](45,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](46,49152,null,0,f.a,[m.Location,v.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.editModeForm),l(n,10,0,e.editModeForm),l(n,22,0),l(n,32,0,"mirrorMode"),l(n,35,0,"mirrorMode"),l(n,37,0,e.mirrorModes),l(n,39,0,e.editModeForm.showError("mirrorMode",t["ɵnov"](n,7),"cannotDisable")),l(n,43,0,e.editModeForm),l(n,46,0,"Cancel",e.modalRef.hide)}),(function(l,n){var e=n.component;l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,16,0,e.poolName),l(n,21,0,t["ɵnov"](n,22).hasErrors,t["ɵnov"](n,22).hasSuccess),l(n,28,0,t["ɵnov"](n,34).ngClassUntouched,t["ɵnov"](n,34).ngClassTouched,t["ɵnov"](n,34).ngClassPristine,t["ɵnov"](n,34).ngClassDirty,t["ɵnov"](n,34).ngClassValid,t["ɵnov"](n,34).ngClassInvalid,t["ɵnov"](n,34).ngClassPending,t["ɵnov"](n,35).validClass,t["ɵnov"](n,35).invalidClass)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-pool-edit-mode-modal",[],null,null,null,E,w)),t["ɵdid"](1,245760,null,0,b.a,[C.a,S.a,R.a,_.a],null,null)],(function(l,n){l(n,1,0)}),null)}var N=t["ɵccf"]("cd-pool-edit-mode-modal",b.a,I,{},{},[])},nhAp:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("mXUL"),i=e("+gVj"),s=e("s7LF"),a=e("ANnk"),o=e("f/UV"),r=e("aexS"),d=e("SVse"),c=e("eF8U"),m=e("jMP8"),p=e("uYzU"),h=e("EEJc"),g=e("ajRT"),f=e("gp3X"),v=e("sb0X"),b=e("KVJa"),C=e("Z21x"),S=e("sne2"),R=e("Z4cD"),_=e("LqlI"),w=e("my5R");e.d(n,"a",(function(){return x}));var y=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["This field is required."]))],null,null)}function E(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,35,"span",[],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Identifier"])),(l()(),t["ɵeld"](3,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,u.b,u.a)),t["ɵdid"](4,1163264,null,2,i.c,[t.ElementRef,i.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](7,0,null,0,13,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](8,0,null,null,1,"label",[["class","col-form-label required"],["for","lun"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["lun"])),(l()(),t["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","lun"],["id","lun"],["name","lun"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,11)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,11).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,11)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,11)._compositionEnd(e.target.value)&&u),"change"===n&&(u=!1!==t["ɵnov"](l,12).onChange(e.target.value)&&u),"input"===n&&(u=!1!==t["ɵnov"](l,12).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,12).onTouched()&&u),u}),null,null)),t["ɵdid"](11,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵdid"](12,16384,null,0,s.w,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,s.p,(function(l,n){return[l,n]}),[s.e,s.w]),t["ɵdid"](14,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](16,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](17,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](18,16384,null,0,i.h,[[3,s.d],i.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,k)),t["ɵdid"](20,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](21,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,u.b,u.a)),t["ɵdid"](22,1163264,null,2,i.c,[t.ElementRef,i.g],null,null),t["ɵqud"](603979776,3,{FormControlNames:1}),t["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),t["ɵeld"](25,0,null,0,10,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](26,0,null,null,1,"label",[["class","col-form-label"],["for","wwn"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["wwn"])),(l()(),t["ɵeld"](28,0,null,null,7,"input",[["class","form-control"],["formControlName","wwn"],["id","wwn"],["name","wwn"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,29)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,29).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,29)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,29)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](29,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](31,671744,[[3,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](33,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](34,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](35,16384,null,0,i.h,[[3,s.d],i.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){var e=n.component;l(n,4,0),l(n,14,0,"lun"),l(n,18,0,"lun"),l(n,20,0,e.settingsForm.showError("lun",t["ɵnov"](n.parent,12),"required")),l(n,22,0),l(n,31,0,"wwn"),l(n,35,0,"wwn")}),(function(l,n){l(n,3,0,t["ɵnov"](n,4).hasErrors,t["ɵnov"](n,4).hasSuccess),l(n,10,0,t["ɵnov"](n,16).ngClassUntouched,t["ɵnov"](n,16).ngClassTouched,t["ɵnov"](n,16).ngClassPristine,t["ɵnov"](n,16).ngClassDirty,t["ɵnov"](n,16).ngClassValid,t["ɵnov"](n,16).ngClassInvalid,t["ɵnov"](n,16).ngClassPending,t["ɵnov"](n,18).validClass,t["ɵnov"](n,18).invalidClass),l(n,21,0,t["ɵnov"](n,22).hasErrors,t["ɵnov"](n,22).hasSuccess),l(n,28,0,t["ɵnov"](n,33).ngClassUntouched,t["ɵnov"](n,33).ngClassTouched,t["ɵnov"](n,33).ngClassPristine,t["ɵnov"](n,33).ngClassDirty,t["ɵnov"](n,33).ngClassValid,t["ɵnov"](n,33).ngClassInvalid,t["ɵnov"](n,33).ngClassPending,t["ɵnov"](n,35).validClass,t["ɵnov"](n,35).invalidClass)}))}function I(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"option",[],null,null,null,null,null)),t["ɵdid"](1,147456,null,0,s.v,[t.ElementRef,t.Renderer2,[2,s.A]],{value:[0,"value"]},null),t["ɵdid"](2,147456,null,0,s.F,[t.ElementRef,t.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),t["ɵted"](3,null,["",""])),t["ɵppd"](4,1)],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){var e=t["ɵunv"](n,3,0,l(n,4,0,t["ɵnov"](n.parent,0),n.context.$implicit));l(n,3,0,e)}))}function N(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,6,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,u.b,u.a)),t["ɵdid"](1,1163264,null,2,i.c,[t.ElementRef,i.g],null,null),t["ɵqud"](603979776,7,{FormControlNames:1}),t["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),t["ɵeld"](4,0,null,0,2,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"cd-iscsi-setting",[],null,null,null,c.b,c.a)),t["ɵdid"](6,114688,null,0,m.a,[],{settingsForm:[0,"settingsForm"],formDir:[1,"formDir"],setting:[2,"setting"],limits:[3,"limits"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,6,0,e.settingsForm,t["ɵnov"](n.parent.parent.parent,12),n.context.$implicit.key,e.getDiskControlLimits(n.parent.parent.context.$implicit,n.context.$implicit.key))}),(function(l,n){l(n,0,0,t["ɵnov"](n,1).hasErrors,t["ɵnov"](n,1).hasSuccess)}))}function F(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,3,null,null,null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,2,null,N)),t["ɵdid"](2,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),t["ɵpid"](0,d.KeyValuePipe,[t.KeyValueDiffers]),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,2,0,t["ɵunv"](n,2,0,t["ɵnov"](n,3).transform(e.disk_default_controls[n.parent.context.$implicit])))}),null)}function V(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,2,null,null,null,null,null,null,null)),(l()(),t["ɵand"](16777216,null,null,1,null,F)),t["ɵdid"](2,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,2,0,n.component.settingsForm.value.backstore===n.context.$implicit)}),null)}function T(l){return t["ɵvid"](0,[t["ɵpid"](0,p.a,[]),(l()(),t["ɵeld"](1,0,null,null,47,"cd-modal",[],null,null,null,h.c,h.b)),t["ɵdid"](2,49152,null,0,g.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](3,0,null,0,5,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Configure"])),(l()(),t["ɵted"](-1,null,["  "])),(l()(),t["ɵeld"](7,0,null,null,1,"small",[],null,null,null,null,null)),(l()(),t["ɵted"](8,null,["",""])),(l()(),t["ɵeld"](9,0,null,1,39,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](10,0,null,null,38,"form",[["class","form"],["name","settingsForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,12).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,12).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,15).onSubmit()&&u),u}),null,null)),t["ɵdid"](11,16384,null,0,s.G,[],null,null),t["ɵdid"](12,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](14,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](15,16384,null,0,i.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](16,0,null,null,25,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](17,0,null,null,1,"p",[["class","alert-warning"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Changing these parameters from their default values is usually not necessary."])),(l()(),t["ɵand"](16777216,null,null,1,null,E)),t["ɵdid"](20,16384,null,0,d.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵeld"](21,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Settings"])),(l()(),t["ɵeld"](23,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,u.b,u.a)),t["ɵdid"](24,1163264,null,2,i.c,[t.ElementRef,i.g],null,null),t["ɵqud"](603979776,5,{FormControlNames:1}),t["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),t["ɵeld"](27,0,null,0,12,"div",[["class","col-sm-12"]],null,null,null,null,null)),(l()(),t["ɵeld"](28,0,null,null,1,"label",[["class","col-form-label"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Backstore"])),(l()(),t["ɵeld"](30,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","backstore"],["id","backstore"],["name","backstore"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var u=!0;return"change"===n&&(u=!1!==t["ɵnov"](l,31).onChange(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,31).onTouched()&&u),u}),null,null)),t["ɵdid"](31,16384,null,0,s.A,[t.Renderer2,t.ElementRef],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.A]),t["ɵdid"](33,671744,[[5,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](35,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](36,4210688,null,0,a.a,[[2,o.a],r.a,t.ElementRef],null,null),t["ɵdid"](37,16384,null,0,i.h,[[3,s.d],i.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,I)),t["ɵdid"](39,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,V)),t["ɵdid"](41,278528,null,0,d.NgForOf,[t.ViewContainerRef,t.TemplateRef,t.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),t["ɵeld"](42,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](43,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](44,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.save()&&t),t}),f.b,f.a)),t["ɵdid"](45,114688,null,0,v.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Confirm"])),(l()(),t["ɵeld"](47,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,b.b,b.a)),t["ɵdid"](48,49152,null,0,C.a,[d.Location,S.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,2,0,e.modalRef),l(n,12,0,e.settingsForm),l(n,15,0,e.settingsForm),l(n,20,0,e.api_version>=1),l(n,24,0),l(n,33,0,"backstore"),l(n,37,0,"backstore"),l(n,39,0,e.backstores),l(n,41,0,e.backstores),l(n,45,0,e.settingsForm),l(n,48,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,8,0,n.component.image),l(n,10,0,t["ɵnov"](n,14).ngClassUntouched,t["ɵnov"](n,14).ngClassTouched,t["ɵnov"](n,14).ngClassPristine,t["ɵnov"](n,14).ngClassDirty,t["ɵnov"](n,14).ngClassValid,t["ɵnov"](n,14).ngClassInvalid,t["ɵnov"](n,14).ngClassPending),l(n,23,0,t["ɵnov"](n,24).hasErrors,t["ɵnov"](n,24).hasSuccess),l(n,30,0,t["ɵnov"](n,35).ngClassUntouched,t["ɵnov"](n,35).ngClassTouched,t["ɵnov"](n,35).ngClassPristine,t["ɵnov"](n,35).ngClassDirty,t["ɵnov"](n,35).ngClassValid,t["ɵnov"](n,35).ngClassInvalid,t["ɵnov"](n,35).ngClassPending,t["ɵnov"](n,37).validClass,t["ɵnov"](n,37).invalidClass)}))}function D(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-image-settings-modal",[],null,null,null,T,y)),t["ɵdid"](1,114688,null,0,R.a,[_.a,w.a],null,null)],(function(l,n){l(n,1,0)}),null)}var x=t["ɵccf"]("cd-iscsi-target-image-settings-modal",R.a,D,{},{},[])},puGn:function(l,n,e){"use strict";e.d(n,"a",(function(){return s}));var t=e("s7LF"),u=(e("XED3"),e("QFaf")),i=e("kvvV");e("kn/O");class s{constructor(l,n,e){this.modalRef=l,this.rbdMirroringService=n,this.taskWrapper=e,this.createForm()}createForm(){this.editSiteNameForm=new u.a({siteName:new t.i("",{})})}ngOnInit(){this.editSiteNameForm.get("siteName").setValue(this.siteName),this.rbdMirroringService.getSiteName().subscribe(l=>{this.editSiteNameForm.get("siteName").setValue(l.site_name)})}update(){this.taskWrapper.wrapTaskAroundCall({task:new i.a("rbd/mirroring/site_name/edit",{}),call:this.rbdMirroringService.setSiteName(this.editSiteNameForm.getValue("siteName"))}).subscribe(void 0,()=>this.editSiteNameForm.setErrors({cdSubmitButton:!0}),()=>{this.rbdMirroringService.refresh(),this.modalRef.hide()})}}},rFfW:function(l,n,e){"use strict";e.d(n,"a",(function(){return o}));var t=e("8Y7J"),u=e("s7LF"),i=e("oxzT"),s=e("QFaf"),a=e("PhyI");e("aXbf"),e("o8EM");class o{constructor(l,n){this.formatterService=l,this.rbdConfigurationService=n,this.changes=new t.EventEmitter,this.icons=i.a,this.ngDataReady=new t.EventEmitter,this.configurationType=a.b,this.sectionVisibility={}}ngOnInit(){const l=this.createConfigurationFormGroup();this.form.addControl("configuration",l),l.valueChanges.subscribe(()=>{this.changes.emit(this.getDirtyValues.bind(this))}),this.initializeData&&this.initializeData.subscribe(l=>{this.initialData=l.initialData;const n=l.sourceType;this.rbdConfigurationService.getWritableOptionFields().forEach(e=>{const t=l.initialData.filter(l=>l.name===e.name).pop();t&&t.source===n&&this.form.get("configuration."+e.name).setValue(t.value)}),this.ngDataReady.emit()}),this.rbdConfigurationService.getWritableSections().forEach(l=>this.sectionVisibility[l.class]=!1)}getDirtyValues(l=!1,n){if(l&&!n)throw new Error("ProgrammingError: If local values shall be included, a proper localFieldType argument has to be provided, too");const e={};return this.rbdConfigurationService.getWritableOptionFields().forEach(t=>{const u=this.form.get("configuration").get(t.name);this.initialData&&this.initialData[t.name]===u.value||(u.dirty||l&&u.source===n)&&(e[t.name]=null===u.value?u.value:t.type===a.b.bps?this.formatterService.toBytes(u.value):t.type===a.b.milliseconds?this.formatterService.toMilliseconds(u.value):t.type===a.b.iops?this.formatterService.toIops(u.value):u.value)}),e}createConfigurationFormGroup(){const l=new s.a({});return this.rbdConfigurationService.getWritableOptionFields().forEach(n=>{let e;if(n.type!==a.b.milliseconds&&n.type!==a.b.iops&&n.type!==a.b.bps)throw new Error(`Type ${n.type} is unknown, you may need to add it to RbdConfiguration class`);e=new u.i(0,u.B.min(0)),l.addControl(n.name,e)}),l}reset(l){const n=this.form.get("configuration").get(l);n.disabled?(n.setValue(n.previousValue||0),n.enable(),n.previousValue||n.markAsPristine()):(n.previousValue=n.value,n.setValue(null),n.markAsDirty(),n.disable())}isDisabled(l){return this.form.get("configuration").get(l).disabled}toggleSectionVisibility(l){this.sectionVisibility[l]=!this.sectionVisibility[l]}}},roDX:function(l,n,e){"use strict";e.d(n,"a",(function(){return u})),e("my5R");var t=e("x38r");e("o4+5"),e("uYzU");class u{constructor(l,n,e,t){this.iscsiService=l,this.dimlessPipe=n,this.iscsiBackstorePipe=e,this.i18n=t,this.gateways=[],this.images=[]}ngOnInit(){this.gatewaysColumns=[{name:this.i18n("Name"),prop:"name"},{name:this.i18n("State"),prop:"state",flexGrow:1,cellTransformation:t.a.badge,customTemplateConfig:{map:{up:{class:"badge-success"},down:{class:"badge-danger"}}}},{name:this.i18n("# Targets"),prop:"num_targets"},{name:this.i18n("# Sessions"),prop:"num_sessions"}],this.imagesColumns=[{name:this.i18n("Pool"),prop:"pool"},{name:this.i18n("Image"),prop:"image"},{name:this.i18n("Backstore"),prop:"backstore",pipe:this.iscsiBackstorePipe},{name:this.i18n("Read Bytes"),prop:"stats_history.rd_bytes",cellTemplate:this.iscsiSparklineTpl},{name:this.i18n("Write Bytes"),prop:"stats_history.wr_bytes",cellTemplate:this.iscsiSparklineTpl},{name:this.i18n("Read Ops"),prop:"stats.rd",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:this.i18n("Write Ops"),prop:"stats.wr",pipe:this.dimlessPipe,cellTemplate:this.iscsiPerSecondTpl},{name:this.i18n("A/O Since"),prop:"optimized_since",cellTemplate:this.iscsiRelativeDateTpl}]}refresh(){this.iscsiService.overview().subscribe(l=>{this.gateways=l.gateways,this.images=l.images,this.images.map(l=>(l.stats_history&&(l.stats_history.rd_bytes=l.stats_history.rd_bytes.map(l=>l[1]),l.stats_history.wr_bytes=l.stats_history.wr_bytes.map(l=>l[1])),l.cdIsBinary=!0,l))})}}},u0yg:function(l,n,e){"use strict";e.d(n,"b",(function(){return t})),e.d(n,"a",(function(){return u}));class t{}var u=function(l){return l[l.V1=1]="V1",l[l.V2=2]="V2",l}({})},u2XS:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("SVse"),i=e("25BL"),s=e("uIqm"),a=e("LOMR"),o=e("MP8s"),r=e("fxL3"),d=e("gk6K"),c=e("3ris"),m=e("GiVz"),p=e("uYzU"),h=e("iExv");e.d(n,"b",(function(){return g})),e.d(n,"c",(function(){return R})),e.d(n,"a",(function(){return w}));var g=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function f(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""])),(l()(),t["ɵted"](-1,null,["   "])),(l()(),t["ɵeld"](4,0,null,null,6,"span",[["class","badge"]],null,null,null,null,null)),t["ɵprd"](512,null,u["ɵNgClassImpl"],u["ɵNgClassR2Impl"],[t.IterableDiffers,t.KeyValueDiffers,t.ElementRef,t.Renderer2]),t["ɵdid"](6,278528,null,0,u.NgClass,[u["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),t["ɵpad"](7,1),t["ɵpad"](8,1),t["ɵpod"](9,{"badge-success":0,"badge-danger":1}),(l()(),t["ɵted"](10,null,[" "," "]))],(function(l,n){var e=l(n,9,0,l(n,7,0,"logged_in").includes(n.context.$implicit.data.status),l(n,8,0,"logged_out").includes(n.context.$implicit.data.status));l(n,6,0,"badge",e)}),(function(l,n){l(n,0,0,n.context.$implicit.data.cdIcon),l(n,2,0,n.context.$implicit.data.name),l(n,10,0,n.context.$implicit.data.status)}))}function v(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,4,"div",[["class","col-6 metadata"]],null,null,null,null,null)),(l()(),t["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](2,null,["",""])),(l()(),t["ɵeld"](3,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,i.b,i.a)),t["ɵdid"](4,2867200,[[2,4],["detailTable",4]],0,s.a,[t.NgZone,t.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],limit:[3,"limit"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.data,e.columns,"flex",0)}),(function(l,n){l(n,2,0,n.component.title)}))}function b(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function C(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),t["ɵted"](1,null,["",""]))],null,(function(l,n){l(n,1,0,n.parent.context.value)}))}function S(l){return t["ɵvid"](0,[(l()(),t["ɵand"](16777216,null,null,1,null,b)),t["ɵdid"](1,16384,null,0,u.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](16777216,null,null,1,null,C)),t["ɵdid"](3,16384,null,0,u.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,void 0===n.context.row.default||n.context.row.default===n.context.row.current),l(n,3,0,void 0!==n.context.row.default&&n.context.row.default!==n.context.row.current)}),null)}function R(l){return t["ɵvid"](0,[t["ɵqud"](402653184,1,{highlightTpl:0}),t["ɵqud"](671088640,2,{content:0}),t["ɵqud"](671088640,3,{tree:0}),(l()(),t["ɵeld"](3,0,null,null,13,"div",[["class","row"]],null,null,null,null,null)),(l()(),t["ɵeld"](4,0,null,null,10,"div",[["class","col-6"]],null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["iSCSI Topology"])),(l()(),t["ɵeld"](7,0,null,null,7,"tree-root",[],null,[[null,"updateData"],["body","keydown"],["body","mousedown"]],(function(l,n,e){var u=!0,i=l.component;return"body:keydown"===n&&(u=!1!==t["ɵnov"](l,9).onKeydown(e)&&u),"body:mousedown"===n&&(u=!1!==t["ɵnov"](l,9).onMousedown(e)&&u),"updateData"===n&&(u=!1!==i.onUpdateData()&&u),u}),a.b,a.a)),t["ɵprd"](131584,null,o.a,o.a,[]),t["ɵdid"](9,573440,[[3,4],["tree",4]],4,r.a,[o.a,d.a],{nodes:[0,"nodes"],options:[1,"options"]},{updateData:"updateData"}),t["ɵqud"](603979776,4,{loadingTemplate:0}),t["ɵqud"](603979776,5,{treeNodeTemplate:0}),t["ɵqud"](603979776,6,{treeNodeWrapperTemplate:0}),t["ɵqud"](603979776,7,{treeNodeFullTemplate:0}),(l()(),t["ɵand"](0,[[5,2],["treeNodeTemplate",2]],null,0,null,f)),(l()(),t["ɵand"](16777216,null,null,1,null,v)),t["ɵdid"](16,16384,null,0,u.NgIf,[t.ViewContainerRef,t.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),t["ɵand"](0,[[1,2],["highlightTpl",2]],null,0,null,S))],(function(l,n){var e=n.component;l(n,9,0,e.nodes,e.treeOptions),l(n,16,0,e.data)}),null)}function _(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-iscsi-target-details",[],null,null,null,R,g)),t["ɵdid"](1,638976,null,0,c.a,[m.a,p.a,h.a],null,null)],(function(l,n){l(n,1,0)}),null)}var w=t["ɵccf"]("cd-iscsi-target-details",c.a,_,{selection:"selection",settings:"settings",cephIscsiConfigVersion:"cephIscsiConfigVersion"},{},[])},xvu0:function(l,n,e){"use strict";var t=e("8Y7J"),u=e("EEJc"),i=e("ajRT"),s=e("s7LF"),a=e("+gVj"),o=e("mXUL"),r=e("IZUe"),d=e("ANnk"),c=e("f/UV"),m=e("aexS"),p=e("gp3X"),h=e("sb0X"),g=e("KVJa"),f=e("Z21x"),v=e("SVse"),b=e("sne2"),C=e("puGn"),S=e("LqlI"),R=e("XED3"),_=e("kn/O");e.d(n,"a",(function(){return E}));var w=t["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function y(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,39,"cd-modal",[],null,null,null,u.c,u.b)),t["ɵdid"](1,49152,null,0,i.a,[],{modalRef:[0,"modalRef"]},null),(l()(),t["ɵeld"](2,0,null,0,1,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit site name"])),(l()(),t["ɵeld"](4,0,null,1,35,null,null,null,null,null,null,null)),(l()(),t["ɵeld"](5,0,null,null,34,"form",[["class","form"],["name","editSiteNameForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var u=!0;return"submit"===n&&(u=!1!==t["ɵnov"](l,7).onSubmit(e)&&u),"reset"===n&&(u=!1!==t["ɵnov"](l,7).onReset()&&u),"submit"===n&&(u=!1!==t["ɵnov"](l,10).onSubmit()&&u),u}),null,null)),t["ɵdid"](6,16384,null,0,s.G,[],null,null),t["ɵdid"](7,540672,[["formDir",4]],0,s.l,[[8,null],[8,null]],{form:[0,"form"]},null),t["ɵprd"](2048,null,s.d,null,[s.l]),t["ɵdid"](9,16384,null,0,s.s,[[4,s.d]],null,null),t["ɵdid"](10,16384,null,0,a.d,[],{formGroup:[0,"formGroup"]},null),(l()(),t["ɵeld"](11,0,null,null,21,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),t["ɵeld"](12,0,null,null,5,"p",[],null,null,null,null,null)),(l()(),t["ɵeld"](13,0,null,null,4,null,null,null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Edit the site name and click  "])),(l()(),t["ɵeld"](15,0,null,null,1,"kbd",[],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Update"])),(l()(),t["ɵted"](-1,null,["."])),(l()(),t["ɵeld"](18,0,null,null,14,"div",[["class","form-group"]],[[2,"has-error",null],[2,"has-success",null]],null,null,o.b,o.a)),t["ɵdid"](19,1163264,null,2,a.c,[t.ElementRef,a.g],null,null),t["ɵqud"](603979776,1,{FormControlNames:1}),t["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),t["ɵeld"](22,0,null,0,1,"label",[["class","col-form-label required"],["for","siteName"]],null,null,null,null,null)),(l()(),t["ɵted"](-1,null,["Site Name"])),(l()(),t["ɵeld"](24,0,null,0,8,"input",[["autofocus",""],["class","form-control"],["formControlName","siteName"],["id","siteName"],["name","siteName"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var u=!0;return"input"===n&&(u=!1!==t["ɵnov"](l,27)._handleInput(e.target.value)&&u),"blur"===n&&(u=!1!==t["ɵnov"](l,27).onTouched()&&u),"compositionstart"===n&&(u=!1!==t["ɵnov"](l,27)._compositionStart()&&u),"compositionend"===n&&(u=!1!==t["ɵnov"](l,27)._compositionEnd(e.target.value)&&u),u}),null,null)),t["ɵdid"](25,4210688,null,0,r.a,[t.ElementRef],{autofocus:[0,"autofocus"]},null),t["ɵdid"](26,4210688,null,0,d.a,[[2,c.a],m.a,t.ElementRef],null,null),t["ɵdid"](27,16384,null,0,s.e,[t.Renderer2,t.ElementRef,[2,s.b]],null,null),t["ɵprd"](1024,null,s.p,(function(l){return[l]}),[s.e]),t["ɵdid"](29,671744,[[1,4]],0,s.j,[[3,s.d],[8,null],[8,null],[6,s.p],[2,s.E]],{name:[0,"name"]},null),t["ɵprd"](2048,null,s.q,null,[s.j]),t["ɵdid"](31,16384,null,0,s.r,[[4,s.q]],null,null),t["ɵdid"](32,16384,null,0,a.h,[[3,s.d],a.a],{formControlName:[0,"formControlName"]},null),(l()(),t["ɵeld"](33,0,null,null,6,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),t["ɵeld"](34,0,null,null,5,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),t["ɵeld"](35,0,null,null,2,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var t=!0;return"submitAction"===n&&(t=!1!==l.component.update()&&t),t}),p.b,p.a)),t["ɵdid"](36,114688,null,0,h.a,[t.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),t["ɵted"](-1,0,["Update"])),(l()(),t["ɵeld"](38,0,null,null,1,"cd-back-button",[["name","Cancel"]],null,null,null,g.b,g.a)),t["ɵdid"](39,49152,null,0,f.a,[v.Location,b.b],{name:[0,"name"],back:[1,"back"]},null)],(function(l,n){var e=n.component;l(n,1,0,e.modalRef),l(n,7,0,e.editSiteNameForm),l(n,10,0,e.editSiteNameForm),l(n,19,0),l(n,25,0,""),l(n,29,0,"siteName"),l(n,32,0,"siteName"),l(n,36,0,e.editSiteNameForm),l(n,39,0,"Cancel",e.modalRef.hide)}),(function(l,n){l(n,5,0,t["ɵnov"](n,9).ngClassUntouched,t["ɵnov"](n,9).ngClassTouched,t["ɵnov"](n,9).ngClassPristine,t["ɵnov"](n,9).ngClassDirty,t["ɵnov"](n,9).ngClassValid,t["ɵnov"](n,9).ngClassInvalid,t["ɵnov"](n,9).ngClassPending),l(n,18,0,t["ɵnov"](n,19).hasErrors,t["ɵnov"](n,19).hasSuccess),l(n,24,0,t["ɵnov"](n,31).ngClassUntouched,t["ɵnov"](n,31).ngClassTouched,t["ɵnov"](n,31).ngClassPristine,t["ɵnov"](n,31).ngClassDirty,t["ɵnov"](n,31).ngClassValid,t["ɵnov"](n,31).ngClassInvalid,t["ɵnov"](n,31).ngClassPending,t["ɵnov"](n,32).validClass,t["ɵnov"](n,32).invalidClass)}))}function k(l){return t["ɵvid"](0,[(l()(),t["ɵeld"](0,0,null,null,1,"cd-edit-site-mode-modal",[],null,null,null,y,w)),t["ɵdid"](1,114688,null,0,C.a,[S.a,R.a,_.a],null,null)],(function(l,n){l(n,1,0)}),null)}var E=t["ɵccf"]("cd-edit-site-mode-modal",C.a,k,{},{},[])}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/3rdpartylicenses.txt ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/3rdpartylicenses.txt --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/3rdpartylicenses.txt 2020-12-16 17:37:20.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/3rdpartylicenses.txt 2021-04-19 13:53:42.000000000 +0000 @@ -16,30 +16,6 @@ @angular/router MIT -@auth0/angular-jwt -MIT -The MIT License (MIT) - -Copyright (c) 2017 Auth0 Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - @ngx-translate/i18n-polyfill MIT @@ -644,53 +620,6 @@ SOFTWARE. -punycode -MIT -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -querystring -MIT - -Copyright 2012 Irakli Gozalishvili. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - - resize-observer-polyfill MIT The MIT License (MIT) @@ -946,6 +875,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +undefined + simplebar-angular The MIT License (MIT) @@ -1028,31 +959,6 @@ END OF TERMS AND CONDITIONS -url -MIT -The MIT License (MIT) - -Copyright Joyent, Inc. and other Node contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - webpack MIT Copyright JS Foundation and other contributors @@ -1100,6 +1006,3 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -undefined diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/6.9a60f7741889f52ed7ae.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/6.9a60f7741889f52ed7ae.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/6.9a60f7741889f52ed7ae.js 2020-12-16 17:37:20.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/6.9a60f7741889f52ed7ae.js 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{nOaW:function(l,n,e){"use strict";e.r(n);var u=e("8Y7J"),i=e("sne2"),t=e("s7LF"),a=e("LvDl"),o=e("IheW"),s=e("GiVz"),r=e("pL04");let d=(()=>{class l{constructor(l,n){this.http=l,this.i18n=n,this.apiPath="api/crush_rule",this.formTooltips={root:this.i18n("The name of the node under which data should be placed."),failure_domain:this.i18n("The type of CRUSH nodes across which we should separate replicas."),device_class:this.i18n("The device class data should be placed on.")}}create(l){return this.http.post(this.apiPath,l,{observe:"response"})}delete(l){return this.http.delete(`${this.apiPath}/${l}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return l.ngInjectableDef=u["ɵɵdefineInjectable"]({factory:function(){return new l(u["ɵɵinject"](o.c),u["ɵɵinject"](s.a))},token:l,providedIn:r.a}),l})(),c=(()=>{class l{constructor(l,n){this.http=l,this.i18n=n,this.apiPath="api/erasure_code_profile",this.formTooltips={k:this.i18n("Each object is split in data-chunks parts, each stored on a different OSD."),m:this.i18n("Compute coding chunks for each object and store them on different OSDs.\n The number of coding chunks is also the number of OSDs that can be down without losing data."),plugins:{jerasure:{description:this.i18n("The jerasure plugin is the most generic and flexible plugin,\n it is also the default for Ceph erasure coded pools."),technique:this.i18n("The more flexible technique is reed_sol_van : it is enough to set k\n and m. The cauchy_good technique can be faster but you need to chose the packetsize\n carefully. All of reed_sol_r6_op, liberation, blaum_roth, liber8tion are RAID6 equivalents\n in the sense that they can only be configured with m=2."),packetSize:this.i18n("The encoding will be done on packets of bytes size at a time.\n Chosing the right packet size is difficult.\n The jerasure documentation contains extensive information on this topic.")},lrc:{description:this.i18n("With the jerasure plugin, when an erasure coded object is stored on\n multiple OSDs, recovering from the loss of one OSD requires reading from all the others.\n For instance if jerasure is configured with k=8 and m=4, losing one OSD requires reading\n from the eleven others to repair.\n\n The lrc erasure code plugin creates local parity chunks to be able to recover using\n less OSDs. For instance if lrc is configured with k=8, m=4 and l=4, it will create\n an additional parity chunk for every four OSDs. When a single OSD is lost, it can be\n recovered with only four OSDs instead of eleven."),l:this.i18n("Group the coding and data chunks into sets of size locality. For instance,\n for k=4 and m=2, when locality=3 two groups of three are created. Each set can\n be recovered without reading chunks from another set."),crushLocality:this.i18n("The type of the crush bucket in which each set of chunks defined\n by l will be stored. For instance, if it is set to rack, each group of l chunks will be\n placed in a different rack. It is used to create a CRUSH rule step such as step choose\n rack. If it is not set, no such grouping is done.")},isa:{description:this.i18n("The isa plugin encapsulates the ISA library. It only runs on Intel processors."),technique:this.i18n("The ISA plugin comes in two Reed Solomon forms.\n If reed_sol_van is set, it is Vandermonde, if cauchy is set, it is Cauchy.")},shec:{description:this.i18n("The shec plugin encapsulates the multiple SHEC library.\n It allows ceph to recover data more efficiently than Reed Solomon codes."),c:this.i18n("The number of parity chunks each of which includes each data chunk in its\n calculation range. The number is used as a durability estimator. For instance, if c=2,\n 2 OSDs can be down without losing data.")}},crushRoot:this.i18n("The name of the crush bucket used for the first step of the CRUSH rule.\n For instance step take default."),crushFailureDomain:this.i18n("Ensure that no two chunks are in a bucket with the same failure\n domain. For instance, if the failure domain is host no two chunks will be stored on the same\n host. It is used to create a CRUSH rule step such as step chooseleaf host."),crushDeviceClass:this.i18n("Restrict placement to devices of a specific class\n (e.g., ssd or hdd), using the crush device class names in the CRUSH map."),directory:this.i18n("Set the directory name from which the erasure code plugin is loaded.")}}list(){return this.http.get(this.apiPath)}create(l){return this.http.post(this.apiPath,l,{observe:"response"})}delete(l){return this.http.delete(`${this.apiPath}/${l}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return l.ngInjectableDef=u["ɵɵdefineInjectable"]({factory:function(){return new l(u["ɵɵinject"](o.c),u["ɵɵinject"](s.a))},token:l,providedIn:r.a}),l})();var m=e("Ekvf");class f{constructor(){this.nodes=[],this.idTree={},this.allDevices=[],this.buckets=[],this.failureDomains={},this.failureDomainKeys=[],this.devices=[],this.deviceCount=0}static searchFailureDomains(l,n){return this.getFailureDomains(this.search(l,n))}static search(l,n){const[e,u]=n.split("~"),i=l.find(l=>["name","id","type"].some(n=>l[n]===e));return i?(l=this.getSubNodes(i,this.createIdTreeFromNodes(l)),u&&(l=this.filterNodesByDeviceType(l,u)),l):[]}static createIdTreeFromNodes(l){const n={};return l.forEach(l=>{n[l.id]=l}),n}static getSubNodes(l,n){let e=[l];return l.children?(l.children.forEach(l=>{e=e.concat(this.getSubNodes(n[l],n))}),e):e}static filterNodesByDeviceType(l,n){let e,u=l.filter(l=>l.device_class&&l.device_class!==n).map(l=>l.id),i=u;do{e=!1,l=l.filter(l=>!u.includes(l.id));const n=[];l.forEach(l=>{l.children&&l.children.every(l=>u.includes(l))&&(n.push(l.id),e=!0)}),e&&(u=n,i=i.concat(n))}while(e);return(l=a.cloneDeep(l)).map(l=>l.children?(l.children=l.children.filter(l=>!i.includes(l)),l):l)}static getFailureDomains(l){const n={};return l.forEach(l=>{const e=l.type;n[e]||(n[e]=[]),n[e].push(l)}),n}initCrushNodeSelection(l,n,e,u){this.nodes=l,this.idTree=f.createIdTreeFromNodes(l),l.forEach(l=>{this.idTree[l.id]=l}),this.buckets=a.sortBy(l.filter(l=>l.children),"name"),this.controls={root:n,failure:e,device:u},this.preSelectRoot(),this.controls.root.valueChanges.subscribe(()=>this.onRootChange()),this.controls.failure.valueChanges.subscribe(()=>this.onFailureDomainChange()),this.controls.device.valueChanges.subscribe(()=>this.onDeviceChange())}preSelectRoot(){const l=this.nodes.find(l=>"root"===l.type);this.silentSet(this.controls.root,l),this.onRootChange()}silentSet(l,n){l.setValue(n,{emitEvent:!1})}onRootChange(){const l=f.getSubNodes(this.controls.root.value,this.idTree),n=f.getFailureDomains(l);Object.keys(n).forEach(l=>{n[l].length<=1&&delete n[l]}),this.failureDomains=n,this.failureDomainKeys=Object.keys(n).sort(),this.updateFailureDomain()}updateFailureDomain(){let l=this.getIncludedCustomValue(this.controls.failure,Object.keys(this.failureDomains));""===l&&(l=this.setMostCommonDomain(this.controls.failure)),this.updateDevices(l)}getIncludedCustomValue(l,n){return l.dirty&&n.includes(l.value)?l.value:""}setMostCommonDomain(l){let n={n:0,type:""};return Object.keys(this.failureDomains).forEach(l=>{const e=this.failureDomains[l].length;n.nf.getSubNodes(l,this.idTree)));this.allDevices=n.filter(l=>l.device_class).map(l=>l.device_class),this.devices=a.uniq(this.allDevices).sort();const e=1===this.devices.length?this.devices[0]:this.getIncludedCustomValue(this.controls.device,this.devices);this.silentSet(this.controls.device,e),this.onDeviceChange(e)}onDeviceChange(l=this.controls.device.value){this.deviceCount=""===l?this.allDevices.length:this.allDevices.filter(n=>n===l).length}}var g=e("0+/T"),p=e("a96k"),h=e("oxzT"),v=e("QFaf"),b=e("1Ni5"),C=e("PhyI"),R=e("kvvV"),I=e("Fgil"),E=e("aexS"),N=e("aXbf"),V=e("kn/O"),y=e("2EZI");class w extends f{constructor(l,n,e,i,t,a){super(),this.formBuilder=l,this.bsModalRef=n,this.taskWrapper=e,this.crushRuleService=i,this.i18n=t,this.actionLabels=a,this.submitAction=new u.EventEmitter,this.tooltips=this.crushRuleService.formTooltips,this.action=this.actionLabels.CREATE,this.resource=this.i18n("Crush Rule"),this.createForm()}createForm(){this.form=this.formBuilder.group({name:["",[t.B.required,t.B.pattern("[A-Za-z0-9_-]+"),b.a.custom("uniqueName",l=>this.names&&-1!==this.names.indexOf(l))]],root:null,failure_domain:"",device_class:""})}ngOnInit(){this.crushRuleService.getInfo().subscribe(({names:l,nodes:n})=>{this.initCrushNodeSelection(n,this.form.get("root"),this.form.get("failure_domain"),this.form.get("device_class")),this.names=l})}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l=a.cloneDeep(this.form.value);l.root=l.root.name,""===l.device_class&&delete l.device_class,this.taskWrapper.wrapTaskAroundCall({task:new R.a("crushRule/create",l),call:this.crushRuleService.create(l)}).subscribe(void 0,()=>{this.form.setErrors({cdSubmitButton:!0})},()=>{this.bsModalRef.hide(),this.submitAction.emit(l)})}}class T{}class _ extends f{constructor(l,n,e,i,t,a){super(),this.formBuilder=l,this.bsModalRef=n,this.taskWrapper=e,this.ecpService=i,this.i18n=t,this.actionLabels=a,this.submitAction=new u.EventEmitter,this.tooltips=this.ecpService.formTooltips,this.PLUGIN={LRC:"lrc",SHEC:"shec",JERASURE:"jerasure",ISA:"isa"},this.plugin=this.PLUGIN.JERASURE,this.action=this.actionLabels.CREATE,this.resource=this.i18n("EC Profile"),this.createForm(),this.setJerasureDefaults()}createForm(){this.form=this.formBuilder.group({name:[null,[t.B.required,t.B.pattern("[A-Za-z0-9_-]+"),b.a.custom("uniqueName",l=>this.names&&-1!==this.names.indexOf(l))]],plugin:[this.PLUGIN.JERASURE,[t.B.required]],k:[4,[t.B.required,t.B.min(2),b.a.custom("max",()=>this.baseValueValidation(!0)),b.a.custom("unequal",l=>this.lrcDataValidation(l)),b.a.custom("kLowerM",l=>this.shecDataValidation(l))]],m:[2,[t.B.required,t.B.min(1),b.a.custom("max",()=>this.baseValueValidation())]],crushFailureDomain:"",crushRoot:null,crushDeviceClass:"",directory:"",technique:"reed_sol_van",packetSize:[2048,[t.B.min(1)]],l:[3,[t.B.required,t.B.min(1),b.a.custom("unequal",l=>this.lrcLocalityValidation(l))]],crushLocality:"",c:[2,[t.B.required,t.B.min(1),b.a.custom("cGreaterM",l=>this.shecDurabilityValidation(l))]]}),this.form.get("k").valueChanges.subscribe(()=>this.updateValidityOnChange(["m","l"])),this.form.get("m").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","l","c"])),this.form.get("l").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","m"])),this.form.get("plugin").valueChanges.subscribe(l=>this.onPluginChange(l))}baseValueValidation(l=!1){return this.validValidation(()=>this.getKMSum()>this.deviceCount&&this.form.getValue("k")>this.form.getValue("m")===l)}validValidation(l,n){return!((!this.form||n)&&this.plugin!==n)&&l()}getKMSum(){return this.form.getValue("k")+this.form.getValue("m")}lrcDataValidation(l){return this.validValidation(()=>{const n=this.form.getValue("m"),e=this.form.getValue("l"),u=l+n;return this.lrcMultiK=l/(u/e),l%(u/e)!=0},"lrc")}shecDataValidation(l){return this.validValidation(()=>this.form.getValue("m")>l,"shec")}lrcLocalityValidation(l){return this.validValidation(()=>{const n=this.getKMSum();return this.lrcGroups=l>0?n/l:0,l>0&&n%l!=0},"lrc")}shecDurabilityValidation(l){return this.validValidation(()=>{const n=this.form.getValue("m");return l>n},"shec")}updateValidityOnChange(l){l.forEach(l=>this.form.get(l).updateValueAndValidity({emitEvent:!1}))}onPluginChange(l){this.plugin=l,l===this.PLUGIN.JERASURE?this.setJerasureDefaults():l===this.PLUGIN.LRC?this.setLrcDefaults():l===this.PLUGIN.ISA?this.setIsaDefaults():l===this.PLUGIN.SHEC&&this.setShecDefaults(),this.updateValidityOnChange(["m"])}setJerasureDefaults(){this.setDefaults({k:4,m:2}),this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liberation","blaum_roth","liber8tion"]}setLrcDefaults(){this.setDefaults({k:4,m:2,l:3})}setIsaDefaults(){this.setDefaults({k:7,m:3}),this.techniques=["reed_sol_van","cauchy"]}setShecDefaults(){this.setDefaults({k:4,m:3,c:2})}setDefaults(l){Object.keys(l).forEach(n=>{const e=this.form.get(n),u=e.value;let i=e.pristine;"k"===n?i=[4,7].includes(u):"m"===n&&(i=[2,3].includes(u)),i&&this.form.get(n).setValue(l[n])})}ngOnInit(){this.ecpService.getInfo().subscribe(({plugins:l,names:n,directory:e,nodes:u})=>{this.initCrushNodeSelection(u,this.form.get("crushRoot"),this.form.get("crushFailureDomain"),this.form.get("crushDeviceClass")),this.plugins=l,this.names=n,this.form.silentSet("directory",e),this.preValidateNumericInputFields()})}preValidateNumericInputFields(){const l=["k","m","l","c"].map(l=>this.form.get(l));l.forEach(l=>{l.markAsTouched(),l.markAsDirty()}),l[1].updateValueAndValidity()}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l=this.createJson();this.taskWrapper.wrapTaskAroundCall({task:new R.a("ecp/create",{name:l.name}),call:this.ecpService.create(l)}).subscribe(void 0,()=>{this.form.setErrors({cdSubmitButton:!0})},()=>{this.bsModalRef.hide(),this.submitAction.emit(l)})}createJson(){const l={technique:[this.PLUGIN.ISA,this.PLUGIN.JERASURE],packetSize:[this.PLUGIN.JERASURE],l:[this.PLUGIN.LRC],crushLocality:[this.PLUGIN.LRC],c:[this.PLUGIN.SHEC]},n=new T,e=this.form.getValue("plugin");return Object.keys(this.form.controls).filter(n=>{const u=l[n],i=this.form.getValue(n);return(u&&u.includes(e)||!u)&&i&&""!==i}).forEach(l=>{this.extendJson(l,n)}),n}extendJson(l,n){const e=this.form.getValue(l);n[{crushFailureDomain:"crush-failure-domain",crushRoot:"crush-root",crushDeviceClass:"crush-device-class",packetSize:"packetsize",crushLocality:"crush-locality"}[l]||l]="crushRoot"===l?e.name:e}}var S=e("DNAf");class D{constructor(l){this.erasureInfo=!1,this.crushInfo=!1,this.pgs=1,this.poolTypes=["erasure","replicated"],this.applications={selected:[],default:["cephfs","rbd","rgw"],available:[],validators:[t.B.pattern("[A-Za-z0-9_]+"),t.B.maxLength(128)],messages:new S.a({empty:l("No applications added"),selectionLimit:{text:l("Applications limit reached"),tooltip:l("A pool can only have up to four applications definitions.")},customValidations:{pattern:l("Allowed characters '_a-zA-Z0-9'"),maxlength:l("Maximum length is 128 characters")},filter:l("Filter or add applications"),add:l("Add application")},l)}}}class k{constructor(l,n,e,t,a,o,s,r,d,c,m,f,g){this.dimlessBinaryPipe=l,this.route=n,this.router=e,this.modalService=t,this.poolService=a,this.authStorageService=o,this.formatter=s,this.bsModalService=r,this.taskWrapper=d,this.ecpService=c,this.crushRuleService=m,this.i18n=f,this.actionLabels=g,this.editing=!1,this.isReplicated=!1,this.isErasure=!1,this.data=new D(this.i18n),this.externalPgChange=!1,this.current={rules:[]},this.initializeConfigData=new u.EventEmitter,this.currentConfigurationValues={},this.icons=h.a,this.crushUsage=void 0,this.ecpUsage=void 0,this.editing=this.router.url.startsWith("/pool/"+i.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource=this.i18n("pool"),this.authenticate(),this.createForm()}authenticate(){this.permission=this.authStorageService.getPermissions().pool,(!this.permission.read||!this.permission.update&&this.editing||!this.permission.create&&!this.editing)&&this.router.navigate(["/404"])}createForm(){const l=new v.a({mode:new t.i("none"),algorithm:new t.i(""),minBlobSize:new t.i("",{updateOn:"blur"}),maxBlobSize:new t.i("",{updateOn:"blur"}),ratio:new t.i("",{updateOn:"blur"})});this.form=new v.a({name:new t.i("",{validators:[t.B.pattern(/^[.A-Za-z0-9_/-]+$/),t.B.required,b.a.custom("rbdPool",()=>this.form&&this.form.getValue("name").includes("/")&&this.data&&-1!==this.data.applications.selected.indexOf("rbd"))]}),poolType:new t.i("",{validators:[t.B.required]}),crushRule:new t.i(null,{validators:[b.a.custom("tooFewOsds",l=>this.info&&l&&this.info.osd_countthis.isReplicated&&this.info.crush_rules_replicated.length>0&&!l)]}),size:new t.i("",{updateOn:"blur"}),erasureProfile:new t.i(null),pgNum:new t.i("",{validators:[t.B.required,t.B.min(1)]}),pgAutoscaleMode:new t.i(null),ecOverwrites:new t.i(!1),compression:l,max_bytes:new t.i(""),max_objects:new t.i(0,{validators:[t.B.min(0)]})},[b.a.custom("form",()=>null)])}ngOnInit(){this.poolService.getInfo().subscribe(l=>{this.initInfo(l),this.editing?this.initEditMode():this.setAvailableApps(),this.listenToChanges(),this.setComplexValidators()})}initInfo(l){this.pgAutoscaleModes=l.pg_autoscale_modes,this.form.silentSet("pgAutoscaleMode",l.pg_autoscale_default_mode),this.form.silentSet("algorithm",l.bluestore_compression_algorithm),this.info=l,this.initEcp(l.erasure_code_profiles)}initEcp(l){this.setListControlStatus("erasureProfile",l),this.ecProfiles=l}setListControlStatus(l,n){const e=this.form.get(l),u=e.value;1!==n.length||u&&a.isEqual(u,n[0])?0===n.length&&u&&e.setValue(null):e.setValue(n[0]),n.length<=1?e.enabled&&e.disable():e.disabled&&e.enable()}initEditMode(){this.disableForEdit(),this.routeParamsSubscribe=this.route.params.subscribe(l=>this.poolService.get(l.name).subscribe(l=>{this.data.pool=l,this.initEditFormData(l)}))}disableForEdit(){["poolType","crushRule","size","erasureProfile","ecOverwrites"].forEach(l=>this.form.get(l).disable())}initEditFormData(l){this.initializeConfigData.emit({initialData:l.configuration,sourceType:C.a.pool}),this.poolTypeChange(l.type);const n=this.info.crush_rules_replicated.concat(this.info.crush_rules_erasure),e={name:l.pool_name,poolType:l.type,crushRule:n.find(n=>n.rule_name===l.crush_rule),size:l.size,erasureProfile:this.ecProfiles.find(n=>n.name===l.erasure_code_profile),pgAutoscaleMode:l.pg_autoscale_mode,pgNum:l.pg_num,ecOverwrites:l.flags_names.includes("ec_overwrites"),mode:l.options.compression_mode,algorithm:l.options.compression_algorithm,minBlobSize:this.dimlessBinaryPipe.transform(l.options.compression_min_blob_size),maxBlobSize:this.dimlessBinaryPipe.transform(l.options.compression_max_blob_size),ratio:l.options.compression_required_ratio,max_bytes:this.dimlessBinaryPipe.transform(l.quota_max_bytes),max_objects:l.quota_max_objects};Object.keys(e).forEach(l=>{const n=e[l];a.isUndefined(n)||""===n||this.form.silentSet(l,n)}),this.data.pgs=this.form.getValue("pgNum"),this.setAvailableApps(this.data.applications.default.concat(l.application_metadata)),this.data.applications.selected=l.application_metadata}setAvailableApps(l=this.data.applications.default){this.data.applications.available=a.uniq(l.sort()).map(l=>new p.a(!1,l,""))}listenToChanges(){this.listenToChangesDuringAddEdit(),this.editing||this.listenToChangesDuringAdd()}listenToChangesDuringAddEdit(){this.form.get("pgNum").valueChanges.subscribe(l=>{const n=l-this.data.pgs;1===Math.abs(n)&&2!==l?this.doPgPowerJump(n):this.data.pgs=l})}doPgPowerJump(l){const n=this.calculatePgPower()+l;this.setPgs(-1===l?Math.round(n):Math.floor(n))}calculatePgPower(l=this.form.getValue("pgNum")){return Math.log(l)/Math.log(2)}setPgs(l){const n=Math.pow(2,l<0?0:l);this.data.pgs=n,this.form.silentSet("pgNum",n)}listenToChangesDuringAdd(){this.form.get("poolType").valueChanges.subscribe(l=>{this.poolTypeChange(l)}),this.form.get("crushRule").valueChanges.subscribe(l=>{this.crushDeletionBtn&&this.crushDeletionBtn.isOpen&&this.crushDeletionBtn.hide(),l&&(this.setCorrectMaxSize(l),this.crushRuleIsUsedBy(l.rule_name),this.replicatedRuleChange(),this.pgCalc())}),this.form.get("size").valueChanges.subscribe(()=>{this.pgCalc()}),this.form.get("erasureProfile").valueChanges.subscribe(l=>{this.ecpDeletionBtn&&this.ecpDeletionBtn.isOpen&&this.ecpDeletionBtn.hide(),l&&(this.ecpIsUsedBy(l.name),this.pgCalc())}),this.form.get("mode").valueChanges.subscribe(()=>{["minBlobSize","maxBlobSize","ratio"].forEach(l=>{this.form.get(l).updateValueAndValidity({emitEvent:!1})})}),this.form.get("minBlobSize").valueChanges.subscribe(()=>{this.form.get("maxBlobSize").updateValueAndValidity({emitEvent:!1})}),this.form.get("maxBlobSize").valueChanges.subscribe(()=>{this.form.get("minBlobSize").updateValueAndValidity({emitEvent:!1})})}poolTypeChange(l){if("replicated"===l?this.setTypeBooleans(!0,!1):this.setTypeBooleans(!1,"erasure"===l),!l||!this.info)return void(this.current.rules=[]);const n=this.info["crush_rules_"+l]||[];this.current.rules=n,this.editing||(this.isReplicated&&this.setListControlStatus("crushRule",n),this.replicatedRuleChange(),this.pgCalc())}setTypeBooleans(l,n){this.isReplicated=l,this.isErasure=n}replicatedRuleChange(){if(!this.isReplicated)return;const l=this.form.get("size");let n=this.form.getValue("size")||3;const e=this.getMinSize(),u=this.getMaxSize();nu&&(n=u),n!==l.value&&this.form.silentSet("size",n)}getMinSize(){if(!this.info||this.info.osd_count<1)return 0;const l=this.form.getValue("crushRule");return l?l.min_size:1}getMaxSize(){const l=this.form.getValue("crushRule");return this.info?l?l.usable_size:Math.min(this.info.osd_count,3):0}pgCalc(){const l=this.form.getValue("poolType");if(!this.info||this.form.get("pgNum").dirty||!l)return;const n=100*this.info.osd_count,e=this.isReplicated?this.replicatedPgCalc(n):this.erasurePgCalc(n);if(!e)return;const u=this.data.pgs;this.alignPgs(e),this.externalPgChange||(this.externalPgChange=u!==this.data.pgs)}setCorrectMaxSize(l=this.form.getValue("crushRule")){if(!l)return;const n=f.searchFailureDomains(this.info.nodes,l.steps[0].item_name)[l.steps[1].type];l.usable_size=Math.min(n?n.length:l.max_size,l.max_size)}replicatedPgCalc(l){const n=this.form.get("size"),e=n.value;return n.valid&&e>0?l/e:0}erasurePgCalc(l){const n=this.form.get("erasureProfile"),e=n.value;return(n.valid||n.disabled)&&e?l/(e.k+e.m):0}alignPgs(l=this.form.getValue("pgNum")){this.setPgs(Math.round(this.calculatePgPower(l<1?1:l)))}setComplexValidators(){this.editing?this.form.get("name").setValidators([this.form.get("name").validator,b.a.custom("uniqueName",l=>this.data.pool&&this.info&&-1!==this.info.pool_names.indexOf(l)&&this.info.pool_names.indexOf(l)!==this.info.pool_names.indexOf(this.data.pool.pool_name))]):(b.a.validateIf(this.form.get("size"),()=>this.isReplicated,[b.a.custom("min",l=>this.form.getValue("size")&&lthis.form.getValue("size")&&this.getMaxSize()this.info&&-1!==this.info.pool_names.indexOf(l))])),this.setCompressionValidators()}setCompressionValidators(){b.a.validateIf(this.form.get("minBlobSize"),()=>this.hasCompressionEnabled(),[t.B.min(0),b.a.custom("maximum",l=>this.oddBlobSize(l,this.form.getValue("maxBlobSize")))]),b.a.validateIf(this.form.get("maxBlobSize"),()=>this.hasCompressionEnabled(),[t.B.min(0),b.a.custom("minimum",l=>this.oddBlobSize(this.form.getValue("minBlobSize"),l))]),b.a.validateIf(this.form.get("ratio"),()=>this.hasCompressionEnabled(),[t.B.min(0),t.B.max(1)])}oddBlobSize(l,n){const e=this.formatter.toBytes(l),u=this.formatter.toBytes(n);return Boolean(e&&u&&e>=u)}hasCompressionEnabled(){return this.form.getValue("mode")&&"none"!==this.form.get("mode").value.toLowerCase()}describeCrushStep(l){return[l.op.replace("_"," "),l.item_name||"",l.type?l.num+" type "+l.type:""].join(" ")}addErasureCodeProfile(){this.addModal(_,l=>this.reloadECPs(l))}addModal(l,n){this.hideOpenTooltips(),this.bsModalService.show(l).content.submitAction.subscribe(l=>{n(l.name)})}hideOpenTooltips(){const l=l=>l&&l.isOpen&&l.hide();l(this.ecpDeletionBtn),l(this.crushDeletionBtn)}reloadECPs(l){this.reloadList({newItemName:l,getInfo:()=>this.ecpService.list(),initInfo:l=>this.initEcp(l),findNewItem:()=>this.ecProfiles.find(n=>n.name===l),controlName:"erasureProfile"})}reloadList({newItemName:l,getInfo:n,initInfo:e,findNewItem:u,controlName:i}){this.modalSubscription&&this.modalSubscription.unsubscribe(),n().subscribe(n=>{if(e(n),!l)return;const t=u();t&&this.form.get(i).setValue(t)})}deleteErasureCodeProfile(){this.deletionModal({value:this.form.getValue("erasureProfile"),usage:this.ecpUsage,deletionBtn:this.ecpDeletionBtn,dataName:"erasureInfo",getTabs:()=>this.ecpInfoTabs,tabPosition:1,nameAttribute:"name",itemDescription:this.i18n("erasure code profile"),reloadFn:()=>this.reloadECPs(),deleteFn:l=>this.ecpService.delete(l),taskName:"ecp/delete"})}deletionModal({value:l,usage:n,deletionBtn:e,dataName:u,getTabs:i,tabPosition:t,nameAttribute:a,itemDescription:o,reloadFn:s,deleteFn:r,taskName:d}){if(!l)return;if(n)return e.toggle(),this.data[u]=!0,void setTimeout(()=>{const l=i();l&&(l.tabs[t].active=!0)},50);const c=l[a];this.modalService.show(g.a,{initialState:{itemDescription:o,itemNames:[c],submitActionObservable:()=>{const l=r(c);return l.subscribe(()=>s()),this.taskWrapper.wrapTaskAroundCall({task:new R.a(d,{name:c}),call:l})}}})}addCrushRule(){this.addModal(w,l=>this.reloadCrushRules(l))}reloadCrushRules(l){this.reloadList({newItemName:l,getInfo:()=>this.poolService.getInfo(),initInfo:l=>{this.initInfo(l),this.poolTypeChange("replicated")},findNewItem:()=>this.info.crush_rules_replicated.find(n=>n.rule_name===l),controlName:"crushRule"})}deleteCrushRule(){this.deletionModal({value:this.form.getValue("crushRule"),usage:this.crushUsage,deletionBtn:this.crushDeletionBtn,dataName:"crushInfo",getTabs:()=>this.crushInfoTabs,tabPosition:2,nameAttribute:"rule_name",itemDescription:this.i18n("crush rule"),reloadFn:()=>this.reloadCrushRules(),deleteFn:l=>this.crushRuleService.delete(l),taskName:"crushRule/delete"})}crushRuleIsUsedBy(l){this.crushUsage=l?this.info.used_rules[l]:void 0}ecpIsUsedBy(l){this.ecpUsage=l?this.info.used_profiles[l]:void 0}submit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l={pool:this.form.getValue("name")};this.assignFormFields(l,[{externalFieldName:"pool_type",formControlName:"poolType"},{externalFieldName:"pg_autoscale_mode",formControlName:"pgAutoscaleMode",editable:!0},{externalFieldName:"pg_num",formControlName:"pgNum",replaceFn:l=>"on"===this.form.getValue("pgAutoscaleMode")?1:l,editable:!0},this.isReplicated?{externalFieldName:"size",formControlName:"size"}:{externalFieldName:"erasure_code_profile",formControlName:"erasureProfile",attr:"name"},{externalFieldName:"rule_name",formControlName:"crushRule",replaceFn:l=>this.isReplicated?l&&l.rule_name:void 0},{externalFieldName:"quota_max_bytes",formControlName:"max_bytes",replaceFn:this.formatter.toBytes,editable:!0,resetValue:this.editing?0:void 0},{externalFieldName:"quota_max_objects",formControlName:"max_objects",editable:!0,resetValue:this.editing?0:void 0}]),this.info.is_all_bluestore&&(this.assignFormField(l,{externalFieldName:"flags",formControlName:"ecOverwrites",replaceFn:()=>this.isErasure?["ec_overwrites"]:void 0}),"none"!==this.form.getValue("mode")?this.assignFormFields(l,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:l=>this.hasCompressionEnabled()&&l},{externalFieldName:"compression_algorithm",formControlName:"algorithm",editable:!0},{externalFieldName:"compression_min_blob_size",formControlName:"minBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_max_blob_size",formControlName:"maxBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_required_ratio",formControlName:"ratio",editable:!0,resetValue:0}]):this.editing&&this.assignFormFields(l,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:()=>"unset"},{externalFieldName:"srcpool",formControlName:"name",editable:!0,replaceFn:()=>this.data.pool.pool_name}]));const n=this.data.applications.selected;(n.length>0||this.editing)&&(l.application_metadata=n),this.isReplicated&&!a.isEmpty(this.currentConfigurationValues)&&(l.configuration=this.currentConfigurationValues),this.triggerApiTask(l)}assignFormFields(l,n){n.forEach(n=>this.assignFormField(l,n))}assignFormField(l,{externalFieldName:n,formControlName:e,attr:u,replaceFn:i,editable:t,resetValue:o}){if(this.editing&&(!t||this.form.get(e).pristine))return;const s=this.form.getValue(e);let r=i?i(s):u?a.get(s,u):s;if(!s||!r){if(!t||a.isUndefined(o))return;r=o}l[n]=r}triggerApiTask(l){this.taskWrapper.wrapTaskAroundCall({task:new R.a("pool/"+(this.editing?i.e.EDIT:i.e.CREATE),{pool_name:l.hasOwnProperty("srcpool")?l.srcpool:l.pool}),call:this.poolService[this.editing?i.e.UPDATE:i.e.CREATE](l)}).subscribe(void 0,l=>{a.isObject(l.error)&&"34"===l.error.code&&this.form.get("pgNum").setErrors({34:!0}),this.form.setErrors({cdSubmitButton:!0})},()=>this.router.navigate(["/pool"]))}appSelection(){this.form.get("name").updateValueAndValidity({emitEvent:!1,onlySelf:!0})}}var x=e("MuvH"),q=e("+fVR"),F=e("uIqm"),P=e("x38r"),A=e("yJti"),B=e("vCyI"),O=e("o4+5"),z=e("VTlA"),L=e("EgGo"),j=e("d+Og");class U{constructor(l){this.pool_name=l}}const M=new L.a("pool");class G extends q.a{constructor(l,n,e,u,i,t,o,s,r,d,c){super(),this.poolService=l,this.taskWrapper=n,this.authStorageService=e,this.taskListService=u,this.modalService=i,this.i18n=t,this.pgCategoryService=o,this.dimlessPipe=s,this.urlBuilder=r,this.configurationService=d,this.actionLabels=c,this.selection=new B.a,this.executingTasks=[],this.cacheTiers=[],this.monAllowPoolDelete=!1,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(encodeURIComponent(this.selection.first().pool_name)),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deletePoolModal(),name:this.actionLabels.DELETE,disable:this.getDisableDesc.bind(this)}],this.permissions.configOpt.read&&this.configurationService.get("mon_allow_pool_delete").subscribe(l=>{if(a.has(l,"value")){const n=a.find(l.value,l=>"mon"===l.section)||{value:!1};this.monAllowPoolDelete="true"===n.value}})}ngOnInit(){const l=(l,n,e)=>a.get(n,l)>a.get(e,l)?1:-1;this.columns=[{prop:"pool_name",name:this.i18n("Name"),flexGrow:4,cellTransformation:P.a.executing},{prop:"type",name:this.i18n("Type"),flexGrow:2},{prop:"application_metadata",name:this.i18n("Applications"),flexGrow:3},{prop:"pg_status",name:this.i18n("PG Status"),flexGrow:3,cellClass:({row:l,column:n,value:e})=>this.getPgStatusCellClass(l,n,e)},{prop:"size",name:this.i18n("Replica Size"),flexGrow:2,cellClass:"text-right"},{prop:"last_change",name:this.i18n("Last Change"),flexGrow:2,cellClass:"text-right"},{prop:"erasure_code_profile",name:this.i18n("Erasure Coded Profile"),flexGrow:2},{prop:"crush_rule",name:this.i18n("Crush Ruleset"),flexGrow:3},{name:this.i18n("Usage"),prop:"usage",cellTemplate:this.poolUsageTpl,flexGrow:3},{prop:"stats.rd_bytes.rates",name:this.i18n("Read bytes"),comparator:(n,e,u,i)=>l("stats.rd_bytes.latest",u,i),cellTransformation:P.a.sparkline,flexGrow:3},{prop:"stats.wr_bytes.rates",name:this.i18n("Write bytes"),comparator:(n,e,u,i)=>l("stats.wr_bytes.latest",u,i),cellTransformation:P.a.sparkline,flexGrow:3},{prop:"stats.rd.rate",name:this.i18n("Read ops"),flexGrow:1,pipe:this.dimlessPipe,cellTransformation:P.a.perSecond},{prop:"stats.wr.rate",name:this.i18n("Write ops"),flexGrow:1,pipe:this.dimlessPipe,cellTransformation:P.a.perSecond}],this.taskListService.init(()=>this.poolService.getList(),void 0,l=>this.pools=this.transformPoolsData(l),()=>{this.table.reset(),this.viewCacheStatusList=[{status:A.a.ValueException}]},l=>l.name.startsWith("pool/"),(l,n)=>n.metadata.pool_name===l.pool_name,{default:l=>new U(l.pool_name)})}updateSelection(l){this.selection=l}deletePoolModal(){const l=this.selection.first().pool_name;this.modalRef=this.modalService.show(g.a,{initialState:{itemDescription:"Pool",itemNames:[l],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.a("pool/"+i.e.DELETE,{pool_name:l}),call:this.poolService.delete(l)})}})}getPgStatusCellClass(l,n,e){return{"text-right":!0,["pg-"+this.pgCategoryService.getTypeByStates(e)]:!0}}transformPoolsData(l){const n=["bytes_used","max_avail","avail_raw","percent_used","rd_bytes","wr_bytes","rd","wr"],e={latest:0,rate:0,rates:[]};return a.forEach(l,l=>{l.pg_status=this.transformPgStatus(l.pg_status);const u={};a.forEach(n,n=>{u[n]=l.stats&&l.stats[n]?l.stats[n]:e}),l.stats=u,l.usage=u.percent_used.latest,l.cdExecuting||l.pg_num+l.pg_placement_num===l.pg_num_target+l.pg_placement_num_target||(l.cdExecuting="Updating"),["rd_bytes","wr_bytes"].forEach(n=>{l.stats[n].rates=l.stats[n].rates.map(l=>l[1])}),l.cdIsBinary=!0}),l}transformPgStatus(l){const n=[];return a.forEach(l,(l,e)=>{n.push(`${l} ${e}`)}),n.join(", ")}getSelectionTiers(){if(void 0!==this.expandedRow){const l=this.expandedRow.tiers;this.cacheTiers=this.pools.filter(n=>l.includes(n.pool))}}getDisableDesc(){return!this.selection||!this.selection.hasSelection||!this.monAllowPoolDelete&&this.i18n("Pool deletion is disabled by the mon_allow_pool_delete configuration setting.")}setExpandedRow(l){super.setExpandedRow(l),this.getSelectionTiers()}}class ${}const K={breadcrumbs:i.a.CREATE},J={breadcrumbs:i.a.EDIT};class W{}var Z=e("iutN"),H=e("MdoF"),X=e("ES0t"),Y=e("Xg1U"),Q=e("z5nN"),ll=e("pMnS"),nl=e("EEJc"),el=e("PEr+"),ul=e("a40w"),il=e("hfeG"),tl=e("QUzE"),al=e("E7j4"),ol=e("xvu0"),sl=e("RIVN"),rl=e("nP0W"),dl=e("VBM6"),cl=e("atuK"),ml=e("JIi+"),fl=e("0BYw"),gl=e("3IYD"),pl=e("I4Qz"),hl=e("0rTx"),vl=e("lz+O"),bl=e("u2XS"),Cl=e("nhAp"),Rl=e("l7Jr"),Il=e("bUo2"),El=e("SVse"),Nl=e("8xTl"),Vl=e("ajRT"),yl=e("+gVj"),wl=e("mXUL"),Tl=e("IZUe"),_l=e("ANnk"),Sl=e("f/UV"),Dl=e("4HWh"),kl=e("p4Cf"),xl=e("gp3X"),ql=e("sb0X"),Fl=e("KVJa"),Pl=e("Z21x"),Al=e("LqlI"),Bl=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ol(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function zl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The name can only consist of alphanumeric characters, dashes and underscores."]))],null,null)}function Ll(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen erasure code profile name is already in use."]))],null,null)}function jl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Ul(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function Ml(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Gl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function $l(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," ( "," ) "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit,n.component.failureDomains[n.context.$implicit].length)}))}function Kl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Jl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Wl(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),(l()(),u["ɵeld"](2,0,null,null,119,"cd-modal",[],null,null,null,nl.c,nl.b)),u["ɵdid"](3,49152,null,0,Vl.a,[],{modalRef:[0,"modalRef"]},null),(l()(),u["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),u["ɵted"](5,null,[""," ",""])),u["ɵppd"](6,1),u["ɵppd"](7,1),(l()(),u["ɵeld"](8,0,null,1,113,null,null,null,null,null,null,null)),(l()(),u["ɵeld"](9,0,null,null,112,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==u["ɵnov"](l,11).onSubmit(e)&&i),"reset"===n&&(i=!1!==u["ɵnov"](l,11).onReset()&&i),"submit"===n&&(i=!1!==u["ɵnov"](l,14).onSubmit()&&i),i}),null,null)),u["ɵdid"](10,16384,null,0,t.G,[],null,null),u["ɵdid"](11,540672,[["frm",4]],0,t.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,t.d,null,[t.l]),u["ɵdid"](13,16384,null,0,t.s,[[4,t.d]],null,null),u["ɵdid"](14,16384,null,0,yl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](15,0,null,null,98,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](16,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](17,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,1,{FormControlNames:1}),u["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),u["ɵeld"](20,0,null,0,3,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵeld"](21,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](23,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](24,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,28)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,28).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,28)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,28)._compositionEnd(e.target.value)&&i),i}),null,null)),u["ɵdid"](26,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](27,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](28,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](30,671744,[[1,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](32,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](33,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ol)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,zl)),u["ɵdid"](37,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ll)),u["ɵdid"](39,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](40,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](41,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,3,{FormControlNames:1}),u["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),u["ɵeld"](44,0,null,0,5,"label",[["class","cd-col-form-label"],["for","root"]],null,null,null,null,null)),(l()(),u["ɵeld"](45,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Root"])),(l()(),u["ɵeld"](47,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](48,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](49,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](50,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](51,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","root"],["id","root"],["name","root"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,53).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,53).onTouched()&&i),i}),null,null)),u["ɵdid"](52,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](53,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](55,671744,[[3,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](57,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](58,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,jl)),u["ɵdid"](60,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ul)),u["ɵdid"](62,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ml)),u["ɵdid"](64,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](65,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](66,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](69,0,null,0,5,"label",[["class","cd-col-form-label"],["for","failure_domain"]],null,null,null,null,null)),(l()(),u["ɵeld"](70,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Failure domain type"])),(l()(),u["ɵeld"](72,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](73,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](74,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](75,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](76,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","failure_domain"],["id","failure_domain"],["name","failure_domain"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,78).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,78).onTouched()&&i),i}),null,null)),u["ɵdid"](77,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](78,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](80,671744,[[5,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](82,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](83,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Gl)),u["ɵdid"](85,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,$l)),u["ɵdid"](87,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Kl)),u["ɵdid"](89,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](90,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](91,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](94,0,null,0,4,"label",[["class","cd-col-form-label"],["for","device_class"]],null,null,null,null,null)),(l()(),u["ɵeld"](95,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Device class"])),(l()(),u["ɵeld"](97,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](98,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](99,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](100,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","device_class"],["id","device_class"],["name","device_class"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,102).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,102).onTouched()&&i),i}),null,null)),u["ɵdid"](101,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](102,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](104,671744,[[7,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](106,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](107,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](108,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](109,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](110,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Let Ceph decide"])),(l()(),u["ɵand"](16777216,null,null,1,null,Jl)),u["ɵdid"](113,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](114,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](115,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.onSubmit()&&u),u}),xl.b,xl.a)),u["ɵdid"](116,114688,null,0,ql.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](117,0,[""," ",""])),u["ɵppd"](118,1),u["ɵppd"](119,1),(l()(),u["ɵeld"](120,0,null,null,1,"cd-back-button",[],null,null,null,Fl.b,Fl.a)),u["ɵdid"](121,49152,null,0,Pl.a,[El.Location,i.b],{back:[0,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.bsModalRef),l(n,11,0,e.form),l(n,14,0,e.form),l(n,17,0),l(n,26,0,""),l(n,30,0,"name"),l(n,33,0,"name"),l(n,35,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,37,0,e.form.showError("name",u["ɵnov"](n,11),"pattern")),l(n,39,0,e.form.showError("name",u["ɵnov"](n,11),"uniqueName")),l(n,41,0),l(n,48,0,e.tooltips.root),l(n,55,0,"root"),l(n,58,0,"root"),l(n,60,0,!e.buckets),l(n,62,0,e.buckets),l(n,64,0,e.form.showError("root",u["ɵnov"](n,11),"required")),l(n,66,0),l(n,73,0,e.tooltips.failure_domain),l(n,80,0,"failure_domain"),l(n,83,0,"failure_domain"),l(n,85,0,!e.failureDomains),l(n,87,0,e.failureDomainKeys),l(n,89,0,e.form.showError("failure_domain",u["ɵnov"](n,11),"required")),l(n,91,0),l(n,98,0,e.tooltips.device_class),l(n,104,0,"device_class"),l(n,107,0,"device_class"),l(n,109,0,""),l(n,110,0,""),l(n,113,0,e.devices),l(n,116,0,u["ɵnov"](n,11)),l(n,121,0,e.bsModalRef.hide)}),(function(l,n){var e=n.component,i=u["ɵunv"](n,5,0,l(n,6,0,u["ɵnov"](n,0),e.action)),t=u["ɵunv"](n,5,1,l(n,7,0,u["ɵnov"](n,1),e.resource));l(n,5,0,i,t),l(n,9,0,u["ɵnov"](n,13).ngClassUntouched,u["ɵnov"](n,13).ngClassTouched,u["ɵnov"](n,13).ngClassPristine,u["ɵnov"](n,13).ngClassDirty,u["ɵnov"](n,13).ngClassValid,u["ɵnov"](n,13).ngClassInvalid,u["ɵnov"](n,13).ngClassPending),l(n,16,0,u["ɵnov"](n,17).hasErrors,u["ɵnov"](n,17).hasSuccess),l(n,25,0,u["ɵnov"](n,32).ngClassUntouched,u["ɵnov"](n,32).ngClassTouched,u["ɵnov"](n,32).ngClassPristine,u["ɵnov"](n,32).ngClassDirty,u["ɵnov"](n,32).ngClassValid,u["ɵnov"](n,32).ngClassInvalid,u["ɵnov"](n,32).ngClassPending,u["ɵnov"](n,33).validClass,u["ɵnov"](n,33).invalidClass),l(n,40,0,u["ɵnov"](n,41).hasErrors,u["ɵnov"](n,41).hasSuccess),l(n,51,0,u["ɵnov"](n,57).ngClassUntouched,u["ɵnov"](n,57).ngClassTouched,u["ɵnov"](n,57).ngClassPristine,u["ɵnov"](n,57).ngClassDirty,u["ɵnov"](n,57).ngClassValid,u["ɵnov"](n,57).ngClassInvalid,u["ɵnov"](n,57).ngClassPending,u["ɵnov"](n,58).validClass,u["ɵnov"](n,58).invalidClass),l(n,65,0,u["ɵnov"](n,66).hasErrors,u["ɵnov"](n,66).hasSuccess),l(n,76,0,u["ɵnov"](n,82).ngClassUntouched,u["ɵnov"](n,82).ngClassTouched,u["ɵnov"](n,82).ngClassPristine,u["ɵnov"](n,82).ngClassDirty,u["ɵnov"](n,82).ngClassValid,u["ɵnov"](n,82).ngClassInvalid,u["ɵnov"](n,82).ngClassPending,u["ɵnov"](n,83).validClass,u["ɵnov"](n,83).invalidClass),l(n,90,0,u["ɵnov"](n,91).hasErrors,u["ɵnov"](n,91).hasSuccess),l(n,100,0,u["ɵnov"](n,106).ngClassUntouched,u["ɵnov"](n,106).ngClassTouched,u["ɵnov"](n,106).ngClassPristine,u["ɵnov"](n,106).ngClassDirty,u["ɵnov"](n,106).ngClassValid,u["ɵnov"](n,106).ngClassInvalid,u["ɵnov"](n,106).ngClassPending,u["ɵnov"](n,107).validClass,u["ɵnov"](n,107).invalidClass);var a=u["ɵunv"](n,117,0,l(n,118,0,u["ɵnov"](n,0),e.action)),o=u["ɵunv"](n,117,1,l(n,119,0,u["ɵnov"](n,1),e.resource));l(n,117,0,a,o)}))}function Zl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-crush-rule-form-modal",[],null,null,null,Wl,Bl)),u["ɵdid"](1,114688,null,0,w,[y.a,Al.a,V.a,d,s.a,i.b],null,null)],(function(l,n){l(n,1,0)}),null)}var Hl=u["ɵccf"]("cd-crush-rule-form-modal",w,Zl,{},{submitAction:"submitAction"},[]),Xl=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Yl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Ql(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The name can only consist of alphanumeric characters, dashes and underscores."]))],null,null)}function ln(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen erasure code profile name is already in use."]))],null,null)}function nn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function en(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function un(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function tn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function an(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 2."]))],null,null)}function on(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Chunks (k+m) have exceeded the available OSDs of ","."]))],null,(function(l,n){l(n,1,0,n.component.deviceCount)}))}function sn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["For an equal distribution k has to be a multiple of (k+m)/l."]))],null,null)}function rn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["K has to be equal to or greater than m in order to recover data correctly through c."]))],null,null)}function dn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Distribution factor: ",""]))],null,(function(l,n){l(n,1,0,n.component.lrcMultiK)}))}function cn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function mn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function fn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Chunks (k+m) have exceeded the available OSDs of ","."]))],null,(function(l,n){l(n,1,0,n.component.deviceCount)}))}function gn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function pn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["C has to be equal to or lower than m as m defines the amount of chunks that can be used."]))],null,null)}function hn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,9,{FormControlNames:1}),u["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","c"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Durability estimator (c)"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","c"],["id","c"],["name","c"],["placeholder","Coding chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,12)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,12).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,12)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,12)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,13).onTouched()&&i),i}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](13,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](15,671744,[[9,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](17,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](18,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,gn)),u["ɵdid"](20,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,pn)),u["ɵdid"](22,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.shec.c),l(n,15,0,"c"),l(n,18,0,"c"),l(n,20,0,e.form.showError("c",u["ɵnov"](n.parent,11),"min")),l(n,22,0,e.form.showError("c",u["ɵnov"](n.parent,11),"cGreaterM"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,17).ngClassUntouched,u["ɵnov"](n,17).ngClassTouched,u["ɵnov"](n,17).ngClassPristine,u["ɵnov"](n,17).ngClassDirty,u["ɵnov"](n,17).ngClassValid,u["ɵnov"](n,17).ngClassInvalid,u["ɵnov"](n,17).ngClassPending,u["ɵnov"](n,18).validClass,u["ɵnov"](n,18).invalidClass)}))}function vn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function bn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function Cn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Can't split up chunks (k+m) correctly with the current locality."]))],null,null)}function Rn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,26,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,11,{FormControlNames:1}),u["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","l"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Locality (l)"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","l"],["id","l"],["name","l"],["placeholder","Coding chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,12)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,12).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,12)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,12)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,13).onTouched()&&i),i}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](13,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](15,671744,[[11,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](17,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](18,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,vn)),u["ɵdid"](20,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,bn)),u["ɵdid"](22,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Cn)),u["ɵdid"](24,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](25,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](26,null,["Locality groups: ",""]))],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.lrc.l),l(n,15,0,"l"),l(n,18,0,"l"),l(n,20,0,e.form.showError("l",u["ɵnov"](n.parent,11),"required")),l(n,22,0,e.form.showError("l",u["ɵnov"](n.parent,11),"min")),l(n,24,0,e.form.showError("l",u["ɵnov"](n.parent,11),"unequal"))}),(function(l,n){var e=n.component;l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,17).ngClassUntouched,u["ɵnov"](n,17).ngClassTouched,u["ɵnov"](n,17).ngClassPristine,u["ɵnov"](n,17).ngClassDirty,u["ɵnov"](n,17).ngClassValid,u["ɵnov"](n,17).ngClassInvalid,u["ɵnov"](n,17).ngClassPending,u["ɵnov"](n,18).validClass,u["ɵnov"](n,18).invalidClass),l(n,26,0,e.lrcGroups)}))}function In(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function En(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," ( "," ) "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit,n.component.failureDomains[n.context.$implicit].length)}))}function Nn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Vn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["None"]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function yn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," ( "," ) "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit,n.component.failureDomains[n.context.$implicit].length)}))}function wn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,15,{FormControlNames:1}),u["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushLocality"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush Locality"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","crushLocality"],["id","crushLocality"],["name","crushLocality"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,12).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,12).onTouched()&&i),i}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](14,671744,[[15,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](16,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](17,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Nn)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Vn)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,yn)),u["ɵdid"](23,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.lrc.crushLocality),l(n,14,0,"crushLocality"),l(n,17,0,"crushLocality"),l(n,19,0,!e.failureDomains),l(n,21,0,e.failureDomainKeys.length>0),l(n,23,0,e.failureDomainKeys)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function Tn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function _n(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,17,{FormControlNames:1}),u["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","technique"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Technique"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","technique"],["id","technique"],["name","technique"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,12).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,12).onTouched()&&i),i}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](14,671744,[[17,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](16,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](17,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Tn)),u["ɵdid"](19,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins[e.plugin].technique),l(n,14,0,"technique"),l(n,17,0,"technique"),l(n,19,0,e.techniques)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function Sn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function Dn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,19,{FormControlNames:1}),u["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","packetSize"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Packetsize"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","packetSize"],["id","packetSize"],["name","packetSize"],["placeholder","Packetsize..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,12)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,12).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,12)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,12)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,13).onTouched()&&i),i}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](13,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](15,671744,[[19,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](17,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](18,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Sn)),u["ɵdid"](20,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.jerasure.packetSize),l(n,15,0,"packetSize"),l(n,18,0,"packetSize"),l(n,20,0,e.form.showError("packetSize",u["ɵnov"](n.parent,11),"min"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,17).ngClassUntouched,u["ɵnov"](n,17).ngClassTouched,u["ɵnov"](n,17).ngClassPristine,u["ɵnov"](n,17).ngClassDirty,u["ɵnov"](n,17).ngClassValid,u["ɵnov"](n,17).ngClassInvalid,u["ɵnov"](n,17).ngClassPending,u["ɵnov"](n,18).validClass,u["ɵnov"](n,18).invalidClass)}))}function kn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function xn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function qn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Fn(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),(l()(),u["ɵeld"](2,0,null,null,222,"cd-modal",[],null,null,null,nl.c,nl.b)),u["ɵdid"](3,49152,null,0,Vl.a,[],{modalRef:[0,"modalRef"]},null),(l()(),u["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),u["ɵted"](5,null,[""," ",""])),u["ɵppd"](6,1),u["ɵppd"](7,1),(l()(),u["ɵeld"](8,0,null,1,216,null,null,null,null,null,null,null)),(l()(),u["ɵeld"](9,0,null,null,215,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==u["ɵnov"](l,11).onSubmit(e)&&i),"reset"===n&&(i=!1!==u["ɵnov"](l,11).onReset()&&i),"submit"===n&&(i=!1!==u["ɵnov"](l,14).onSubmit()&&i),i}),null,null)),u["ɵdid"](10,16384,null,0,t.G,[],null,null),u["ɵdid"](11,540672,[["frm",4]],0,t.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,t.d,null,[t.l]),u["ɵdid"](13,16384,null,0,t.s,[[4,t.d]],null,null),u["ɵdid"](14,16384,null,0,yl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](15,0,null,null,201,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](16,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](17,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,1,{FormControlNames:1}),u["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),u["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](22,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,26)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,26).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,26)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,26)._compositionEnd(e.target.value)&&i),i}),null,null)),u["ɵdid"](24,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](25,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](26,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](28,671744,[[1,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](30,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](31,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Yl)),u["ɵdid"](33,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ql)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ln)),u["ɵdid"](37,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](38,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](39,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,3,{FormControlNames:1}),u["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),u["ɵeld"](42,0,null,0,4,"label",[["class","cd-col-form-label"],["for","plugin"]],null,null,null,null,null)),(l()(),u["ɵeld"](43,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Plugin"])),(l()(),u["ɵeld"](45,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](46,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](47,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](48,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","plugin"],["id","plugin"],["name","plugin"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,50).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,50).onTouched()&&i),i}),null,null)),u["ɵdid"](49,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](50,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](52,671744,[[3,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](54,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](55,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,nn)),u["ɵdid"](57,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,en)),u["ɵdid"](59,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,un)),u["ɵdid"](61,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](62,0,null,null,30,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](63,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](66,0,null,0,4,"label",[["class","cd-col-form-label"],["for","k"]],null,null,null,null,null)),(l()(),u["ɵeld"](67,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Data chunks (k)"])),(l()(),u["ɵeld"](69,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](70,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](71,0,null,0,21,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](72,0,null,null,8,"input",[["class","form-control"],["formControlName","k"],["id","k"],["name","k"],["ng-model","$ctrl.erasureCodeProfile.k"],["placeholder","Data chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,74)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,74).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,74)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,74)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,75).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,75).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,75).onTouched()&&i),i}),null,null)),u["ɵdid"](73,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](74,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](75,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](77,671744,[[5,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](79,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](80,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,tn)),u["ɵdid"](82,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,an)),u["ɵdid"](84,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,on)),u["ɵdid"](86,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,sn)),u["ɵdid"](88,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,rn)),u["ɵdid"](90,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,dn)),u["ɵdid"](92,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](93,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](94,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](97,0,null,0,4,"label",[["class","cd-col-form-label"],["for","m"]],null,null,null,null,null)),(l()(),u["ɵeld"](98,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Coding chunks (m)"])),(l()(),u["ɵeld"](100,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](101,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](102,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](103,0,null,null,8,"input",[["class","form-control"],["formControlName","m"],["id","m"],["name","m"],["placeholder","Coding chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,105)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,105).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,105)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,105)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,106).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,106).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,106).onTouched()&&i),i}),null,null)),u["ɵdid"](104,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](105,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](106,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](108,671744,[[7,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](110,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](111,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,cn)),u["ɵdid"](113,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,mn)),u["ɵdid"](115,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,fn)),u["ɵdid"](117,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,hn)),u["ɵdid"](119,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Rn)),u["ɵdid"](121,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](122,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](123,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,13,{FormControlNames:1}),u["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),u["ɵeld"](126,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushFailureDomain"]],null,null,null,null,null)),(l()(),u["ɵeld"](127,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush failure domain"])),(l()(),u["ɵeld"](129,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](130,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](131,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](132,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","crushFailureDomain"],["id","crushFailureDomain"],["name","crushFailureDomain"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,134).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,134).onTouched()&&i),i}),null,null)),u["ɵdid"](133,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](134,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](136,671744,[[13,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](138,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](139,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,In)),u["ɵdid"](141,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,En)),u["ɵdid"](143,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,wn)),u["ɵdid"](145,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,2,null,_n)),u["ɵdid"](147,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),u["ɵpad"](148,2),(l()(),u["ɵand"](16777216,null,null,1,null,Dn)),u["ɵdid"](150,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](151,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](152,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,21,{FormControlNames:1}),u["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),u["ɵeld"](155,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushRoot"]],null,null,null,null,null)),(l()(),u["ɵeld"](156,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush root"])),(l()(),u["ɵeld"](158,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](159,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](160,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](161,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","crushRoot"],["id","crushRoot"],["name","crushRoot"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,163).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,163).onTouched()&&i),i}),null,null)),u["ɵdid"](162,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](163,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](165,671744,[[21,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](167,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](168,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,kn)),u["ɵdid"](170,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,xn)),u["ɵdid"](172,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](173,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](174,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,23,{FormControlNames:1}),u["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),u["ɵeld"](177,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushDeviceClass"]],null,null,null,null,null)),(l()(),u["ɵeld"](178,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush device class"])),(l()(),u["ɵeld"](180,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](181,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](182,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](183,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","crushDeviceClass"],["id","crushDeviceClass"],["name","crushDeviceClass"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,185).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,185).onTouched()&&i),i}),null,null)),u["ɵdid"](184,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](185,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](187,671744,[[23,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](189,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](190,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](191,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](192,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](193,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Let Ceph decide"])),(l()(),u["ɵand"](16777216,null,null,1,null,qn)),u["ɵdid"](196,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](197,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](198,null,["Available OSDs: ",""])),(l()(),u["ɵeld"](199,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](200,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,25,{FormControlNames:1}),u["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),u["ɵeld"](203,0,null,0,4,"label",[["class","cd-col-form-label"],["for","directory"]],null,null,null,null,null)),(l()(),u["ɵeld"](204,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Directory"])),(l()(),u["ɵeld"](206,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](207,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](208,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](209,0,null,null,7,"input",[["class","form-control"],["formControlName","directory"],["id","directory"],["name","directory"],["placeholder","Path..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,211)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,211).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,211)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,211)._compositionEnd(e.target.value)&&i),i}),null,null)),u["ɵdid"](210,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](211,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](213,671744,[[25,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](215,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](216,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](217,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](218,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.onSubmit()&&u),u}),xl.b,xl.a)),u["ɵdid"](219,114688,null,0,ql.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](220,0,[""," ",""])),u["ɵppd"](221,1),u["ɵppd"](222,1),(l()(),u["ɵeld"](223,0,null,null,1,"cd-back-button",[],null,null,null,Fl.b,Fl.a)),u["ɵdid"](224,49152,null,0,Pl.a,[El.Location,i.b],{back:[0,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.bsModalRef),l(n,11,0,e.form),l(n,14,0,e.form),l(n,17,0),l(n,24,0,""),l(n,28,0,"name"),l(n,31,0,"name"),l(n,33,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,35,0,e.form.showError("name",u["ɵnov"](n,11),"pattern")),l(n,37,0,e.form.showError("name",u["ɵnov"](n,11),"uniqueName")),l(n,39,0),l(n,46,0,e.tooltips.plugins[e.plugin].description),l(n,52,0,"plugin"),l(n,55,0,"plugin"),l(n,57,0,!e.plugins),l(n,59,0,e.plugins),l(n,61,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,63,0),l(n,70,0,e.tooltips.k),l(n,77,0,"k"),l(n,80,0,"k"),l(n,82,0,e.form.showError("k",u["ɵnov"](n,11),"required")),l(n,84,0,e.form.showError("k",u["ɵnov"](n,11),"min")),l(n,86,0,e.form.showError("k",u["ɵnov"](n,11),"max")),l(n,88,0,e.form.showError("k",u["ɵnov"](n,11),"unequal")),l(n,90,0,e.form.showError("k",u["ɵnov"](n,11),"kLowerM")),l(n,92,0,"lrc"===e.plugin),l(n,94,0),l(n,101,0,e.tooltips.m),l(n,108,0,"m"),l(n,111,0,"m"),l(n,113,0,e.form.showError("m",u["ɵnov"](n,11),"required")),l(n,115,0,e.form.showError("m",u["ɵnov"](n,11),"min")),l(n,117,0,e.form.showError("m",u["ɵnov"](n,11),"max")),l(n,119,0,"shec"===e.plugin),l(n,121,0,e.plugin===e.PLUGIN.LRC),l(n,123,0),l(n,130,0,e.tooltips.crushFailureDomain),l(n,136,0,"crushFailureDomain"),l(n,139,0,"crushFailureDomain"),l(n,141,0,!e.failureDomains),l(n,143,0,e.failureDomainKeys),l(n,145,0,e.plugin===e.PLUGIN.LRC);var i=l(n,148,0,e.PLUGIN.JERASURE,e.PLUGIN.ISA).includes(e.plugin);l(n,147,0,i),l(n,150,0,e.plugin===e.PLUGIN.JERASURE),l(n,152,0),l(n,159,0,e.tooltips.crushRoot),l(n,165,0,"crushRoot"),l(n,168,0,"crushRoot"),l(n,170,0,!e.buckets),l(n,172,0,e.buckets),l(n,174,0),l(n,181,0,e.tooltips.crushDeviceClass),l(n,187,0,"crushDeviceClass"),l(n,190,0,"crushDeviceClass"),l(n,192,0,""),l(n,193,0,""),l(n,196,0,e.devices),l(n,200,0),l(n,207,0,e.tooltips.directory),l(n,213,0,"directory"),l(n,216,0,"directory"),l(n,219,0,u["ɵnov"](n,11)),l(n,224,0,e.bsModalRef.hide)}),(function(l,n){var e=n.component,i=u["ɵunv"](n,5,0,l(n,6,0,u["ɵnov"](n,0),e.action)),t=u["ɵunv"](n,5,1,l(n,7,0,u["ɵnov"](n,1),e.resource));l(n,5,0,i,t),l(n,9,0,u["ɵnov"](n,13).ngClassUntouched,u["ɵnov"](n,13).ngClassTouched,u["ɵnov"](n,13).ngClassPristine,u["ɵnov"](n,13).ngClassDirty,u["ɵnov"](n,13).ngClassValid,u["ɵnov"](n,13).ngClassInvalid,u["ɵnov"](n,13).ngClassPending),l(n,16,0,u["ɵnov"](n,17).hasErrors,u["ɵnov"](n,17).hasSuccess),l(n,23,0,u["ɵnov"](n,30).ngClassUntouched,u["ɵnov"](n,30).ngClassTouched,u["ɵnov"](n,30).ngClassPristine,u["ɵnov"](n,30).ngClassDirty,u["ɵnov"](n,30).ngClassValid,u["ɵnov"](n,30).ngClassInvalid,u["ɵnov"](n,30).ngClassPending,u["ɵnov"](n,31).validClass,u["ɵnov"](n,31).invalidClass),l(n,38,0,u["ɵnov"](n,39).hasErrors,u["ɵnov"](n,39).hasSuccess),l(n,48,0,u["ɵnov"](n,54).ngClassUntouched,u["ɵnov"](n,54).ngClassTouched,u["ɵnov"](n,54).ngClassPristine,u["ɵnov"](n,54).ngClassDirty,u["ɵnov"](n,54).ngClassValid,u["ɵnov"](n,54).ngClassInvalid,u["ɵnov"](n,54).ngClassPending,u["ɵnov"](n,55).validClass,u["ɵnov"](n,55).invalidClass),l(n,62,0,u["ɵnov"](n,63).hasErrors,u["ɵnov"](n,63).hasSuccess),l(n,72,0,u["ɵnov"](n,79).ngClassUntouched,u["ɵnov"](n,79).ngClassTouched,u["ɵnov"](n,79).ngClassPristine,u["ɵnov"](n,79).ngClassDirty,u["ɵnov"](n,79).ngClassValid,u["ɵnov"](n,79).ngClassInvalid,u["ɵnov"](n,79).ngClassPending,u["ɵnov"](n,80).validClass,u["ɵnov"](n,80).invalidClass),l(n,93,0,u["ɵnov"](n,94).hasErrors,u["ɵnov"](n,94).hasSuccess),l(n,103,0,u["ɵnov"](n,110).ngClassUntouched,u["ɵnov"](n,110).ngClassTouched,u["ɵnov"](n,110).ngClassPristine,u["ɵnov"](n,110).ngClassDirty,u["ɵnov"](n,110).ngClassValid,u["ɵnov"](n,110).ngClassInvalid,u["ɵnov"](n,110).ngClassPending,u["ɵnov"](n,111).validClass,u["ɵnov"](n,111).invalidClass),l(n,122,0,u["ɵnov"](n,123).hasErrors,u["ɵnov"](n,123).hasSuccess),l(n,132,0,u["ɵnov"](n,138).ngClassUntouched,u["ɵnov"](n,138).ngClassTouched,u["ɵnov"](n,138).ngClassPristine,u["ɵnov"](n,138).ngClassDirty,u["ɵnov"](n,138).ngClassValid,u["ɵnov"](n,138).ngClassInvalid,u["ɵnov"](n,138).ngClassPending,u["ɵnov"](n,139).validClass,u["ɵnov"](n,139).invalidClass),l(n,151,0,u["ɵnov"](n,152).hasErrors,u["ɵnov"](n,152).hasSuccess),l(n,161,0,u["ɵnov"](n,167).ngClassUntouched,u["ɵnov"](n,167).ngClassTouched,u["ɵnov"](n,167).ngClassPristine,u["ɵnov"](n,167).ngClassDirty,u["ɵnov"](n,167).ngClassValid,u["ɵnov"](n,167).ngClassInvalid,u["ɵnov"](n,167).ngClassPending,u["ɵnov"](n,168).validClass,u["ɵnov"](n,168).invalidClass),l(n,173,0,u["ɵnov"](n,174).hasErrors,u["ɵnov"](n,174).hasSuccess),l(n,183,0,u["ɵnov"](n,189).ngClassUntouched,u["ɵnov"](n,189).ngClassTouched,u["ɵnov"](n,189).ngClassPristine,u["ɵnov"](n,189).ngClassDirty,u["ɵnov"](n,189).ngClassValid,u["ɵnov"](n,189).ngClassInvalid,u["ɵnov"](n,189).ngClassPending,u["ɵnov"](n,190).validClass,u["ɵnov"](n,190).invalidClass),l(n,198,0,e.deviceCount),l(n,199,0,u["ɵnov"](n,200).hasErrors,u["ɵnov"](n,200).hasSuccess),l(n,209,0,u["ɵnov"](n,215).ngClassUntouched,u["ɵnov"](n,215).ngClassTouched,u["ɵnov"](n,215).ngClassPristine,u["ɵnov"](n,215).ngClassDirty,u["ɵnov"](n,215).ngClassValid,u["ɵnov"](n,215).ngClassInvalid,u["ɵnov"](n,215).ngClassPending,u["ɵnov"](n,216).validClass,u["ɵnov"](n,216).invalidClass);var a=u["ɵunv"](n,220,0,l(n,221,0,u["ɵnov"](n,0),e.action)),o=u["ɵunv"](n,220,1,l(n,222,0,u["ɵnov"](n,1),e.resource));l(n,220,0,a,o)}))}function Pn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-erasure-code-profile-form-modal",[],null,null,null,Fn,Xl)),u["ɵdid"](1,114688,null,0,_,[y.a,Al.a,V.a,c,s.a,i.b],null,null)],(function(l,n){l(n,1,0)}),null)}var An=u["ɵccf"]("cd-erasure-code-profile-form-modal",_,Pn,{},{submitAction:"submitAction"},[]),Bn=e("w9WL"),On=e("yT6U"),zn=e("4DD9"),Ln=e("iExv"),jn=e("85J/"),Un=e("+0ag"),Mn=e("IzCI"),Gn=e("Dwqy"),$n=e("uYzU"),Kn=e("FFMq"),Jn=e("E2fk"),Wn=e("a0VL"),Zn=e("nSDx"),Hn=e("SB+Q"),Xn=e("TYzs"),Yn=e("BQkM"),Qn=e("dEH0"),le=e("G1/K"),ne=e("TJUb"),ee=e("efK2"),ue=e("CNMR"),ie=e("KOzp"),te=e("2uy1"),ae=e("z/SZ"),oe=e("38Bd"),se=e("978R"),re=e("FE24"),de=e("Avrn"),ce=e("iInd"),me=e("2ZVE"),fe=e("ienR"),ge=e("gk6K"),pe=e("9Xeq"),he=e("hrfs"),ve=e("yGOH"),be=e("bxSN"),Ce=e("WF9J"),Re=e("V/fk"),Ie=e("ChqD"),Ee=e("PCNd"),Ne=e("zWsK"),Ve=e("kJI8"),ye=e("kccj"),we=e("yYhs"),Te=e("k/xb"),_e=e("C6Ij"),Se=e("AWcq"),De=e("xSw7"),ke=e("GgAd"),xe=e("a278"),qe=e("insk"),Fe=e("cUpR"),Pe=e("20UP"),Ae=e("pKUh"),Be=e("25BL"),Oe=e("NUGo"),ze=e("S7zO"),Le=e("EFGL"),je=e("aAWM"),Ue=e("o8EM"),Me=e("sLuX"),Ge=e("FSuO");e("jKX/");class $e{constructor(l,n){this.i18n=l,this.poolService=n,this.cacheTierColumns=[],this.cacheTierColumns=[{prop:"pool_name",name:this.i18n("Name"),flexGrow:3},{prop:"cache_mode",name:this.i18n("Cache Mode"),flexGrow:2},{prop:"cache_min_evict_age",name:this.i18n("Min Evict Age"),flexGrow:2},{prop:"cache_min_flush_age",name:this.i18n("Min Flush Age"),flexGrow:2},{prop:"target_max_bytes",name:this.i18n("Target Max Bytes"),flexGrow:2},{prop:"target_max_objects",name:this.i18n("Target Max Objects"),flexGrow:2}]}ngOnChanges(){this.selection&&this.poolService.getConfiguration(this.selection.pool_name).subscribe(l=>{this.selectedPoolConfiguration=l})}filterNonPoolData(l){return a.omit(l,["cdExecuting","cdIsBinary"])}}var Ke=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Je(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Performance Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","three"],["uid","-xyV8KCiz"]],null,null,null,xe.b,xe.a)),u["ɵdid"](3,638976,null,0,qe.a,[Fe.b,Pe.a,s.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Performance Details"),l(n,3,0,"ceph-pool-detail?var-pool_name="+e.selection.pool_name,"three","-xyV8KCiz")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function We(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Configuration"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-rbd-configuration-table",[],null,null,null,Le.b,Le.a)),u["ɵdid"](3,638976,null,0,je.a,[N.a,Ue.a,s.a],{data:[0,"data"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Configuration"),l(n,3,0,e.selectedPoolConfiguration)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function Ze(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Cache Tiers Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,Be.b,Be.a)),u["ɵdid"](3,2867200,null,0,F.a,[u.NgZone,u.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoSave:[3,"autoSave"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Cache Tiers Details"),l(n,3,0,e.cacheTiers,e.cacheTierColumns,"flex",!1)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function He(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,11,"tabset",[["cdTableDetail",""]],[[2,"tab-container",null]],null,null,Ae.b,Ae.a)),u["ɵdid"](1,180224,[[1,4],["tabsetChild",4]],0,me.e,[me.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](3,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](4,0,null,null,1,"cd-table-key-value",[],null,null,null,Me.b,Me.a)),u["ɵdid"](5,638976,null,0,Ge.a,[Wn.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,Je)),u["ɵdid"](7,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,We)),u["ɵdid"](9,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,Ze)),u["ɵdid"](11,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"Details"),l(n,5,0,e.filterNonPoolData(e.selection),!1,!0),l(n,7,0,e.permissions.grafana.read),l(n,9,0,"replicated"===e.selection.type),l(n,11,0,(null==e.selection.tiers?null:e.selection.tiers.length)>0)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).clazz),l(n,2,0,u["ɵnov"](n,3).id,u["ɵnov"](n,3).active,u["ɵnov"](n,3).addClass,u["ɵnov"](n,3).role,u["ɵnov"](n,3).ariaLabelledby)}))}function Xe(l){return u["ɵvid"](0,[u["ɵqud"](671088640,1,{tabsetChild:0}),(l()(),u["ɵand"](16777216,null,null,1,null,He)),u["ɵdid"](2,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,2,0,n.component.selection)}),null)}var Ye=e("ufoC"),Qe=e("mSOc"),lu=u["ɵcrt"]({encapsulation:0,styles:[[".pg-clean{color:#0b0} .pg-working{color:#2b99a8} .pg-warning{color:#ffc200} .pg-unknown{color:red}"]],data:{}});function nu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-view-cache",[],null,null,null,_e.b,_e.a)),u["ɵdid"](1,114688,null,0,Se.a,[],{status:[0,"status"],statusFor:[1,"statusFor"]},null)],(function(l,n){l(n,1,0,n.context.$implicit.status,n.context.$implicit.statusFor)}),null)}function eu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-usage-bar",[["decimals","2"]],null,null,null,De.b,De.a)),u["ɵdid"](1,573440,null,0,ke.a,[],{total:[0,"total"],used:[1,"used"],decimals:[2,"decimals"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.stats.bytes_used.latest+n.parent.context.row.stats.avail_raw.latest,n.parent.context.row.stats.bytes_used.latest,"2")}),null)}function uu(l){return u["ɵvid"](0,[(l()(),u["ɵand"](16777216,null,null,1,null,eu)),u["ɵdid"](1,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,null==n.context.row.stats||null==n.context.row.stats.avail_raw?null:n.context.row.stats.avail_raw.latest)}),null)}function iu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Overall Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","z99hzWtmk"]],null,null,null,xe.b,xe.a)),u["ɵdid"](3,638976,null,0,qe.a,[Fe.b,Pe.a,s.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Overall Performance"),l(n,3,0,"ceph-pools-overview?","two","z99hzWtmk")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function tu(l){return u["ɵvid"](0,[u["ɵqud"](402653184,1,{table:0}),u["ɵqud"](402653184,2,{poolUsageTpl:0}),u["ɵqud"](671088640,3,{poolConfigurationSourceTpl:0}),(l()(),u["ɵeld"](3,0,null,null,14,"tabset",[],[[2,"tab-container",null]],null,null,Ae.b,Ae.a)),u["ɵdid"](4,180224,null,0,me.e,[me.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](5,0,null,0,10,"tab",[["heading","Pools List"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](6,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,nu)),u["ɵdid"](8,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](9,0,null,null,5,"cd-table",[["id","pool-list"],["selectionType","single"]],null,[[null,"setExpandedRow"],[null,"updateSelection"]],(function(l,n,e){var u=!0,i=l.component;return"setExpandedRow"===n&&(u=!1!==i.setExpandedRow(e)&&u),"updateSelection"===n&&(u=!1!==i.updateSelection(e)&&u),u}),Be.b,Be.a)),u["ɵdid"](10,2867200,[[1,4],["table",4]],0,F.a,[u.NgZone,u.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],hasDetails:[2,"hasDetails"],selectionType:[3,"selectionType"]},{updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),u["ɵeld"](11,0,null,1,1,"cd-table-actions",[["class","table-actions"],["id","pool-list-actions"]],null,null,null,Oe.b,Oe.a)),u["ɵdid"](12,114688,null,0,ze.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),u["ɵeld"](13,0,null,3,1,"cd-pool-details",[["cdTableDetail",""],["id","pool-list-details"]],null,null,null,Xe,Ke)),u["ɵdid"](14,573440,null,0,$e,[s.a,m.a],{selection:[0,"selection"],permissions:[1,"permissions"],cacheTiers:[2,"cacheTiers"]},null),(l()(),u["ɵand"](0,[[2,2],["poolUsageTpl",2]],null,0,null,uu)),(l()(),u["ɵand"](16777216,null,0,1,null,iu)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,6,0,"Pools List"),l(n,8,0,e.viewCacheStatusList),l(n,10,0,e.pools,e.columns,!0,"single"),l(n,12,0,e.permissions.pool,e.selection,e.tableActions),l(n,14,0,e.expandedRow,e.permissions,e.cacheTiers),l(n,17,0,e.permissions.grafana.read)}),(function(l,n){l(n,3,0,u["ɵnov"](n,4).clazz),l(n,5,0,u["ɵnov"](n,6).id,u["ɵnov"](n,6).active,u["ɵnov"](n,6).addClass,u["ɵnov"](n,6).role,u["ɵnov"](n,6).ariaLabelledby)}))}function au(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"cd-pool-list",[],null,null,null,tu,lu)),u["ɵprd"](131584,null,z.a,z.a,[Ye.a,Qe.a]),u["ɵprd"](256,null,L.a,M,[]),u["ɵdid"](3,114688,null,0,G,[m.a,V.a,E.a,z.a,Al.b,s.a,j.a,O.a,L.a,x.a,i.b],null,null)],(function(l,n){l(n,3,0)}),null)}var ou=u["ɵccf"]("cd-pool-list",G,au,{},{},[]),su=e("QC43"),ru=e("XFyV"),du=e("i4WA"),cu=e("6qls"),mu=e("tz6c"),fu=e("EmSq"),gu=e("pYKc"),pu=e("ppaS"),hu=e("BH9v"),vu=e("rFfW"),bu=u["ɵcrt"]({encapsulation:0,styles:[[".crush-rule-steps[_ngcontent-%COMP%]{margin-top:10px}"]],data:{}});function Cu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,su.b,su.a)),u["ɵdid"](1,49152,null,0,ru.a,[],null,null),(l()(),u["ɵted"](-1,0,["Loading..."]))],null,null)}function Ru(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Iu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen Ceph pool name is already in use."]))],null,null)}function Eu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["It's not possible to create an RBD pool with '/' in the name. Please change the name or remove 'rbd' from the applications list."]))],null,null)}function Nu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Pool name can only contain letters, numbers, '.', '-', '_' or '/'."]))],null,null)}function Vu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function yu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function wu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Tu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function _u(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["At least one placement group is needed!"]))],null,null)}function Su(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Your cluster can't handle this many PGs. Please recalculate the PG amount needed."]))],null,null)}function Du(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The current PGs settings were calculated for you, you should make sure the values suit your needs before submit."]))],null,null)}function ku(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,28,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,11,{FormControlNames:1}),u["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","pgNum"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Placement groups"])),(l()(),u["ɵeld"](6,0,null,0,22,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,10,"input",[["class","form-control"],["formControlName","pgNum"],["id","pgNum"],["min","1"],["name","pgNum"],["required",""],["type","number"]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"focus"],[null,"blur"],[null,"input"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0,t=l.component;return"input"===n&&(i=!1!==u["ɵnov"](l,9)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,9).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,9)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,9)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),"focus"===n&&(i=0!=(t.externalPgChange=!1)&&i),"blur"===n&&(i=!1!==t.alignPgs()&&i),i}),null,null)),u["ɵdid"](8,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](9,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](10,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵdid"](11,16384,null,0,t.z,[],{required:[0,"required"]},null),u["ɵprd"](1024,null,t.o,(function(l){return[l]}),[t.z]),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](14,671744,[[11,4]],0,t.j,[[3,t.d],[6,t.o],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](16,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](17,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Tu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,_u)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Su)),u["ɵdid"](23,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](24,0,null,null,2,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,1,"cd-doc",[["docText","Calculation help"],["section","pgs"]],null,null,null,du.b,du.a)),u["ɵdid"](26,114688,null,0,cu.a,[mu.a,s.a],{section:[0,"section"],docText:[1,"docText"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Du)),u["ɵdid"](28,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,11,0,""),l(n,14,0,"pgNum"),l(n,17,0,"pgNum"),l(n,19,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"required")),l(n,21,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"min")),l(n,23,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"34")),l(n,26,0,"pgs","Calculation help"),l(n,28,0,e.externalPgChange)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,7,0,u["ɵnov"](n,11).required?"":null,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function xu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,5,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,4,"ul",[["class","list-inline"]],null,null,null,null,null)),(l()(),u["ɵeld"](2,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](3,null,["Minimum: ",""])),(l()(),u["ɵeld"](4,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](5,null,["Maximum: ",""]))],null,(function(l,n){var e=n.component;l(n,3,0,e.getMinSize()),l(n,5,0,e.getMaxSize())}))}function qu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["The size specified is out of range. A value from "," to "," is usable."]))],null,(function(l,n){var e=n.component;l(n,1,0,e.getMinSize(),e.getMaxSize())}))}function Fu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","text-warning-dark"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A size of 1 will not create a replication of the object. The 'Replicated size' includes the object itself."]))],null,null)}function Pu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,13,{FormControlNames:1}),u["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","size"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Replicated size"])),(l()(),u["ɵeld"](6,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","size"],["id","size"],["name","size"],["type","number"]],[[8,"max",0],[8,"min",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,9)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,9).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,9)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,9)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),i}),null,null)),u["ɵdid"](8,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](9,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](10,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](12,671744,[[13,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](14,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](15,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,xu)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,qu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Fu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,"size"),l(n,15,0,"size"),l(n,17,0,e.form.showError("size",u["ɵnov"](n.parent.parent,2))),l(n,19,0,e.form.showError("size",u["ɵnov"](n.parent.parent,2))),l(n,21,0,1===e.form.getValue("size"))}),(function(l,n){var e=n.component;l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,7,1,[e.getMaxSize(),e.getMinSize(),u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass])}))}function Au(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,15,{FormControlNames:1}),u["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Flags"])),(l()(),u["ɵeld"](6,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","ecOverwrites"],["id","ec-overwrites"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.checked)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),i}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,t.c,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.c]),u["ɵdid"](12,671744,[[15,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](14,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](15,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](16,0,null,null,1,"label",[["class","custom-control-label"],["for","ec-overwrites"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["EC Overwrites"]))],(function(l,n){l(n,1,0),l(n,12,0,"ecOverwrites"),l(n,15,0,"ecOverwrites")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function Bu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,23,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](2,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,9,{FormControlNames:1}),u["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),u["ɵeld"](5,0,null,0,1,"label",[["class","cd-col-form-label"],["for","pgAutoscaleMode"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["PG Autoscale"])),(l()(),u["ɵeld"](7,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","pgAutoscaleMode"],["id","pgAutoscaleMode"],["name","pgAutoscaleMode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),i}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](12,671744,[[9,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](14,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](15,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,wu)),u["ɵdid"](17,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ku)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Pu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Au)),u["ɵdid"](23,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0),l(n,12,0,"pgAutoscaleMode"),l(n,15,0,"pgAutoscaleMode"),l(n,17,0,e.pgAutoscaleModes),l(n,19,0,"on"!==e.form.getValue("pgAutoscaleMode")),l(n,21,0,e.isReplicated),l(n,23,0,e.info.is_all_bluestore&&e.isErasure)}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).hasErrors,u["ɵnov"](n,2).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function Ou(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function zu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- No erasure code profile available --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Lu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select an erasure code profile --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function ju(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function Uu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,4,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.addErasureCodeProfile()&&u),u}),null,null)),(l()(),u["ɵeld"](1,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](3,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](4,1)],(function(l,n){var e=l(n,4,0,n.component.icons.add);l(n,3,0,e)}),null)}function Mu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,16777216,null,null,5,"button",[["class","btn btn-light"],["tooltip","This profile can't be deleted as it is in use."],["triggers",""],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.deleteErasureCodeProfile()&&u),u}),null,null)),u["ɵdid"](1,212992,[[4,4],["ecpDeletionBtn",4]],0,se.c,[u.ViewContainerRef,ae.a,se.a,u.ElementRef,u.Renderer2,te.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"]},null),(l()(),u["ɵeld"](2,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](4,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](5,1),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,1,0,"This profile can't be deleted as it is in use.","");var u=l(n,5,0,e.icons.trash);l(n,4,0,u)}),null)}function Gu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Profile is not in use."]))],null,null)}function $u(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit)}))}function Ku(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"ul",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,$u)),u["ɵdid"](2,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,2,0,n.component.ecpUsage)}),null)}function Ju(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,12,"span",[["class","form-text text-muted"],["id","ecp-info-block"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,Ae.b,Ae.a)),u["ɵdid"](2,180224,[[3,4],["ecpInfoTabs",4]],0,me.e,[me.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](3,0,null,0,4,"tab",[["class","ecp-info"],["heading","Profile"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](4,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](5,0,null,null,2,"cd-table-key-value",[],null,null,null,Me.b,Me.a)),u["ɵdid"](6,638976,null,0,Ge.a,[Wn.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"],hideKeys:[3,"hideKeys"]},null),u["ɵpad"](7,1),(l()(),u["ɵeld"](8,0,null,0,4,"tab",[["class","used-by-pools"],["heading","Used by pools"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](9,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](0,[["ecpIsNotUsed",2]],null,0,null,Gu)),(l()(),u["ɵand"](16777216,null,null,1,null,Ku)),u["ɵdid"](12,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,4,0,"Profile");var i=e.form.getValue("erasureProfile"),t=l(n,7,0,"name");l(n,6,0,i,!1,!0,t),l(n,9,0,"Used by pools"),l(n,12,0,e.ecpUsage,u["ɵnov"](n,10))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).clazz),l(n,3,0,u["ɵnov"](n,4).id,u["ɵnov"](n,4).active,u["ɵnov"](n,4).addClass,u["ɵnov"](n,4).role,u["ɵnov"](n,4).ariaLabelledby),l(n,8,0,u["ɵnov"](n,9).id,u["ɵnov"](n,9).active,u["ɵnov"](n,9).addClass,u["ɵnov"](n,9).role,u["ɵnov"](n,9).ariaLabelledby)}))}function Wu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,38,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,19,{FormControlNames:1}),u["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","erasureProfile"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Erasure code profile"])),(l()(),u["ɵeld"](6,0,null,0,32,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,29,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","erasureProfile"],["id","erasureProfile"],["name","erasureProfile"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),i}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](12,671744,[[19,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](14,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](15,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ou)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,zu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Lu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ju)),u["ɵdid"](23,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](24,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,7,"button",[["class","btn btn-light"],["id","ecp-info-button"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0,i=l.component;return"click"===n&&(u=0!=(i.data.erasureInfo=!i.data.erasureInfo)&&u),u}),null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](27,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),u["ɵpod"](28,{active:0}),(l()(),u["ɵeld"](29,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](31,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](32,1),(l()(),u["ɵand"](16777216,null,null,1,null,Uu)),u["ɵdid"](34,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Mu)),u["ɵdid"](36,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ju)),u["ɵdid"](38,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,"erasureProfile"),l(n,15,0,"erasureProfile"),l(n,17,0,!e.ecProfiles),l(n,19,0,e.ecProfiles&&0===e.ecProfiles.length),l(n,21,0,e.ecProfiles&&e.ecProfiles.length>0),l(n,23,0,e.ecProfiles);var u=l(n,28,0,e.data.erasureInfo);l(n,27,0,"btn btn-light",u);var i=l(n,32,0,e.icons.questionCircle);l(n,31,0,i),l(n,34,0,!e.editing),l(n,36,0,!e.editing),l(n,38,0,e.data.erasureInfo&&e.form.getValue("erasureProfile"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function Zu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,21,{FormControlNames:1}),u["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","crushRule"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush ruleset"])),(l()(),u["ɵeld"](6,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A new crush ruleset will be implicitly created."]))],(function(l,n){l(n,1,0)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess)}))}function Hu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["There are no rules."])),(l()(),u["ɵted"](-1,null,["  "]))],null,null)}function Xu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.rule_name)}))}function Yu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,4,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.addCrushRule()&&u),u}),null,null)),(l()(),u["ɵeld"](1,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](3,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](4,1)],(function(l,n){var e=l(n,4,0,n.component.icons.add);l(n,3,0,e)}),null)}function Qu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,16777216,null,null,5,"button",[["class","btn btn-light"],["tooltip","This rule can't be deleted as it is in use."],["triggers",""],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.deleteCrushRule()&&u),u}),null,null)),u["ɵdid"](1,212992,[[2,4],["crushDeletionBtn",4]],0,se.c,[u.ViewContainerRef,ae.a,se.a,u.ElementRef,u.Renderer2,te.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"]},null),(l()(),u["ɵeld"](2,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](4,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](5,1),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,1,0,"This rule can't be deleted as it is in use.","");var u=l(n,5,0,e.icons.trash);l(n,4,0,u)}),null)}function li(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.describeCrushStep(n.context.$implicit))}))}function ni(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Rule is not in use."]))],null,null)}function ei(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit)}))}function ui(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"ul",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,ei)),u["ɵdid"](2,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,2,0,n.component.crushUsage)}),null)}function ii(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,17,"span",[["class","form-text text-muted"],["id","crush-info-block"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,16,"tabset",[],[[2,"tab-container",null]],null,null,Ae.b,Ae.a)),u["ɵdid"](2,180224,[[1,4],["crushInfoTabs",4]],0,me.e,[me.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](3,0,null,0,4,"tab",[["class","crush-rule-info"],["heading","Crush rule"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](4,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](5,0,null,null,2,"cd-table-key-value",[],null,null,null,Me.b,Me.a)),u["ɵdid"](6,638976,null,0,Ge.a,[Wn.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"],hideKeys:[3,"hideKeys"]},null),u["ɵpad"](7,4),(l()(),u["ɵeld"](8,0,null,0,4,"tab",[["class","crush-rule-steps"],["heading","Crush steps"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](9,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](10,0,null,null,2,"ol",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,li)),u["ɵdid"](12,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](13,0,null,0,4,"tab",[["class","used-by-pools"],["heading","Used by pools"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](14,212992,null,0,me.b,[me.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](0,[["ruleIsNotUsed",2]],null,0,null,ni)),(l()(),u["ɵand"](16777216,null,null,1,null,ui)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,4,0,"Crush rule");var i=e.form.getValue("crushRule"),t=l(n,7,0,"steps","ruleset","type","rule_name");l(n,6,0,i,!1,!1,t),l(n,9,0,"Crush steps"),l(n,12,0,e.form.get("crushRule").value.steps),l(n,14,0,"Used by pools"),l(n,17,0,e.crushUsage,u["ɵnov"](n,15))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).clazz),l(n,3,0,u["ɵnov"](n,4).id,u["ɵnov"](n,4).active,u["ɵnov"](n,4).addClass,u["ɵnov"](n,4).role,u["ɵnov"](n,4).ariaLabelledby),l(n,8,0,u["ɵnov"](n,9).id,u["ɵnov"](n,9).active,u["ɵnov"](n,9).addClass,u["ɵnov"](n,9).role,u["ɵnov"](n,9).ariaLabelledby),l(n,13,0,u["ɵnov"](n,14).id,u["ɵnov"](n,14).active,u["ɵnov"](n,14).addClass,u["ɵnov"](n,14).role,u["ɵnov"](n,14).ariaLabelledby)}))}function ti(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function ai(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The rule can't be used in the current cluster as it has too few OSDs to meet the minimum required OSD by this rule."]))],null,null)}function oi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,34,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,27,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),u["ɵeld"](2,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","crushRule"],["id","crushRule"],["name","crushSet"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,4).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,4).onTouched()&&i),i}),null,null)),u["ɵdid"](3,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](4,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](6,671744,[[23,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](8,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](9,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](10,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](11,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](12,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select a crush rule --"])),(l()(),u["ɵand"](16777216,null,null,1,null,Xu)),u["ɵdid"](15,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](16,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),u["ɵeld"](17,0,null,null,7,"button",[["class","btn btn-light"],["id","crush-info-button"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0,i=l.component;return"click"===n&&(u=0!=(i.data.crushInfo=!i.data.crushInfo)&&u),u}),null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](19,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),u["ɵpod"](20,{active:0}),(l()(),u["ɵeld"](21,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](23,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](24,1),(l()(),u["ɵand"](16777216,null,null,1,null,Yu)),u["ɵdid"](26,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Qu)),u["ɵdid"](28,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ii)),u["ɵdid"](30,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ti)),u["ɵdid"](32,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ai)),u["ɵdid"](34,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,6,0,"crushRule"),l(n,9,0,"crushRule"),l(n,11,0,null),l(n,12,0,null),l(n,15,0,e.current.rules);var i=l(n,20,0,e.data.crushInfo);l(n,19,0,"btn btn-light",i);var t=l(n,24,0,e.icons.questionCircle);l(n,23,0,t),l(n,26,0,e.isReplicated&&!e.editing),l(n,28,0,e.isReplicated&&!e.editing),l(n,30,0,e.data.crushInfo&&e.form.getValue("crushRule")),l(n,32,0,e.form.showError("crushRule",u["ɵnov"](n.parent.parent.parent,2),"required")),l(n,34,0,e.form.showError("crushRule",u["ɵnov"](n.parent.parent.parent,2),"tooFewOsds"))}),(function(l,n){l(n,2,0,u["ɵnov"](n,8).ngClassUntouched,u["ɵnov"](n,8).ngClassTouched,u["ɵnov"](n,8).ngClassPristine,u["ɵnov"](n,8).ngClassDirty,u["ɵnov"](n,8).ngClassValid,u["ɵnov"](n,8).ngClassInvalid,u["ɵnov"](n,8).ngClassPending,u["ɵnov"](n,9).validClass,u["ɵnov"](n,9).invalidClass)}))}function si(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,9,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,23,{FormControlNames:1}),u["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","crushRule"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush ruleset"])),(l()(),u["ɵeld"](6,0,null,0,3,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵand"](0,[["noRules",2]],null,0,null,Hu)),(l()(),u["ɵand"](16777216,null,null,1,null,oi)),u["ɵdid"](9,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,9,0,e.current.rules.length>0,u["ɵnov"](n,7))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess)}))}function ri(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,8,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["CRUSH"])),(l()(),u["ɵand"](16777216,null,null,1,null,Wu)),u["ɵdid"](4,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Zu)),u["ɵdid"](6,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,si)),u["ɵdid"](8,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.isErasure),l(n,6,0,e.isErasure&&!e.editing),l(n,8,0,e.isReplicated||e.editing)}),null)}function di(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function ci(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function mi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- No erasure compression algorithm available --"]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function fi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function gi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than 0"]))],null,null)}function pi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be less than the maximum blob size"]))],null,null)}function hi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than 0"]))],null,null)}function vi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than the minimum blob size"]))],null,null)}function bi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be between 0.0 and 1.0"]))],null,null)}function Ci(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,79,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](2,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,27,{FormControlNames:1}),u["ɵqud"](603979776,28,{messagesBlock:0}),(l()(),u["ɵeld"](5,0,null,0,1,"label",[["class","cd-col-form-label"],["for","algorithm"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Algorithm"])),(l()(),u["ɵeld"](7,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","algorithm"],["id","algorithm"],["name","algorithm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,10).onTouched()&&i),i}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](12,671744,[[27,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](14,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](15,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ci)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,mi)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,fi)),u["ɵdid"](21,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](22,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](23,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,29,{FormControlNames:1}),u["ɵqud"](603979776,30,{messagesBlock:0}),(l()(),u["ɵeld"](26,0,null,0,1,"label",[["class","cd-col-form-label"],["for","minBlobSize"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Minimum blob size"])),(l()(),u["ɵeld"](28,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](29,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","KiB"],["formControlName","minBlobSize"],["id","minBlobSize"],["min","0"],["name","minBlobSize"],["placeholder","e.g., 128KiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,30)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,30).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,30)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,30)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,34).onBlur(e.target.value)&&i),i}),null,null)),u["ɵdid"](30,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](32,671744,[[29,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](34,81920,null,0,fu.a,[u.ElementRef,t.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](35,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](36,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](37,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,gi)),u["ɵdid"](39,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,pi)),u["ɵdid"](41,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](42,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](43,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,31,{FormControlNames:1}),u["ɵqud"](603979776,32,{messagesBlock:0}),(l()(),u["ɵeld"](46,0,null,0,1,"label",[["class","cd-col-form-label"],["for","maxBlobSize"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Maximum blob size"])),(l()(),u["ɵeld"](48,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](49,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","KiB"],["formControlName","maxBlobSize"],["id","maxBlobSize"],["min","0"],["placeholder","e.g., 512KiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,50)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,50).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,50)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,50)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,54).onBlur(e.target.value)&&i),i}),null,null)),u["ɵdid"](50,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](52,671744,[[31,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](54,81920,null,0,fu.a,[u.ElementRef,t.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](55,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](56,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](57,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,hi)),u["ɵdid"](59,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,vi)),u["ɵdid"](61,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](62,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](63,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,33,{FormControlNames:1}),u["ɵqud"](603979776,34,{messagesBlock:0}),(l()(),u["ɵeld"](66,0,null,0,1,"label",[["class","cd-col-form-label"],["for","ratio"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Ratio"])),(l()(),u["ɵeld"](68,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](69,0,null,null,8,"input",[["class","form-control"],["formControlName","ratio"],["id","ratio"],["max","1"],["min","0"],["name","ratio"],["placeholder","Compression ratio"],["step","0.1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,71)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,71).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,71)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,71)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,72).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,72).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,72).onTouched()&&i),i}),null,null)),u["ɵdid"](70,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](71,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](72,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](74,671744,[[33,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](76,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](77,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,bi)),u["ɵdid"](79,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0),l(n,12,0,"algorithm"),l(n,15,0,"algorithm"),l(n,17,0,!e.info.compression_algorithms),l(n,19,0,e.info.compression_algorithms&&0===e.info.compression_algorithms.length),l(n,21,0,e.info.compression_algorithms),l(n,23,0),l(n,32,0,"minBlobSize"),l(n,34,0,"KiB"),l(n,37,0,"minBlobSize"),l(n,39,0,e.form.showError("minBlobSize",u["ɵnov"](n.parent.parent,2),"min")),l(n,41,0,e.form.showError("minBlobSize",u["ɵnov"](n.parent.parent,2),"maximum")),l(n,43,0),l(n,52,0,"maxBlobSize"),l(n,54,0,"KiB"),l(n,57,0,"maxBlobSize"),l(n,59,0,e.form.showError("maxBlobSize",u["ɵnov"](n.parent.parent,2),"min")),l(n,61,0,e.form.showError("maxBlobSize",u["ɵnov"](n.parent.parent,2),"minimum")),l(n,63,0),l(n,74,0,"ratio"),l(n,77,0,"ratio"),l(n,79,0,e.form.showError("ratio",u["ɵnov"](n.parent.parent,2),"min")||e.form.showError("ratio",u["ɵnov"](n.parent.parent,2),"max"))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).hasErrors,u["ɵnov"](n,2).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass),l(n,22,0,u["ɵnov"](n,23).hasErrors,u["ɵnov"](n,23).hasSuccess),l(n,29,0,u["ɵnov"](n,36).ngClassUntouched,u["ɵnov"](n,36).ngClassTouched,u["ɵnov"](n,36).ngClassPristine,u["ɵnov"](n,36).ngClassDirty,u["ɵnov"](n,36).ngClassValid,u["ɵnov"](n,36).ngClassInvalid,u["ɵnov"](n,36).ngClassPending,u["ɵnov"](n,37).validClass,u["ɵnov"](n,37).invalidClass),l(n,42,0,u["ɵnov"](n,43).hasErrors,u["ɵnov"](n,43).hasSuccess),l(n,49,0,u["ɵnov"](n,56).ngClassUntouched,u["ɵnov"](n,56).ngClassTouched,u["ɵnov"](n,56).ngClassPristine,u["ɵnov"](n,56).ngClassDirty,u["ɵnov"](n,56).ngClassValid,u["ɵnov"](n,56).ngClassInvalid,u["ɵnov"](n,56).ngClassPending,u["ɵnov"](n,57).validClass,u["ɵnov"](n,57).invalidClass),l(n,62,0,u["ɵnov"](n,63).hasErrors,u["ɵnov"](n,63).hasSuccess),l(n,69,0,u["ɵnov"](n,76).ngClassUntouched,u["ɵnov"](n,76).ngClassTouched,u["ɵnov"](n,76).ngClassPristine,u["ɵnov"](n,76).ngClassDirty,u["ɵnov"](n,76).ngClassValid,u["ɵnov"](n,76).ngClassInvalid,u["ɵnov"](n,76).ngClassPending,u["ɵnov"](n,77).validClass,u["ɵnov"](n,77).invalidClass)}))}function Ri(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,24,"div",[["formGroupName","compression"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),u["ɵdid"](1,212992,null,0,t.m,[[3,t.d],[8,null],[8,null]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.d,null,[t.m]),u["ɵdid"](3,16384,null,0,t.s,[[4,t.d]],null,null),(l()(),u["ɵeld"](4,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Compression"])),(l()(),u["ɵeld"](6,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](7,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,25,{FormControlNames:1}),u["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),u["ɵeld"](10,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mode"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Mode"])),(l()(),u["ɵeld"](12,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](13,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","mode"],["id","mode"],["name","mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,15).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,15).onTouched()&&i),i}),null,null)),u["ɵdid"](14,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](15,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](17,671744,[[25,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](19,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](20,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,di)),u["ɵdid"](22,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ci)),u["ɵdid"](24,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0,"compression"),l(n,7,0),l(n,17,0,"mode"),l(n,20,0,"mode"),l(n,22,0,e.info.compression_modes),l(n,24,0,e.hasCompressionEnabled())}),(function(l,n){l(n,0,0,u["ɵnov"](n,3).ngClassUntouched,u["ɵnov"](n,3).ngClassTouched,u["ɵnov"](n,3).ngClassPristine,u["ɵnov"](n,3).ngClassDirty,u["ɵnov"](n,3).ngClassValid,u["ɵnov"](n,3).ngClassInvalid,u["ɵnov"](n,3).ngClassPending),l(n,6,0,u["ɵnov"](n,7).hasErrors,u["ɵnov"](n,7).hasSuccess),l(n,13,0,u["ɵnov"](n,19).ngClassUntouched,u["ɵnov"](n,19).ngClassTouched,u["ɵnov"](n,19).ngClassPristine,u["ɵnov"](n,19).ngClassDirty,u["ɵnov"](n,19).ngClassValid,u["ɵnov"](n,19).ngClassInvalid,u["ɵnov"](n,19).ngClassPending,u["ɵnov"](n,20).validClass,u["ɵnov"](n,20).invalidClass)}))}function Ii(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The value should be greater or equal to 0"]))],null,null)}function Ei(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,138,"form",[["name","form"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var i=!0;return"submit"===n&&(i=!1!==u["ɵnov"](l,2).onSubmit(e)&&i),"reset"===n&&(i=!1!==u["ɵnov"](l,2).onReset()&&i),"submit"===n&&(i=!1!==u["ɵnov"](l,5).onSubmit()&&i),i}),null,null)),u["ɵdid"](1,16384,null,0,t.G,[],null,null),u["ɵdid"](2,540672,[["formDir",4]],0,t.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,t.d,null,[t.l]),u["ɵdid"](4,16384,null,0,t.s,[[4,t.d]],null,null),u["ɵdid"](5,16384,null,0,yl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](6,0,null,null,132,"div",[["class","card"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),u["ɵted"](8,null,[""," ",""])),u["ɵppd"](9,1),u["ɵppd"](10,1),(l()(),u["ɵeld"](11,0,null,null,118,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](12,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](13,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](18,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](19,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,22)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,22).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,22)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,22)._compositionEnd(e.target.value)&&i),i}),null,null)),u["ɵdid"](20,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](21,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](22,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](24,671744,[[5,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](26,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](27,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ru)),u["ɵdid"](29,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Iu)),u["ɵdid"](31,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Eu)),u["ɵdid"](33,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Nu)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](36,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](37,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](40,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","poolType"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Pool type"])),(l()(),u["ɵeld"](42,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](43,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","poolType"],["id","poolType"],["name","poolType"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var i=!0;return"change"===n&&(i=!1!==u["ɵnov"](l,45).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,45).onTouched()&&i),i}),null,null)),u["ɵdid"](44,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](45,16384,null,0,t.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.A]),u["ɵdid"](47,671744,[[7,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](49,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](50,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](51,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](52,147456,null,0,t.v,[u.ElementRef,u.Renderer2,[2,t.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](53,147456,null,0,t.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select a pool type --"])),(l()(),u["ɵand"](16777216,null,null,1,null,Vu)),u["ɵdid"](56,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,yu)),u["ɵdid"](58,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Bu)),u["ɵdid"](60,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](61,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](62,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,17,{FormControlNames:1}),u["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),u["ɵeld"](65,0,null,0,1,"label",[["class","cd-col-form-label"],["for","applications"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Applications"])),(l()(),u["ɵeld"](67,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](68,0,null,null,1,"cd-select-badges",[["id","applications"]],null,[[null,"selection"]],(function(l,n,e){var u=!0;return"selection"===n&&(u=!1!==l.component.appSelection()&&u),u}),gu.b,gu.a)),u["ɵdid"](69,49152,null,0,pu.a,[s.a],{data:[0,"data"],options:[1,"options"],messages:[2,"messages"],selectionLimit:[3,"selectionLimit"],customBadges:[4,"customBadges"],customBadgeValidators:[5,"customBadgeValidators"]},{selection:"selection"}),(l()(),u["ɵand"](16777216,null,null,1,null,ri)),u["ɵdid"](71,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ri)),u["ɵdid"](73,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](74,0,null,null,52,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](75,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Quotas"])),(l()(),u["ɵeld"](77,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](78,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,35,{FormControlNames:1}),u["ɵqud"](603979776,36,{messagesBlock:0}),(l()(),u["ɵeld"](81,0,null,0,9,"label",[["class","cd-col-form-label"],["for","max_bytes"]],null,null,null,null,null)),(l()(),u["ɵeld"](82,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Max bytes"])),(l()(),u["ɵeld"](84,0,null,null,6,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](85,49152,null,0,kl.a,[],null,null),(l()(),u["ɵeld"](86,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Leave it blank or specify 0 to disable this quota."])),(l()(),u["ɵeld"](88,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),u["ɵeld"](89,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A valid quota should be greater than 0."])),(l()(),u["ɵeld"](91,0,null,0,9,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](92,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","GiB"],["formControlName","max_bytes"],["id","max_bytes"],["name","max_bytes"],["placeholder","e.g., 10GiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,93)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,93).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,93)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,93)._compositionEnd(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,97).onBlur(e.target.value)&&i),i}),null,null)),u["ɵdid"](93,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵprd"](1024,null,t.p,(function(l){return[l]}),[t.e]),u["ɵdid"](95,671744,[[35,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](97,81920,null,0,fu.a,[u.ElementRef,t.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](98,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](99,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](100,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](101,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](102,1163264,null,2,yl.c,[u.ElementRef,yl.g],null,null),u["ɵqud"](603979776,37,{FormControlNames:1}),u["ɵqud"](603979776,38,{messagesBlock:0}),(l()(),u["ɵeld"](105,0,null,0,9,"label",[["class","cd-col-form-label"],["for","max_objects"]],null,null,null,null,null)),(l()(),u["ɵeld"](106,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Max objects"])),(l()(),u["ɵeld"](108,0,null,null,6,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](109,49152,null,0,kl.a,[],null,null),(l()(),u["ɵeld"](110,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Leave it blank or specify 0 to disable this quota."])),(l()(),u["ɵeld"](112,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),u["ɵeld"](113,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A valid quota should be greater than 0."])),(l()(),u["ɵeld"](115,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](116,0,null,null,8,"input",[["class","form-control"],["formControlName","max_objects"],["id","max_objects"],["min","0"],["name","max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var i=!0;return"input"===n&&(i=!1!==u["ɵnov"](l,118)._handleInput(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,118).onTouched()&&i),"compositionstart"===n&&(i=!1!==u["ɵnov"](l,118)._compositionStart()&&i),"compositionend"===n&&(i=!1!==u["ɵnov"](l,118)._compositionEnd(e.target.value)&&i),"change"===n&&(i=!1!==u["ɵnov"](l,119).onChange(e.target.value)&&i),"input"===n&&(i=!1!==u["ɵnov"](l,119).onChange(e.target.value)&&i),"blur"===n&&(i=!1!==u["ɵnov"](l,119).onTouched()&&i),i}),null,null)),u["ɵdid"](117,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](118,16384,null,0,t.e,[u.Renderer2,u.ElementRef,[2,t.b]],null,null),u["ɵdid"](119,16384,null,0,t.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,t.p,(function(l,n){return[l,n]}),[t.e,t.w]),u["ɵdid"](121,671744,[[37,4]],0,t.j,[[3,t.d],[8,null],[8,null],[6,t.p],[2,t.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,t.q,null,[t.j]),u["ɵdid"](123,16384,null,0,t.r,[[4,t.q]],null,null),u["ɵdid"](124,16384,null,0,yl.h,[[3,t.d],yl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ii)),u["ɵdid"](126,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](127,0,null,null,2,"div",[],[[8,"hidden",0]],null,null,null,null)),(l()(),u["ɵeld"](128,0,null,null,1,"cd-rbd-configuration-form",[],null,[[null,"changes"]],(function(l,n,e){var u=!0;return"changes"===n&&(u=!1!==(l.component.currentConfigurationValues=e())&&u),u}),hu.b,hu.a)),u["ɵdid"](129,114688,null,0,vu.a,[N.a,Ue.a],{form:[0,"form"],initializeData:[1,"initializeData"]},{changes:"changes"}),(l()(),u["ɵeld"](130,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](131,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),u["ɵeld"](132,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.submit()&&u),u}),xl.b,xl.a)),u["ɵdid"](133,114688,null,0,ql.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](134,0,[""," "," "])),u["ɵppd"](135,1),u["ɵppd"](136,1),(l()(),u["ɵeld"](137,0,null,null,1,"cd-back-button",[],null,null,null,Fl.b,Fl.a)),u["ɵdid"](138,49152,null,0,Pl.a,[El.Location,i.b],null,null)],(function(l,n){var e=n.component;l(n,2,0,e.form),l(n,5,0,e.form),l(n,13,0),l(n,20,0,""),l(n,24,0,"name"),l(n,27,0,"name"),l(n,29,0,e.form.showError("name",u["ɵnov"](n,2),"required")),l(n,31,0,e.form.showError("name",u["ɵnov"](n,2),"uniqueName")),l(n,33,0,e.form.showError("name",u["ɵnov"](n,2),"rbdPool")),l(n,35,0,e.form.showError("name",u["ɵnov"](n,2),"pattern")),l(n,37,0),l(n,47,0,"poolType"),l(n,50,0,"poolType"),l(n,52,0,""),l(n,53,0,""),l(n,56,0,e.data.poolTypes),l(n,58,0,e.form.showError("poolType",u["ɵnov"](n,2),"required")),l(n,60,0,e.isReplicated||e.isErasure),l(n,62,0),l(n,69,0,e.data.applications.selected,e.data.applications.available,e.data.applications.messages,4,!0,e.data.applications.validators),l(n,71,0,e.isErasure||e.isReplicated),l(n,73,0,e.info.is_all_bluestore),l(n,78,0),l(n,95,0,"max_bytes"),l(n,97,0,"GiB"),l(n,100,0,"max_bytes"),l(n,102,0),l(n,121,0,"max_objects"),l(n,124,0,"max_objects"),l(n,126,0,e.form.showError("max_objects",u["ɵnov"](n,2),"min")),l(n,129,0,e.form,e.initializeConfigData),l(n,133,0,u["ɵnov"](n,2))}),(function(l,n){var e=n.component;l(n,0,0,u["ɵnov"](n,4).ngClassUntouched,u["ɵnov"](n,4).ngClassTouched,u["ɵnov"](n,4).ngClassPristine,u["ɵnov"](n,4).ngClassDirty,u["ɵnov"](n,4).ngClassValid,u["ɵnov"](n,4).ngClassInvalid,u["ɵnov"](n,4).ngClassPending);var i=u["ɵunv"](n,8,0,l(n,9,0,u["ɵnov"](n.parent,0),e.action)),t=u["ɵunv"](n,8,1,l(n,10,0,u["ɵnov"](n.parent,1),e.resource));l(n,8,0,i,t),l(n,12,0,u["ɵnov"](n,13).hasErrors,u["ɵnov"](n,13).hasSuccess),l(n,19,0,u["ɵnov"](n,26).ngClassUntouched,u["ɵnov"](n,26).ngClassTouched,u["ɵnov"](n,26).ngClassPristine,u["ɵnov"](n,26).ngClassDirty,u["ɵnov"](n,26).ngClassValid,u["ɵnov"](n,26).ngClassInvalid,u["ɵnov"](n,26).ngClassPending,u["ɵnov"](n,27).validClass,u["ɵnov"](n,27).invalidClass),l(n,36,0,u["ɵnov"](n,37).hasErrors,u["ɵnov"](n,37).hasSuccess),l(n,43,0,u["ɵnov"](n,49).ngClassUntouched,u["ɵnov"](n,49).ngClassTouched,u["ɵnov"](n,49).ngClassPristine,u["ɵnov"](n,49).ngClassDirty,u["ɵnov"](n,49).ngClassValid,u["ɵnov"](n,49).ngClassInvalid,u["ɵnov"](n,49).ngClassPending,u["ɵnov"](n,50).validClass,u["ɵnov"](n,50).invalidClass),l(n,61,0,u["ɵnov"](n,62).hasErrors,u["ɵnov"](n,62).hasSuccess),l(n,77,0,u["ɵnov"](n,78).hasErrors,u["ɵnov"](n,78).hasSuccess),l(n,92,0,u["ɵnov"](n,99).ngClassUntouched,u["ɵnov"](n,99).ngClassTouched,u["ɵnov"](n,99).ngClassPristine,u["ɵnov"](n,99).ngClassDirty,u["ɵnov"](n,99).ngClassValid,u["ɵnov"](n,99).ngClassInvalid,u["ɵnov"](n,99).ngClassPending,u["ɵnov"](n,100).validClass,u["ɵnov"](n,100).invalidClass),l(n,101,0,u["ɵnov"](n,102).hasErrors,u["ɵnov"](n,102).hasSuccess),l(n,116,0,u["ɵnov"](n,123).ngClassUntouched,u["ɵnov"](n,123).ngClassTouched,u["ɵnov"](n,123).ngClassPristine,u["ɵnov"](n,123).ngClassDirty,u["ɵnov"](n,123).ngClassValid,u["ɵnov"](n,123).ngClassInvalid,u["ɵnov"](n,123).ngClassPending,u["ɵnov"](n,124).validClass,u["ɵnov"](n,124).invalidClass),l(n,127,0,e.isErasure||-1===e.data.applications.selected.indexOf("rbd"));var a=u["ɵunv"](n,134,0,l(n,135,0,u["ɵnov"](n.parent,0),e.action)),o=u["ɵunv"](n,134,1,l(n,136,0,u["ɵnov"](n.parent,1),e.resource));l(n,134,0,a,o)}))}function Ni(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),u["ɵqud"](671088640,1,{crushInfoTabs:0}),u["ɵqud"](671088640,2,{crushDeletionBtn:0}),u["ɵqud"](671088640,3,{ecpInfoTabs:0}),u["ɵqud"](671088640,4,{ecpDeletionBtn:0}),(l()(),u["ɵand"](16777216,null,null,1,null,Cu)),u["ɵdid"](7,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](8,0,null,null,2,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,Ei)),u["ɵdid"](10,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,7,0,!(e.info&&e.ecProfiles)),l(n,10,0,e.info&&e.ecProfiles)}),null)}function Vi(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-pool-form",[],null,null,null,Ni,bu)),u["ɵdid"](1,114688,null,0,k,[I.a,ce.a,ce.m,Al.b,m.a,E.a,N.a,Al.b,V.a,c,d,s.a,i.b],null,null)],(function(l,n){l(n,1,0)}),null)}var yi=u["ɵccf"]("cd-pool-form",k,Vi,{},{},[]);e.d(n,"PoolModuleNgFactory",(function(){return wi})),e.d(n,"RoutedPoolModuleNgFactory",(function(){return Ti}));var wi=u["ɵcmf"]($,[],(function(l){return u["ɵmod"]([u["ɵmpd"](512,u.ComponentFactoryResolver,u["ɵCodegenComponentFactoryResolver"],[[8,[Z.a,H.a,X.a,Y.a,Q.a,Q.b,ll.a,nl.a,el.a,ul.a,il.a,tl.a,al.a,ol.a,sl.a,rl.a,dl.a,cl.a,cl.c,cl.b,cl.d,ml.a,fl.a,gl.a,pl.a,hl.a,vl.a,bl.a,Cl.a,Rl.a,Il.a,Hl,An]],[3,u.ComponentFactoryResolver],u.NgModuleRef]),u["ɵmpd"](4608,El.NgLocalization,El.NgLocaleLocalization,[u.LOCALE_ID,[2,El["ɵangular_packages_common_common_a"]]]),u["ɵmpd"](4608,Bn.y,Bn.y,[El.DOCUMENT]),u["ɵmpd"](4608,Bn.r,Bn.r,[]),u["ɵmpd"](4608,Bn.a,Bn.a,[]),u["ɵmpd"](4608,t.D,t.D,[]),u["ɵmpd"](4608,On.a,On.a,[]),u["ɵmpd"](4608,zn.a,zn.a,[]),u["ɵmpd"](4608,Ln.a,Ln.a,[s.a]),u["ɵmpd"](4608,El.DatePipe,El.DatePipe,[u.LOCALE_ID]),u["ɵmpd"](4608,jn.a,jn.a,[]),u["ɵmpd"](4608,Un.a,Un.a,[]),u["ɵmpd"](4608,N.a,N.a,[]),u["ɵmpd"](4608,I.a,I.a,[N.a]),u["ɵmpd"](4608,Mn.a,Mn.a,[N.a]),u["ɵmpd"](4608,O.a,O.a,[N.a]),u["ɵmpd"](4608,Gn.a,Gn.a,[]),u["ɵmpd"](4608,$n.a,$n.a,[]),u["ɵmpd"](4608,Kn.a,Kn.a,[]),u["ɵmpd"](4608,Jn.a,Jn.a,[]),u["ɵmpd"](4608,Wn.a,Wn.a,[El.DatePipe]),u["ɵmpd"](4608,Zn.a,Zn.a,[]),u["ɵmpd"](4608,Hn.a,Hn.a,[]),u["ɵmpd"](4608,Xn.a,Xn.a,[]),u["ɵmpd"](4608,Yn.a,Yn.a,[]),u["ɵmpd"](4608,Qn.a,Qn.a,[]),u["ɵmpd"](4608,le.a,le.a,[s.a]),u["ɵmpd"](4608,Nl.a,Nl.a,[]),u["ɵmpd"](4608,ne.a,ne.a,[]),u["ɵmpd"](4608,ee.a,ee.a,[]),u["ɵmpd"](4608,t.h,t.h,[]),u["ɵmpd"](4608,ue.b,ue.b,[]),u["ɵmpd"](4608,ie.a,ie.a,[]),u["ɵmpd"](4608,te.a,te.a,[u.NgZone,u.RendererFactory2,u.PLATFORM_ID]),u["ɵmpd"](4608,ae.a,ae.a,[u.ComponentFactoryResolver,u.NgZone,u.Injector,te.a,u.ApplicationRef]),u["ɵmpd"](4608,oe.c,oe.c,[]),u["ɵmpd"](4608,se.a,se.a,[]),u["ɵmpd"](4608,Al.b,Al.b,[u.RendererFactory2,ae.a]),u["ɵmpd"](4608,re.f,re.f,[]),u["ɵmpd"](4608,E.a,E.a,[]),u["ɵmpd"](4608,de.a,de.a,[ce.m,E.a]),u["ɵmpd"](4608,me.f,me.f,[]),u["ɵmpd"](4608,fe.t,fe.t,[]),u["ɵmpd"](4608,fe.v,fe.v,[]),u["ɵmpd"](4608,fe.a,fe.a,[]),u["ɵmpd"](4608,fe.h,fe.h,[]),u["ɵmpd"](4608,fe.d,fe.d,[]),u["ɵmpd"](4608,fe.j,fe.j,[]),u["ɵmpd"](4608,fe.l,fe.l,[]),u["ɵmpd"](4608,fe.u,fe.u,[fe.v,fe.l]),u["ɵmpd"](4608,ge.a,ge.a,[]),u["ɵmpd"](1073742336,El.CommonModule,El.CommonModule,[]),u["ɵmpd"](1073742336,Bn.u,Bn.u,[]),u["ɵmpd"](1073742336,t.C,t.C,[]),u["ɵmpd"](1073742336,t.n,t.n,[]),u["ɵmpd"](1073742336,re.e,re.e,[]),u["ɵmpd"](1073742336,pe.a,pe.a,[]),u["ɵmpd"](1073742336,t.y,t.y,[]),u["ɵmpd"](1073742336,ue.c,ue.c,[]),u["ɵmpd"](1073742336,ie.d,ie.d,[]),u["ɵmpd"](1073742336,oe.d,oe.d,[]),u["ɵmpd"](1073742336,se.d,se.d,[]),u["ɵmpd"](1073742336,he.b,he.b,[]),u["ɵmpd"](1073742336,Al.e,Al.e,[]),u["ɵmpd"](1073742336,ve.a,ve.a,[]),u["ɵmpd"](1073742336,yl.f,yl.f,[]),u["ɵmpd"](1073742336,be.ClickOutsideModule,be.ClickOutsideModule,[]),u["ɵmpd"](1073742336,Ce.b,Ce.b,[]),u["ɵmpd"](1073742336,ce.q,ce.q,[[2,ce.v],[2,ce.m]]),u["ɵmpd"](1073742336,Re.a,Re.a,[]),u["ɵmpd"](1073742336,Ie.a,Ie.a,[]),u["ɵmpd"](1073742336,r.a,r.a,[]),u["ɵmpd"](1073742336,Ee.a,Ee.a,[]),u["ɵmpd"](1073742336,me.d,me.d,[]),u["ɵmpd"](1073742336,Ne.a,Ne.a,[]),u["ɵmpd"](1073742336,Ve.a,Ve.a,[]),u["ɵmpd"](1073742336,ye.a,ye.a,[]),u["ɵmpd"](1073742336,fe.g,fe.g,[]),u["ɵmpd"](1073742336,we.b,we.b,[]),u["ɵmpd"](1073742336,Te.a,Te.a,[]),u["ɵmpd"](1073742336,$,$,[]),u["ɵmpd"](256,u.LOCALE_ID,"en-US",[]),u["ɵmpd"](256,re.a,{autoClose:!0,insideClick:!1},[]),u["ɵmpd"](256,u.TRANSLATIONS_FORMAT,"xlf",[])])})),Ti=u["ɵcmf"](W,[],(function(l){return u["ɵmod"]([u["ɵmpd"](512,u.ComponentFactoryResolver,u["ɵCodegenComponentFactoryResolver"],[[8,[Z.a,H.a,X.a,Y.a,Q.a,Q.b,ll.a,nl.a,el.a,ul.a,il.a,tl.a,al.a,ol.a,sl.a,rl.a,dl.a,cl.a,cl.c,cl.b,cl.d,ml.a,fl.a,gl.a,pl.a,hl.a,vl.a,bl.a,Cl.a,Rl.a,Il.a,Hl,An,ou,yi]],[3,u.ComponentFactoryResolver],u.NgModuleRef]),u["ɵmpd"](4608,El.NgLocalization,El.NgLocaleLocalization,[u.LOCALE_ID,[2,El["ɵangular_packages_common_common_a"]]]),u["ɵmpd"](4608,Bn.y,Bn.y,[El.DOCUMENT]),u["ɵmpd"](4608,Bn.r,Bn.r,[]),u["ɵmpd"](4608,Bn.a,Bn.a,[]),u["ɵmpd"](4608,t.D,t.D,[]),u["ɵmpd"](4608,On.a,On.a,[]),u["ɵmpd"](4608,zn.a,zn.a,[]),u["ɵmpd"](4608,Ln.a,Ln.a,[s.a]),u["ɵmpd"](4608,El.DatePipe,El.DatePipe,[u.LOCALE_ID]),u["ɵmpd"](4608,jn.a,jn.a,[]),u["ɵmpd"](4608,Un.a,Un.a,[]),u["ɵmpd"](4608,N.a,N.a,[]),u["ɵmpd"](4608,I.a,I.a,[N.a]),u["ɵmpd"](4608,Mn.a,Mn.a,[N.a]),u["ɵmpd"](4608,O.a,O.a,[N.a]),u["ɵmpd"](4608,Gn.a,Gn.a,[]),u["ɵmpd"](4608,$n.a,$n.a,[]),u["ɵmpd"](4608,Kn.a,Kn.a,[]),u["ɵmpd"](4608,Jn.a,Jn.a,[]),u["ɵmpd"](4608,Wn.a,Wn.a,[El.DatePipe]),u["ɵmpd"](4608,Zn.a,Zn.a,[]),u["ɵmpd"](4608,Hn.a,Hn.a,[]),u["ɵmpd"](4608,Xn.a,Xn.a,[]),u["ɵmpd"](4608,Yn.a,Yn.a,[]),u["ɵmpd"](4608,Qn.a,Qn.a,[]),u["ɵmpd"](4608,le.a,le.a,[s.a]),u["ɵmpd"](4608,Nl.a,Nl.a,[]),u["ɵmpd"](4608,ne.a,ne.a,[]),u["ɵmpd"](4608,ee.a,ee.a,[]),u["ɵmpd"](4608,t.h,t.h,[]),u["ɵmpd"](4608,ue.b,ue.b,[]),u["ɵmpd"](4608,ie.a,ie.a,[]),u["ɵmpd"](4608,te.a,te.a,[u.NgZone,u.RendererFactory2,u.PLATFORM_ID]),u["ɵmpd"](4608,ae.a,ae.a,[u.ComponentFactoryResolver,u.NgZone,u.Injector,te.a,u.ApplicationRef]),u["ɵmpd"](4608,oe.c,oe.c,[]),u["ɵmpd"](4608,se.a,se.a,[]),u["ɵmpd"](4608,Al.b,Al.b,[u.RendererFactory2,ae.a]),u["ɵmpd"](4608,re.f,re.f,[]),u["ɵmpd"](4608,E.a,E.a,[]),u["ɵmpd"](4608,de.a,de.a,[ce.m,E.a]),u["ɵmpd"](4608,me.f,me.f,[]),u["ɵmpd"](4608,fe.t,fe.t,[]),u["ɵmpd"](4608,fe.v,fe.v,[]),u["ɵmpd"](4608,fe.a,fe.a,[]),u["ɵmpd"](4608,fe.h,fe.h,[]),u["ɵmpd"](4608,fe.d,fe.d,[]),u["ɵmpd"](4608,fe.j,fe.j,[]),u["ɵmpd"](4608,fe.l,fe.l,[]),u["ɵmpd"](4608,fe.u,fe.u,[fe.v,fe.l]),u["ɵmpd"](4608,ge.a,ge.a,[]),u["ɵmpd"](1073742336,El.CommonModule,El.CommonModule,[]),u["ɵmpd"](1073742336,Bn.u,Bn.u,[]),u["ɵmpd"](1073742336,t.C,t.C,[]),u["ɵmpd"](1073742336,t.n,t.n,[]),u["ɵmpd"](1073742336,re.e,re.e,[]),u["ɵmpd"](1073742336,pe.a,pe.a,[]),u["ɵmpd"](1073742336,t.y,t.y,[]),u["ɵmpd"](1073742336,ue.c,ue.c,[]),u["ɵmpd"](1073742336,ie.d,ie.d,[]),u["ɵmpd"](1073742336,oe.d,oe.d,[]),u["ɵmpd"](1073742336,se.d,se.d,[]),u["ɵmpd"](1073742336,he.b,he.b,[]),u["ɵmpd"](1073742336,Al.e,Al.e,[]),u["ɵmpd"](1073742336,ve.a,ve.a,[]),u["ɵmpd"](1073742336,yl.f,yl.f,[]),u["ɵmpd"](1073742336,be.ClickOutsideModule,be.ClickOutsideModule,[]),u["ɵmpd"](1073742336,Ce.b,Ce.b,[]),u["ɵmpd"](1073742336,ce.q,ce.q,[[2,ce.v],[2,ce.m]]),u["ɵmpd"](1073742336,Re.a,Re.a,[]),u["ɵmpd"](1073742336,Ie.a,Ie.a,[]),u["ɵmpd"](1073742336,r.a,r.a,[]),u["ɵmpd"](1073742336,Ee.a,Ee.a,[]),u["ɵmpd"](1073742336,me.d,me.d,[]),u["ɵmpd"](1073742336,Ne.a,Ne.a,[]),u["ɵmpd"](1073742336,Ve.a,Ve.a,[]),u["ɵmpd"](1073742336,ye.a,ye.a,[]),u["ɵmpd"](1073742336,fe.g,fe.g,[]),u["ɵmpd"](1073742336,we.b,we.b,[]),u["ɵmpd"](1073742336,Te.a,Te.a,[]),u["ɵmpd"](1073742336,$,$,[]),u["ɵmpd"](1073742336,W,W,[]),u["ɵmpd"](256,u.LOCALE_ID,"en-US",[]),u["ɵmpd"](256,re.a,{autoClose:!0,insideClick:!1},[]),u["ɵmpd"](1024,ce.k,(function(){return[[{path:"",component:G},{path:"create",component:k,data:K},{path:"edit/:name",component:k,data:J}]]}),[]),u["ɵmpd"](256,u.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/6.bbb14e8467017ca13aa5.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/6.bbb14e8467017ca13aa5.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/6.bbb14e8467017ca13aa5.js 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/6.bbb14e8467017ca13aa5.js 2021-04-19 13:53:42.000000000 +0000 @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{nOaW:function(l,n,e){"use strict";e.r(n);var u=e("8Y7J"),t=e("sne2"),i=e("s7LF"),a=e("LvDl"),o=e("IheW"),s=e("GiVz"),r=e("pL04");let d=(()=>{class l{constructor(l,n){this.http=l,this.i18n=n,this.apiPath="api/crush_rule",this.formTooltips={root:this.i18n("The name of the node under which data should be placed."),failure_domain:this.i18n("The type of CRUSH nodes across which we should separate replicas."),device_class:this.i18n("The device class data should be placed on.")}}create(l){return this.http.post(this.apiPath,l,{observe:"response"})}delete(l){return this.http.delete(`${this.apiPath}/${l}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return l.ngInjectableDef=u["ɵɵdefineInjectable"]({factory:function(){return new l(u["ɵɵinject"](o.c),u["ɵɵinject"](s.a))},token:l,providedIn:r.a}),l})(),c=(()=>{class l{constructor(l,n){this.http=l,this.i18n=n,this.apiPath="api/erasure_code_profile",this.formTooltips={k:this.i18n("Each object is split in data-chunks parts, each stored on a different OSD."),m:this.i18n("Compute coding chunks for each object and store them on different OSDs.\n The number of coding chunks is also the number of OSDs that can be down without losing data."),plugins:{jerasure:{description:this.i18n("The jerasure plugin is the most generic and flexible plugin,\n it is also the default for Ceph erasure coded pools."),technique:this.i18n("The more flexible technique is reed_sol_van : it is enough to set k\n and m. The cauchy_good technique can be faster but you need to chose the packetsize\n carefully. All of reed_sol_r6_op, liberation, blaum_roth, liber8tion are RAID6 equivalents\n in the sense that they can only be configured with m=2."),packetSize:this.i18n("The encoding will be done on packets of bytes size at a time.\n Choosing the right packet size is difficult.\n The jerasure documentation contains extensive information on this topic.")},lrc:{description:this.i18n("With the jerasure plugin, when an erasure coded object is stored on\n multiple OSDs, recovering from the loss of one OSD requires reading from all the others.\n For instance if jerasure is configured with k=8 and m=4, losing one OSD requires reading\n from the eleven others to repair.\n\n The lrc erasure code plugin creates local parity chunks to be able to recover using\n less OSDs. For instance if lrc is configured with k=8, m=4 and l=4, it will create\n an additional parity chunk for every four OSDs. When a single OSD is lost, it can be\n recovered with only four OSDs instead of eleven."),l:this.i18n("Group the coding and data chunks into sets of size locality. For instance,\n for k=4 and m=2, when locality=3 two groups of three are created. Each set can\n be recovered without reading chunks from another set."),crushLocality:this.i18n("The type of the crush bucket in which each set of chunks defined\n by l will be stored. For instance, if it is set to rack, each group of l chunks will be\n placed in a different rack. It is used to create a CRUSH rule step such as step choose\n rack. If it is not set, no such grouping is done.")},isa:{description:this.i18n("The isa plugin encapsulates the ISA library. It only runs on Intel processors."),technique:this.i18n("The ISA plugin comes in two Reed Solomon forms.\n If reed_sol_van is set, it is Vandermonde, if cauchy is set, it is Cauchy.")},shec:{description:this.i18n("The shec plugin encapsulates the multiple SHEC library.\n It allows ceph to recover data more efficiently than Reed Solomon codes."),c:this.i18n("The number of parity chunks each of which includes each data chunk in its\n calculation range. The number is used as a durability estimator. For instance, if c=2,\n 2 OSDs can be down without losing data.")},clay:{description:this.i18n("CLAY (short for coupled-layer) codes are erasure codes designed to\n bring about significant savings in terms of network bandwidth and disk IO when a failed\n node/OSD/rack is being repaired."),d:this.i18n("Number of OSDs requested to send data during recovery of a single chunk.\n d needs to be chosen such that k+1 <= d <= k+m-1. The larger the d, the better\n the savings."),scalar_mds:this.i18n("scalar_mds specifies the plugin that is used as a building block\n in the layered construction. It can be one of jerasure, isa, shec."),technique:this.i18n("technique specifies the technique that will be picked\n within the 'scalar_mds' plugin specified. Supported techniques\n are 'reed_sol_van', 'reed_sol_r6_op', 'cauchy_orig',\n 'cauchy_good', 'liber8tion' for jerasure, 'reed_sol_van',\n 'cauchy' for isa and 'single', 'multiple' for shec.")}},crushRoot:this.i18n("The name of the crush bucket used for the first step of the CRUSH rule.\n For instance step take default."),crushFailureDomain:this.i18n("Ensure that no two chunks are in a bucket with the same failure\n domain. For instance, if the failure domain is host no two chunks will be stored on the same\n host. It is used to create a CRUSH rule step such as step chooseleaf host."),crushDeviceClass:this.i18n("Restrict placement to devices of a specific class\n (e.g., ssd or hdd), using the crush device class names in the CRUSH map."),directory:this.i18n("Set the directory name from which the erasure code plugin is loaded.")}}list(){return this.http.get(this.apiPath)}create(l){return this.http.post(this.apiPath,l,{observe:"response"})}delete(l){return this.http.delete(`${this.apiPath}/${l}`,{observe:"response"})}getInfo(){return this.http.get(`ui-${this.apiPath}/info`)}}return l.ngInjectableDef=u["ɵɵdefineInjectable"]({factory:function(){return new l(u["ɵɵinject"](o.c),u["ɵɵinject"](s.a))},token:l,providedIn:r.a}),l})();var m=e("Ekvf");class f{constructor(){this.nodes=[],this.idTree={},this.allDevices=[],this.buckets=[],this.failureDomains={},this.failureDomainKeys=[],this.devices=[],this.deviceCount=0}static searchFailureDomains(l,n){return this.getFailureDomains(this.search(l,n))}static search(l,n){const[e,u]=n.split("~"),t=l.find(l=>["name","id","type"].some(n=>l[n]===e));return t?(l=this.getSubNodes(t,this.createIdTreeFromNodes(l)),u&&(l=this.filterNodesByDeviceType(l,u)),l):[]}static createIdTreeFromNodes(l){const n={};return l.forEach(l=>{n[l.id]=l}),n}static getSubNodes(l,n){let e=[l];return l.children?(l.children.forEach(l=>{e=e.concat(this.getSubNodes(n[l],n))}),e):e}static filterNodesByDeviceType(l,n){let e,u=l.filter(l=>l.device_class&&l.device_class!==n).map(l=>l.id),t=u;do{e=!1,l=l.filter(l=>!u.includes(l.id));const n=[];l.forEach(l=>{l.children&&l.children.every(l=>u.includes(l))&&(n.push(l.id),e=!0)}),e&&(u=n,t=t.concat(n))}while(e);return(l=a.cloneDeep(l)).map(l=>l.children?(l.children=l.children.filter(l=>!t.includes(l)),l):l)}static getFailureDomains(l){const n={};return l.forEach(l=>{const e=l.type;n[e]||(n[e]=[]),n[e].push(l)}),n}initCrushNodeSelection(l,n,e,u){this.nodes=l,this.idTree=f.createIdTreeFromNodes(l),l.forEach(l=>{this.idTree[l.id]=l}),this.buckets=a.sortBy(l.filter(l=>l.children),"name"),this.controls={root:n,failure:e,device:u},this.preSelectRoot(),this.controls.root.valueChanges.subscribe(()=>this.onRootChange()),this.controls.failure.valueChanges.subscribe(()=>this.onFailureDomainChange()),this.controls.device.valueChanges.subscribe(()=>this.onDeviceChange())}preSelectRoot(){const l=this.nodes.find(l=>"root"===l.type);this.silentSet(this.controls.root,l),this.onRootChange()}silentSet(l,n){l.setValue(n,{emitEvent:!1})}onRootChange(){const l=f.getSubNodes(this.controls.root.value,this.idTree),n=f.getFailureDomains(l);Object.keys(n).forEach(l=>{n[l].length<=1&&delete n[l]}),this.failureDomains=n,this.failureDomainKeys=Object.keys(n).sort(),this.updateFailureDomain()}updateFailureDomain(){let l=this.getIncludedCustomValue(this.controls.failure,Object.keys(this.failureDomains));""===l&&(l=this.setMostCommonDomain(this.controls.failure)),this.updateDevices(l)}getIncludedCustomValue(l,n){return l.dirty&&n.includes(l.value)?l.value:""}setMostCommonDomain(l){let n={n:0,type:""};return Object.keys(this.failureDomains).forEach(l=>{const e=this.failureDomains[l].length;n.nf.getSubNodes(l,this.idTree)));this.allDevices=n.filter(l=>l.device_class).map(l=>l.device_class),this.devices=a.uniq(this.allDevices).sort();const e=1===this.devices.length?this.devices[0]:this.getIncludedCustomValue(this.controls.device,this.devices);this.silentSet(this.controls.device,e),this.onDeviceChange(e)}onDeviceChange(l=this.controls.device.value){this.deviceCount=""===l?this.allDevices.length:this.allDevices.filter(n=>n===l).length}}var g=e("0+/T"),p=e("a96k"),h=e("oxzT"),v=e("QFaf"),b=e("1Ni5"),C=e("PhyI"),R=e("kvvV"),I=e("Fgil"),E=e("aexS"),N=e("aXbf"),y=e("kn/O"),V=e("2EZI");class w extends f{constructor(l,n,e,t,i,a){super(),this.formBuilder=l,this.bsModalRef=n,this.taskWrapper=e,this.crushRuleService=t,this.i18n=i,this.actionLabels=a,this.submitAction=new u.EventEmitter,this.tooltips=this.crushRuleService.formTooltips,this.action=this.actionLabels.CREATE,this.resource=this.i18n("Crush Rule"),this.createForm()}createForm(){this.form=this.formBuilder.group({name:["",[i.B.required,i.B.pattern("[A-Za-z0-9_-]+"),b.a.custom("uniqueName",l=>this.names&&-1!==this.names.indexOf(l))]],root:null,failure_domain:"",device_class:""})}ngOnInit(){this.crushRuleService.getInfo().subscribe(({names:l,nodes:n})=>{this.initCrushNodeSelection(n,this.form.get("root"),this.form.get("failure_domain"),this.form.get("device_class")),this.names=l})}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l=a.cloneDeep(this.form.value);l.root=l.root.name,""===l.device_class&&delete l.device_class,this.taskWrapper.wrapTaskAroundCall({task:new R.a("crushRule/create",l),call:this.crushRuleService.create(l)}).subscribe(void 0,()=>{this.form.setErrors({cdSubmitButton:!0})},()=>{this.bsModalRef.hide(),this.submitAction.emit(l)})}}class T{}class _ extends f{constructor(l,n,e,t,i,a){super(),this.formBuilder=l,this.bsModalRef=n,this.taskWrapper=e,this.ecpService=t,this.i18n=i,this.actionLabels=a,this.submitAction=new u.EventEmitter,this.tooltips=this.ecpService.formTooltips,this.PLUGIN={LRC:"lrc",SHEC:"shec",CLAY:"clay",JERASURE:"jerasure",ISA:"isa"},this.plugin=this.PLUGIN.JERASURE,this.icons=h.a,this.action=this.actionLabels.CREATE,this.resource=this.i18n("EC Profile"),this.createForm(),this.setJerasureDefaults()}createForm(){this.form=this.formBuilder.group({name:[null,[i.B.required,i.B.pattern("[A-Za-z0-9_-]+"),b.a.custom("uniqueName",l=>this.names&&-1!==this.names.indexOf(l))]],plugin:[this.PLUGIN.JERASURE,[i.B.required]],k:[4,[i.B.required,i.B.min(2),b.a.custom("max",()=>this.baseValueValidation(!0)),b.a.custom("unequal",l=>this.lrcDataValidation(l)),b.a.custom("kLowerM",l=>this.shecDataValidation(l))]],m:[2,[i.B.required,i.B.min(1),b.a.custom("max",()=>this.baseValueValidation())]],crushFailureDomain:"",crushRoot:null,crushDeviceClass:"",directory:"",technique:"reed_sol_van",packetSize:[2048,[i.B.min(1)]],l:[3,[i.B.required,i.B.min(1),b.a.custom("unequal",l=>this.lrcLocalityValidation(l))]],crushLocality:"",c:[2,[i.B.required,i.B.min(1),b.a.custom("cGreaterM",l=>this.shecDurabilityValidation(l))]],d:[5,[i.B.required,b.a.custom("dMin",l=>this.dMinValidation(l)),b.a.custom("dMax",l=>this.dMaxValidation(l))]],scalar_mds:[this.PLUGIN.JERASURE,[i.B.required]]}),this.toggleDCalc(),this.form.get("k").valueChanges.subscribe(()=>this.updateValidityOnChange(["m","l","d"])),this.form.get("m").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","l","c","d"])),this.form.get("l").valueChanges.subscribe(()=>this.updateValidityOnChange(["k","m"])),this.form.get("plugin").valueChanges.subscribe(l=>this.onPluginChange(l)),this.form.get("scalar_mds").valueChanges.subscribe(()=>this.setClayDefaultsForScalar())}baseValueValidation(l=!1){return this.validValidation(()=>this.getKMSum()>this.deviceCount&&this.form.getValue("k")>this.form.getValue("m")===l)}validValidation(l,n){return!((!this.form||n)&&this.plugin!==n)&&l()}getKMSum(){return this.form.getValue("k")+this.form.getValue("m")}lrcDataValidation(l){return this.validValidation(()=>{const n=this.form.getValue("m"),e=this.form.getValue("l"),u=l+n;return this.lrcMultiK=l/(u/e),l%(u/e)!=0},"lrc")}shecDataValidation(l){return this.validValidation(()=>this.form.getValue("m")>l,"shec")}lrcLocalityValidation(l){return this.validValidation(()=>{const n=this.getKMSum();return this.lrcGroups=l>0?n/l:0,l>0&&n%l!=0},"lrc")}shecDurabilityValidation(l){return this.validValidation(()=>{const n=this.form.getValue("m");return l>n},"shec")}dMinValidation(l){return this.validValidation(()=>this.getDMin()>l,"clay")}getDMin(){return this.form.getValue("k")+1}dMaxValidation(l){return this.validValidation(()=>l>this.getDMax(),"clay")}getDMax(){const l=this.form.getValue("m");return this.form.getValue("k")+l-1}toggleDCalc(){this.dCalc=!this.dCalc,this.form.get("d")[this.dCalc?"disable":"enable"](),this.calculateD()}calculateD(){this.plugin===this.PLUGIN.CLAY&&this.dCalc&&this.form.silentSet("d",this.getDMax())}updateValidityOnChange(l){l.forEach(l=>{"d"===l&&this.calculateD(),this.form.get(l).updateValueAndValidity({emitEvent:!1})})}onPluginChange(l){this.plugin=l,l===this.PLUGIN.JERASURE?this.setJerasureDefaults():l===this.PLUGIN.LRC?this.setLrcDefaults():l===this.PLUGIN.ISA?this.setIsaDefaults():l===this.PLUGIN.SHEC?this.setShecDefaults():l===this.PLUGIN.CLAY&&this.setClayDefaults(),this.updateValidityOnChange(["m"])}setJerasureDefaults(){this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liberation","blaum_roth","liber8tion"],this.setDefaults({k:4,m:2,technique:"reed_sol_van"})}setLrcDefaults(){this.setDefaults({k:4,m:2,l:3})}setIsaDefaults(){this.techniques=["reed_sol_van","cauchy"],this.setDefaults({k:7,m:3,technique:"reed_sol_van"})}setShecDefaults(){this.setDefaults({k:4,m:3,c:2})}setClayDefaults(){this.setDefaults({k:4,m:2,scalar_mds:this.PLUGIN.JERASURE}),this.setClayDefaultsForScalar()}setClayDefaultsForScalar(){const l=this.form.getValue("scalar_mds");let n="reed_sol_van";l===this.PLUGIN.JERASURE?this.techniques=["reed_sol_van","reed_sol_r6_op","cauchy_orig","cauchy_good","liber8tion"]:l===this.PLUGIN.ISA?this.techniques=["reed_sol_van","cauchy"]:(n="single",this.techniques=["single","multiple"]),this.setDefaults({technique:n})}setDefaults(l){Object.keys(l).forEach(n=>{const e=this.form.get(n),u=e.value;e.pristine||"technique"===n&&!this.techniques.includes(u)||"k"===n&&[4,7].includes(u)||"m"===n&&[2,3].includes(u)?e.setValue(l[n]):e.updateValueAndValidity()})}ngOnInit(){this.ecpService.getInfo().subscribe(({plugins:l,names:n,directory:e,nodes:u})=>{this.initCrushNodeSelection(u,this.form.get("crushRoot"),this.form.get("crushFailureDomain"),this.form.get("crushDeviceClass")),this.plugins=l,this.names=n,this.form.silentSet("directory",e),this.preValidateNumericInputFields()})}preValidateNumericInputFields(){const l=["k","m","l","c","d"].map(l=>this.form.get(l));l.forEach(l=>{l.markAsTouched(),l.markAsDirty()}),l[1].updateValueAndValidity()}onSubmit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l=this.createJson();this.taskWrapper.wrapTaskAroundCall({task:new R.a("ecp/create",{name:l.name}),call:this.ecpService.create(l)}).subscribe(void 0,()=>{this.form.setErrors({cdSubmitButton:!0})},()=>{this.bsModalRef.hide(),this.submitAction.emit(l)})}createJson(){const l={technique:[this.PLUGIN.ISA,this.PLUGIN.JERASURE,this.PLUGIN.CLAY],packetSize:[this.PLUGIN.JERASURE],l:[this.PLUGIN.LRC],crushLocality:[this.PLUGIN.LRC],c:[this.PLUGIN.SHEC],d:[this.PLUGIN.CLAY],scalar_mds:[this.PLUGIN.CLAY]},n=new T,e=this.form.getValue("plugin");return Object.keys(this.form.controls).filter(n=>{const u=l[n],t=this.form.getValue(n);return(u&&u.includes(e)||!u)&&t&&""!==t}).forEach(l=>{this.extendJson(l,n)}),n}extendJson(l,n){const e=this.form.getValue(l);n[{crushFailureDomain:"crush-failure-domain",crushRoot:"crush-root",crushDeviceClass:"crush-device-class",packetSize:"packetsize",crushLocality:"crush-locality"}[l]||l]="crushRoot"===l?e.name:e}}var S=e("DNAf");class D{constructor(l){this.erasureInfo=!1,this.crushInfo=!1,this.pgs=1,this.poolTypes=["erasure","replicated"],this.applications={selected:[],default:["cephfs","rbd","rgw"],available:[],validators:[i.B.pattern("[A-Za-z0-9_]+"),i.B.maxLength(128)],messages:new S.a({empty:l("No applications added"),selectionLimit:{text:l("Applications limit reached"),tooltip:l("A pool can only have up to four applications definitions.")},customValidations:{pattern:l("Allowed characters '_a-zA-Z0-9'"),maxlength:l("Maximum length is 128 characters")},filter:l("Filter or add applications"),add:l("Add application")},l)}}}class k{constructor(l,n,e,i,a,o,s,r,d,c,m,f,g){this.dimlessBinaryPipe=l,this.route=n,this.router=e,this.modalService=i,this.poolService=a,this.authStorageService=o,this.formatter=s,this.bsModalService=r,this.taskWrapper=d,this.ecpService=c,this.crushRuleService=m,this.i18n=f,this.actionLabels=g,this.editing=!1,this.isReplicated=!1,this.isErasure=!1,this.data=new D(this.i18n),this.externalPgChange=!1,this.current={rules:[]},this.initializeConfigData=new u.EventEmitter,this.currentConfigurationValues={},this.icons=h.a,this.crushUsage=void 0,this.ecpUsage=void 0,this.editing=this.router.url.startsWith("/pool/"+t.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource=this.i18n("pool"),this.authenticate(),this.createForm()}authenticate(){this.permission=this.authStorageService.getPermissions().pool,(!this.permission.read||!this.permission.update&&this.editing||!this.permission.create&&!this.editing)&&this.router.navigate(["/404"])}createForm(){const l=new v.a({mode:new i.i("none"),algorithm:new i.i(""),minBlobSize:new i.i("",{updateOn:"blur"}),maxBlobSize:new i.i("",{updateOn:"blur"}),ratio:new i.i("",{updateOn:"blur"})});this.form=new v.a({name:new i.i("",{validators:[i.B.pattern(/^[.A-Za-z0-9_/-]+$/),i.B.required,b.a.custom("rbdPool",()=>this.form&&this.form.getValue("name").includes("/")&&this.data&&-1!==this.data.applications.selected.indexOf("rbd"))]}),poolType:new i.i("",{validators:[i.B.required]}),crushRule:new i.i(null,{validators:[b.a.custom("tooFewOsds",l=>this.info&&l&&this.info.osd_countthis.isReplicated&&this.info.crush_rules_replicated.length>0&&!l)]}),size:new i.i("",{updateOn:"blur"}),erasureProfile:new i.i(null),pgNum:new i.i("",{validators:[i.B.required,i.B.min(1)]}),pgAutoscaleMode:new i.i(null),ecOverwrites:new i.i(!1),compression:l,max_bytes:new i.i(""),max_objects:new i.i(0,{validators:[i.B.min(0)]})},[b.a.custom("form",()=>null)])}ngOnInit(){this.poolService.getInfo().subscribe(l=>{this.initInfo(l),this.editing?this.initEditMode():this.setAvailableApps(),this.listenToChanges(),this.setComplexValidators()})}initInfo(l){this.pgAutoscaleModes=l.pg_autoscale_modes,this.form.silentSet("pgAutoscaleMode",l.pg_autoscale_default_mode),this.form.silentSet("algorithm",l.bluestore_compression_algorithm),this.info=l,this.initEcp(l.erasure_code_profiles)}initEcp(l){this.setListControlStatus("erasureProfile",l),this.ecProfiles=l}setListControlStatus(l,n){const e=this.form.get(l),u=e.value;1!==n.length||u&&a.isEqual(u,n[0])?0===n.length&&u&&e.setValue(null):e.setValue(n[0]),n.length<=1?e.enabled&&e.disable():e.disabled&&e.enable()}initEditMode(){this.disableForEdit(),this.routeParamsSubscribe=this.route.params.subscribe(l=>this.poolService.get(l.name).subscribe(l=>{this.data.pool=l,this.initEditFormData(l)}))}disableForEdit(){["poolType","crushRule","size","erasureProfile","ecOverwrites"].forEach(l=>this.form.get(l).disable())}initEditFormData(l){this.initializeConfigData.emit({initialData:l.configuration,sourceType:C.a.pool}),this.poolTypeChange(l.type);const n=this.info.crush_rules_replicated.concat(this.info.crush_rules_erasure),e={name:l.pool_name,poolType:l.type,crushRule:n.find(n=>n.rule_name===l.crush_rule),size:l.size,erasureProfile:this.ecProfiles.find(n=>n.name===l.erasure_code_profile),pgAutoscaleMode:l.pg_autoscale_mode,pgNum:l.pg_num,ecOverwrites:l.flags_names.includes("ec_overwrites"),mode:l.options.compression_mode,algorithm:l.options.compression_algorithm,minBlobSize:this.dimlessBinaryPipe.transform(l.options.compression_min_blob_size),maxBlobSize:this.dimlessBinaryPipe.transform(l.options.compression_max_blob_size),ratio:l.options.compression_required_ratio,max_bytes:this.dimlessBinaryPipe.transform(l.quota_max_bytes),max_objects:l.quota_max_objects};Object.keys(e).forEach(l=>{const n=e[l];a.isUndefined(n)||""===n||this.form.silentSet(l,n)}),this.data.pgs=this.form.getValue("pgNum"),this.setAvailableApps(this.data.applications.default.concat(l.application_metadata)),this.data.applications.selected=l.application_metadata}setAvailableApps(l=this.data.applications.default){this.data.applications.available=a.uniq(l.sort()).map(l=>new p.a(!1,l,""))}listenToChanges(){this.listenToChangesDuringAddEdit(),this.editing||this.listenToChangesDuringAdd()}listenToChangesDuringAddEdit(){this.form.get("pgNum").valueChanges.subscribe(l=>{const n=l-this.data.pgs;1===Math.abs(n)&&2!==l?this.doPgPowerJump(n):this.data.pgs=l})}doPgPowerJump(l){const n=this.calculatePgPower()+l;this.setPgs(-1===l?Math.round(n):Math.floor(n))}calculatePgPower(l=this.form.getValue("pgNum")){return Math.log(l)/Math.log(2)}setPgs(l){const n=Math.pow(2,l<0?0:l);this.data.pgs=n,this.form.silentSet("pgNum",n)}listenToChangesDuringAdd(){this.form.get("poolType").valueChanges.subscribe(l=>{this.poolTypeChange(l)}),this.form.get("crushRule").valueChanges.subscribe(l=>{this.crushDeletionBtn&&this.crushDeletionBtn.isOpen&&this.crushDeletionBtn.hide(),l&&(this.setCorrectMaxSize(l),this.crushRuleIsUsedBy(l.rule_name),this.replicatedRuleChange(),this.pgCalc())}),this.form.get("size").valueChanges.subscribe(()=>{this.pgCalc()}),this.form.get("erasureProfile").valueChanges.subscribe(l=>{this.ecpDeletionBtn&&this.ecpDeletionBtn.isOpen&&this.ecpDeletionBtn.hide(),l&&(this.ecpIsUsedBy(l.name),this.pgCalc())}),this.form.get("mode").valueChanges.subscribe(()=>{["minBlobSize","maxBlobSize","ratio"].forEach(l=>{this.form.get(l).updateValueAndValidity({emitEvent:!1})})}),this.form.get("minBlobSize").valueChanges.subscribe(()=>{this.form.get("maxBlobSize").updateValueAndValidity({emitEvent:!1})}),this.form.get("maxBlobSize").valueChanges.subscribe(()=>{this.form.get("minBlobSize").updateValueAndValidity({emitEvent:!1})})}poolTypeChange(l){if("replicated"===l?this.setTypeBooleans(!0,!1):this.setTypeBooleans(!1,"erasure"===l),!l||!this.info)return void(this.current.rules=[]);const n=this.info["crush_rules_"+l]||[];this.current.rules=n,this.editing||(this.isReplicated&&this.setListControlStatus("crushRule",n),this.replicatedRuleChange(),this.pgCalc())}setTypeBooleans(l,n){this.isReplicated=l,this.isErasure=n}replicatedRuleChange(){if(!this.isReplicated)return;const l=this.form.get("size");let n=this.form.getValue("size")||3;const e=this.getMinSize(),u=this.getMaxSize();nu&&(n=u),n!==l.value&&this.form.silentSet("size",n)}getMinSize(){if(!this.info||this.info.osd_count<1)return 0;const l=this.form.getValue("crushRule");return l?l.min_size:1}getMaxSize(){const l=this.form.getValue("crushRule");return this.info?l?l.usable_size:Math.min(this.info.osd_count,3):0}pgCalc(){const l=this.form.getValue("poolType");if(!this.info||this.form.get("pgNum").dirty||!l)return;const n=100*this.info.osd_count,e=this.isReplicated?this.replicatedPgCalc(n):this.erasurePgCalc(n);if(!e)return;const u=this.data.pgs;this.alignPgs(e),this.externalPgChange||(this.externalPgChange=u!==this.data.pgs)}setCorrectMaxSize(l=this.form.getValue("crushRule")){if(!l)return;const n=f.searchFailureDomains(this.info.nodes,l.steps[0].item_name)[l.steps[1].type];l.usable_size=Math.min(n?n.length:l.max_size,l.max_size)}replicatedPgCalc(l){const n=this.form.get("size"),e=n.value;return n.valid&&e>0?l/e:0}erasurePgCalc(l){const n=this.form.get("erasureProfile"),e=n.value;return(n.valid||n.disabled)&&e?l/(e.k+e.m):0}alignPgs(l=this.form.getValue("pgNum")){this.setPgs(Math.round(this.calculatePgPower(l<1?1:l)))}setComplexValidators(){this.editing?this.form.get("name").setValidators([this.form.get("name").validator,b.a.custom("uniqueName",l=>this.data.pool&&this.info&&-1!==this.info.pool_names.indexOf(l)&&this.info.pool_names.indexOf(l)!==this.info.pool_names.indexOf(this.data.pool.pool_name))]):(b.a.validateIf(this.form.get("size"),()=>this.isReplicated,[b.a.custom("min",l=>this.form.getValue("size")&&lthis.form.getValue("size")&&this.getMaxSize()this.info&&-1!==this.info.pool_names.indexOf(l))])),this.setCompressionValidators()}setCompressionValidators(){b.a.validateIf(this.form.get("minBlobSize"),()=>this.hasCompressionEnabled(),[i.B.min(0),b.a.custom("maximum",l=>this.oddBlobSize(l,this.form.getValue("maxBlobSize")))]),b.a.validateIf(this.form.get("maxBlobSize"),()=>this.hasCompressionEnabled(),[i.B.min(0),b.a.custom("minimum",l=>this.oddBlobSize(this.form.getValue("minBlobSize"),l))]),b.a.validateIf(this.form.get("ratio"),()=>this.hasCompressionEnabled(),[i.B.min(0),i.B.max(1)])}oddBlobSize(l,n){const e=this.formatter.toBytes(l),u=this.formatter.toBytes(n);return Boolean(e&&u&&e>=u)}hasCompressionEnabled(){return this.form.getValue("mode")&&"none"!==this.form.get("mode").value.toLowerCase()}describeCrushStep(l){return[l.op.replace("_"," "),l.item_name||"",l.type?l.num+" type "+l.type:""].join(" ")}addErasureCodeProfile(){this.addModal(_,l=>this.reloadECPs(l))}addModal(l,n){this.hideOpenTooltips(),this.bsModalService.show(l).content.submitAction.subscribe(l=>{n(l.name)})}hideOpenTooltips(){const l=l=>l&&l.isOpen&&l.hide();l(this.ecpDeletionBtn),l(this.crushDeletionBtn)}reloadECPs(l){this.reloadList({newItemName:l,getInfo:()=>this.ecpService.list(),initInfo:l=>this.initEcp(l),findNewItem:()=>this.ecProfiles.find(n=>n.name===l),controlName:"erasureProfile"})}reloadList({newItemName:l,getInfo:n,initInfo:e,findNewItem:u,controlName:t}){this.modalSubscription&&this.modalSubscription.unsubscribe(),n().subscribe(n=>{if(e(n),!l)return;const i=u();i&&this.form.get(t).setValue(i)})}deleteErasureCodeProfile(){this.deletionModal({value:this.form.getValue("erasureProfile"),usage:this.ecpUsage,deletionBtn:this.ecpDeletionBtn,dataName:"erasureInfo",getTabs:()=>this.ecpInfoTabs,tabPosition:1,nameAttribute:"name",itemDescription:this.i18n("erasure code profile"),reloadFn:()=>this.reloadECPs(),deleteFn:l=>this.ecpService.delete(l),taskName:"ecp/delete"})}deletionModal({value:l,usage:n,deletionBtn:e,dataName:u,getTabs:t,tabPosition:i,nameAttribute:a,itemDescription:o,reloadFn:s,deleteFn:r,taskName:d}){if(!l)return;if(n)return e.toggle(),this.data[u]=!0,void setTimeout(()=>{const l=t();l&&(l.tabs[i].active=!0)},50);const c=l[a];this.modalService.show(g.a,{initialState:{itemDescription:o,itemNames:[c],submitActionObservable:()=>{const l=r(c);return l.subscribe(()=>s()),this.taskWrapper.wrapTaskAroundCall({task:new R.a(d,{name:c}),call:l})}}})}addCrushRule(){this.addModal(w,l=>this.reloadCrushRules(l))}reloadCrushRules(l){this.reloadList({newItemName:l,getInfo:()=>this.poolService.getInfo(),initInfo:l=>{this.initInfo(l),this.poolTypeChange("replicated")},findNewItem:()=>this.info.crush_rules_replicated.find(n=>n.rule_name===l),controlName:"crushRule"})}deleteCrushRule(){this.deletionModal({value:this.form.getValue("crushRule"),usage:this.crushUsage,deletionBtn:this.crushDeletionBtn,dataName:"crushInfo",getTabs:()=>this.crushInfoTabs,tabPosition:2,nameAttribute:"rule_name",itemDescription:this.i18n("crush rule"),reloadFn:()=>this.reloadCrushRules(),deleteFn:l=>this.crushRuleService.delete(l),taskName:"crushRule/delete"})}crushRuleIsUsedBy(l){this.crushUsage=l?this.info.used_rules[l]:void 0}ecpIsUsedBy(l){this.ecpUsage=l?this.info.used_profiles[l]:void 0}submit(){if(this.form.invalid)return void this.form.setErrors({cdSubmitButton:!0});const l={pool:this.form.getValue("name")};this.assignFormFields(l,[{externalFieldName:"pool_type",formControlName:"poolType"},{externalFieldName:"pg_autoscale_mode",formControlName:"pgAutoscaleMode",editable:!0},{externalFieldName:"pg_num",formControlName:"pgNum",replaceFn:l=>"on"===this.form.getValue("pgAutoscaleMode")?1:l,editable:!0},this.isReplicated?{externalFieldName:"size",formControlName:"size"}:{externalFieldName:"erasure_code_profile",formControlName:"erasureProfile",attr:"name"},{externalFieldName:"rule_name",formControlName:"crushRule",replaceFn:l=>this.isReplicated?l&&l.rule_name:void 0},{externalFieldName:"quota_max_bytes",formControlName:"max_bytes",replaceFn:this.formatter.toBytes,editable:!0,resetValue:this.editing?0:void 0},{externalFieldName:"quota_max_objects",formControlName:"max_objects",editable:!0,resetValue:this.editing?0:void 0}]),this.info.is_all_bluestore&&(this.assignFormField(l,{externalFieldName:"flags",formControlName:"ecOverwrites",replaceFn:()=>this.isErasure?["ec_overwrites"]:void 0}),"none"!==this.form.getValue("mode")?this.assignFormFields(l,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:l=>this.hasCompressionEnabled()&&l},{externalFieldName:"compression_algorithm",formControlName:"algorithm",editable:!0},{externalFieldName:"compression_min_blob_size",formControlName:"minBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_max_blob_size",formControlName:"maxBlobSize",replaceFn:this.formatter.toBytes,editable:!0,resetValue:0},{externalFieldName:"compression_required_ratio",formControlName:"ratio",editable:!0,resetValue:0}]):this.editing&&this.assignFormFields(l,[{externalFieldName:"compression_mode",formControlName:"mode",editable:!0,replaceFn:()=>"unset"},{externalFieldName:"srcpool",formControlName:"name",editable:!0,replaceFn:()=>this.data.pool.pool_name}]));const n=this.data.applications.selected;(n.length>0||this.editing)&&(l.application_metadata=n),this.isReplicated&&!a.isEmpty(this.currentConfigurationValues)&&(l.configuration=this.currentConfigurationValues),this.triggerApiTask(l)}assignFormFields(l,n){n.forEach(n=>this.assignFormField(l,n))}assignFormField(l,{externalFieldName:n,formControlName:e,attr:u,replaceFn:t,editable:i,resetValue:o}){if(this.editing&&(!i||this.form.get(e).pristine))return;const s=this.form.getValue(e);let r=t?t(s):u?a.get(s,u):s;if(!s||!r){if(!i||a.isUndefined(o))return;r=o}l[n]=r}triggerApiTask(l){this.taskWrapper.wrapTaskAroundCall({task:new R.a("pool/"+(this.editing?t.e.EDIT:t.e.CREATE),{pool_name:l.hasOwnProperty("srcpool")?l.srcpool:l.pool}),call:this.poolService[this.editing?t.e.UPDATE:t.e.CREATE](l)}).subscribe(void 0,l=>{a.isObject(l.error)&&"34"===l.error.code&&this.form.get("pgNum").setErrors({34:!0}),this.form.setErrors({cdSubmitButton:!0})},()=>this.router.navigate(["/pool"]))}appSelection(){this.form.get("name").updateValueAndValidity({emitEvent:!1,onlySelf:!0})}}var q=e("MuvH"),x=e("+fVR"),P=e("uIqm"),F=e("x38r"),A=e("yJti"),B=e("vCyI"),O=e("o4+5"),L=e("VTlA"),z=e("EgGo"),U=e("d+Og");class M{constructor(l){this.pool_name=l}}const j=new z.a("pool");class G extends x.a{constructor(l,n,e,u,t,i,o,s,r,d,c){super(),this.poolService=l,this.taskWrapper=n,this.authStorageService=e,this.taskListService=u,this.modalService=t,this.i18n=i,this.pgCategoryService=o,this.dimlessPipe=s,this.urlBuilder=r,this.configurationService=d,this.actionLabels=c,this.selection=new B.a,this.executingTasks=[],this.cacheTiers=[],this.monAllowPoolDelete=!1,this.permissions=this.authStorageService.getPermissions(),this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(encodeURIComponent(this.selection.first().pool_name)),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deletePoolModal(),name:this.actionLabels.DELETE,disable:this.getDisableDesc.bind(this)}],this.permissions.configOpt.read&&this.configurationService.get("mon_allow_pool_delete").subscribe(l=>{if(a.has(l,"value")){const n=a.find(l.value,l=>"mon"===l.section)||{value:!1};this.monAllowPoolDelete="true"===n.value}})}ngOnInit(){const l=(l,n,e)=>a.get(n,l)>a.get(e,l)?1:-1;this.columns=[{prop:"pool_name",name:this.i18n("Name"),flexGrow:4,cellTransformation:F.a.executing},{prop:"type",name:this.i18n("Type"),flexGrow:2},{prop:"application_metadata",name:this.i18n("Applications"),flexGrow:3},{prop:"pg_status",name:this.i18n("PG Status"),flexGrow:3,cellClass:({row:l,column:n,value:e})=>this.getPgStatusCellClass(l,n,e)},{prop:"size",name:this.i18n("Replica Size"),flexGrow:2,cellClass:"text-right"},{prop:"last_change",name:this.i18n("Last Change"),flexGrow:2,cellClass:"text-right"},{prop:"erasure_code_profile",name:this.i18n("Erasure Coded Profile"),flexGrow:2},{prop:"crush_rule",name:this.i18n("Crush Ruleset"),flexGrow:3},{name:this.i18n("Usage"),prop:"usage",cellTemplate:this.poolUsageTpl,flexGrow:3},{prop:"stats.rd_bytes.rates",name:this.i18n("Read bytes"),comparator:(n,e,u,t)=>l("stats.rd_bytes.latest",u,t),cellTransformation:F.a.sparkline,flexGrow:3},{prop:"stats.wr_bytes.rates",name:this.i18n("Write bytes"),comparator:(n,e,u,t)=>l("stats.wr_bytes.latest",u,t),cellTransformation:F.a.sparkline,flexGrow:3},{prop:"stats.rd.rate",name:this.i18n("Read ops"),flexGrow:1,pipe:this.dimlessPipe,cellTransformation:F.a.perSecond},{prop:"stats.wr.rate",name:this.i18n("Write ops"),flexGrow:1,pipe:this.dimlessPipe,cellTransformation:F.a.perSecond}],this.taskListService.init(()=>this.poolService.getList(),void 0,l=>this.pools=this.transformPoolsData(l),()=>{this.table.reset(),this.viewCacheStatusList=[{status:A.a.ValueException}]},l=>l.name.startsWith("pool/"),(l,n)=>n.metadata.pool_name===l.pool_name,{default:l=>new M(l.pool_name)})}updateSelection(l){this.selection=l}deletePoolModal(){const l=this.selection.first().pool_name;this.modalRef=this.modalService.show(g.a,{initialState:{itemDescription:"Pool",itemNames:[l],submitActionObservable:()=>this.taskWrapper.wrapTaskAroundCall({task:new R.a("pool/"+t.e.DELETE,{pool_name:l}),call:this.poolService.delete(l)})}})}getPgStatusCellClass(l,n,e){return{"text-right":!0,["pg-"+this.pgCategoryService.getTypeByStates(e)]:!0}}transformPoolsData(l){const n=["bytes_used","max_avail","avail_raw","percent_used","rd_bytes","wr_bytes","rd","wr"],e={latest:0,rate:0,rates:[]};return a.forEach(l,l=>{l.pg_status=this.transformPgStatus(l.pg_status);const u={};a.forEach(n,n=>{u[n]=l.stats&&l.stats[n]?l.stats[n]:e}),l.stats=u,l.usage=u.percent_used.latest,l.cdExecuting||l.pg_num+l.pg_placement_num===l.pg_num_target+l.pg_placement_num_target||(l.cdExecuting="Updating"),["rd_bytes","wr_bytes"].forEach(n=>{l.stats[n].rates=l.stats[n].rates.map(l=>l[1])}),l.cdIsBinary=!0}),l}transformPgStatus(l){const n=[];return a.forEach(l,(l,e)=>{n.push(`${l} ${e}`)}),n.join(", ")}getSelectionTiers(){if(void 0!==this.expandedRow){const l=this.expandedRow.tiers;this.cacheTiers=this.pools.filter(n=>l.includes(n.pool))}}getDisableDesc(){return!this.selection||!this.selection.hasSelection||!this.monAllowPoolDelete&&this.i18n("Pool deletion is disabled by the mon_allow_pool_delete configuration setting.")}setExpandedRow(l){super.setExpandedRow(l),this.getSelectionTiers()}}class ${}const K={breadcrumbs:t.a.CREATE},J={breadcrumbs:t.a.EDIT};class W{}var H=e("iutN"),Y=e("MdoF"),Z=e("ES0t"),X=e("Xg1U"),Q=e("z5nN"),ll=e("pMnS"),nl=e("EEJc"),el=e("PEr+"),ul=e("a40w"),tl=e("hfeG"),il=e("QUzE"),al=e("E7j4"),ol=e("xvu0"),sl=e("RIVN"),rl=e("nP0W"),dl=e("VBM6"),cl=e("atuK"),ml=e("JIi+"),fl=e("0BYw"),gl=e("3IYD"),pl=e("I4Qz"),hl=e("0rTx"),vl=e("lz+O"),bl=e("u2XS"),Cl=e("nhAp"),Rl=e("l7Jr"),Il=e("bUo2"),El=e("SVse"),Nl=e("8xTl"),yl=e("ajRT"),Vl=e("+gVj"),wl=e("mXUL"),Tl=e("IZUe"),_l=e("ANnk"),Sl=e("f/UV"),Dl=e("4HWh"),kl=e("p4Cf"),ql=e("gp3X"),xl=e("sb0X"),Pl=e("KVJa"),Fl=e("Z21x"),Al=e("LqlI"),Bl=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ol(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Ll(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The name can only consist of alphanumeric characters, dashes and underscores."]))],null,null)}function zl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen erasure code profile name is already in use."]))],null,null)}function Ul(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Ml(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function jl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Gl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function $l(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," ( "," ) "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit,n.component.failureDomains[n.context.$implicit].length)}))}function Kl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Jl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Wl(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),(l()(),u["ɵeld"](2,0,null,null,119,"cd-modal",[],null,null,null,nl.c,nl.b)),u["ɵdid"](3,49152,null,0,yl.a,[],{modalRef:[0,"modalRef"]},null),(l()(),u["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),u["ɵted"](5,null,[""," ",""])),u["ɵppd"](6,1),u["ɵppd"](7,1),(l()(),u["ɵeld"](8,0,null,1,113,null,null,null,null,null,null,null)),(l()(),u["ɵeld"](9,0,null,null,112,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var t=!0;return"submit"===n&&(t=!1!==u["ɵnov"](l,11).onSubmit(e)&&t),"reset"===n&&(t=!1!==u["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==u["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),u["ɵdid"](10,16384,null,0,i.G,[],null,null),u["ɵdid"](11,540672,[["frm",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,i.d,null,[i.l]),u["ɵdid"](13,16384,null,0,i.s,[[4,i.d]],null,null),u["ɵdid"](14,16384,null,0,Vl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](15,0,null,null,98,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](16,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](17,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,1,{FormControlNames:1}),u["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),u["ɵeld"](20,0,null,0,3,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵeld"](21,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](23,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](24,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,28)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,28).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,28)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,28)._compositionEnd(e.target.value)&&t),t}),null,null)),u["ɵdid"](26,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](27,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](28,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](30,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](32,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](33,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ol)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ll)),u["ɵdid"](37,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,zl)),u["ɵdid"](39,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](40,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](41,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,3,{FormControlNames:1}),u["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),u["ɵeld"](44,0,null,0,5,"label",[["class","cd-col-form-label"],["for","root"]],null,null,null,null,null)),(l()(),u["ɵeld"](45,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Root"])),(l()(),u["ɵeld"](47,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](48,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](49,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](50,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](51,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","root"],["id","root"],["name","root"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,53).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,53).onTouched()&&t),t}),null,null)),u["ɵdid"](52,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](53,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](55,671744,[[3,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](57,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](58,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ul)),u["ɵdid"](60,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ml)),u["ɵdid"](62,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,jl)),u["ɵdid"](64,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](65,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](66,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](69,0,null,0,5,"label",[["class","cd-col-form-label"],["for","failure_domain"]],null,null,null,null,null)),(l()(),u["ɵeld"](70,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Failure domain type"])),(l()(),u["ɵeld"](72,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](73,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](74,0,null,null,0,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵeld"](75,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](76,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","failure_domain"],["id","failure_domain"],["name","failure_domain"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,78).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,78).onTouched()&&t),t}),null,null)),u["ɵdid"](77,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](78,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](80,671744,[[5,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](82,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](83,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Gl)),u["ɵdid"](85,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,$l)),u["ɵdid"](87,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Kl)),u["ɵdid"](89,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](90,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](91,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](94,0,null,0,4,"label",[["class","cd-col-form-label"],["for","device_class"]],null,null,null,null,null)),(l()(),u["ɵeld"](95,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Device class"])),(l()(),u["ɵeld"](97,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](98,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](99,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](100,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","device_class"],["id","device_class"],["name","device_class"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,102).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,102).onTouched()&&t),t}),null,null)),u["ɵdid"](101,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](102,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](104,671744,[[7,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](106,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](107,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](108,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](109,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](110,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Let Ceph decide"])),(l()(),u["ɵand"](16777216,null,null,1,null,Jl)),u["ɵdid"](113,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](114,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](115,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.onSubmit()&&u),u}),ql.b,ql.a)),u["ɵdid"](116,114688,null,0,xl.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](117,0,[""," ",""])),u["ɵppd"](118,1),u["ɵppd"](119,1),(l()(),u["ɵeld"](120,0,null,null,1,"cd-back-button",[],null,null,null,Pl.b,Pl.a)),u["ɵdid"](121,49152,null,0,Fl.a,[El.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.bsModalRef),l(n,11,0,e.form),l(n,14,0,e.form),l(n,17,0),l(n,26,0,""),l(n,30,0,"name"),l(n,33,0,"name"),l(n,35,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,37,0,e.form.showError("name",u["ɵnov"](n,11),"pattern")),l(n,39,0,e.form.showError("name",u["ɵnov"](n,11),"uniqueName")),l(n,41,0),l(n,48,0,e.tooltips.root),l(n,55,0,"root"),l(n,58,0,"root"),l(n,60,0,!e.buckets),l(n,62,0,e.buckets),l(n,64,0,e.form.showError("root",u["ɵnov"](n,11),"required")),l(n,66,0),l(n,73,0,e.tooltips.failure_domain),l(n,80,0,"failure_domain"),l(n,83,0,"failure_domain"),l(n,85,0,!e.failureDomains),l(n,87,0,e.failureDomainKeys),l(n,89,0,e.form.showError("failure_domain",u["ɵnov"](n,11),"required")),l(n,91,0),l(n,98,0,e.tooltips.device_class),l(n,104,0,"device_class"),l(n,107,0,"device_class"),l(n,109,0,""),l(n,110,0,""),l(n,113,0,e.devices),l(n,116,0,u["ɵnov"](n,11)),l(n,121,0,e.bsModalRef.hide)}),(function(l,n){var e=n.component,t=u["ɵunv"](n,5,0,l(n,6,0,u["ɵnov"](n,0),e.action)),i=u["ɵunv"](n,5,1,l(n,7,0,u["ɵnov"](n,1),e.resource));l(n,5,0,t,i),l(n,9,0,u["ɵnov"](n,13).ngClassUntouched,u["ɵnov"](n,13).ngClassTouched,u["ɵnov"](n,13).ngClassPristine,u["ɵnov"](n,13).ngClassDirty,u["ɵnov"](n,13).ngClassValid,u["ɵnov"](n,13).ngClassInvalid,u["ɵnov"](n,13).ngClassPending),l(n,16,0,u["ɵnov"](n,17).hasErrors,u["ɵnov"](n,17).hasSuccess),l(n,25,0,u["ɵnov"](n,32).ngClassUntouched,u["ɵnov"](n,32).ngClassTouched,u["ɵnov"](n,32).ngClassPristine,u["ɵnov"](n,32).ngClassDirty,u["ɵnov"](n,32).ngClassValid,u["ɵnov"](n,32).ngClassInvalid,u["ɵnov"](n,32).ngClassPending,u["ɵnov"](n,33).validClass,u["ɵnov"](n,33).invalidClass),l(n,40,0,u["ɵnov"](n,41).hasErrors,u["ɵnov"](n,41).hasSuccess),l(n,51,0,u["ɵnov"](n,57).ngClassUntouched,u["ɵnov"](n,57).ngClassTouched,u["ɵnov"](n,57).ngClassPristine,u["ɵnov"](n,57).ngClassDirty,u["ɵnov"](n,57).ngClassValid,u["ɵnov"](n,57).ngClassInvalid,u["ɵnov"](n,57).ngClassPending,u["ɵnov"](n,58).validClass,u["ɵnov"](n,58).invalidClass),l(n,65,0,u["ɵnov"](n,66).hasErrors,u["ɵnov"](n,66).hasSuccess),l(n,76,0,u["ɵnov"](n,82).ngClassUntouched,u["ɵnov"](n,82).ngClassTouched,u["ɵnov"](n,82).ngClassPristine,u["ɵnov"](n,82).ngClassDirty,u["ɵnov"](n,82).ngClassValid,u["ɵnov"](n,82).ngClassInvalid,u["ɵnov"](n,82).ngClassPending,u["ɵnov"](n,83).validClass,u["ɵnov"](n,83).invalidClass),l(n,90,0,u["ɵnov"](n,91).hasErrors,u["ɵnov"](n,91).hasSuccess),l(n,100,0,u["ɵnov"](n,106).ngClassUntouched,u["ɵnov"](n,106).ngClassTouched,u["ɵnov"](n,106).ngClassPristine,u["ɵnov"](n,106).ngClassDirty,u["ɵnov"](n,106).ngClassValid,u["ɵnov"](n,106).ngClassInvalid,u["ɵnov"](n,106).ngClassPending,u["ɵnov"](n,107).validClass,u["ɵnov"](n,107).invalidClass);var a=u["ɵunv"](n,117,0,l(n,118,0,u["ɵnov"](n,0),e.action)),o=u["ɵunv"](n,117,1,l(n,119,0,u["ɵnov"](n,1),e.resource));l(n,117,0,a,o)}))}function Hl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-crush-rule-form-modal",[],null,null,null,Wl,Bl)),u["ɵdid"](1,114688,null,0,w,[V.a,Al.a,y.a,d,s.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var Yl=u["ɵccf"]("cd-crush-rule-form-modal",w,Hl,{},{submitAction:"submitAction"},[]),Zl=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Xl(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Ql(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The name can only consist of alphanumeric characters, dashes and underscores."]))],null,null)}function ln(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen erasure code profile name is already in use."]))],null,null)}function nn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function en(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function un(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function tn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function an(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 2."]))],null,null)}function on(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Chunks (k+m) have exceeded the available OSDs of ","."]))],null,(function(l,n){l(n,1,0,n.component.deviceCount)}))}function sn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["For an equal distribution k has to be a multiple of (k+m)/l."]))],null,null)}function rn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["K has to be equal to or greater than m in order to recover data correctly through c."]))],null,null)}function dn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Distribution factor: ",""]))],null,(function(l,n){l(n,1,0,n.component.lrcMultiK)}))}function cn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function mn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function fn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["Chunks (k+m) have exceeded the available OSDs of ","."]))],null,(function(l,n){l(n,1,0,n.component.deviceCount)}))}function gn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function pn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["C has to be equal to or lower than m as m defines the amount of chunks that can be used."]))],null,null)}function hn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,9,{FormControlNames:1}),u["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","c"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Durability estimator (c)"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","c"],["id","c"],["name","c"],["placeholder","Coding chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,12)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,12).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,12)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,12)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,13).onTouched()&&t),t}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](13,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](15,671744,[[9,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](17,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](18,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,gn)),u["ɵdid"](20,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,pn)),u["ɵdid"](22,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.shec.c),l(n,15,0,"c"),l(n,18,0,"c"),l(n,20,0,e.form.showError("c",u["ɵnov"](n.parent,11),"min")),l(n,22,0,e.form.showError("c",u["ɵnov"](n.parent,11),"cGreaterM"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,17).ngClassUntouched,u["ɵnov"](n,17).ngClassTouched,u["ɵnov"](n,17).ngClassPristine,u["ɵnov"](n,17).ngClassDirty,u["ɵnov"](n,17).ngClassValid,u["ɵnov"](n,17).ngClassInvalid,u["ɵnov"](n,17).ngClassPending,u["ɵnov"](n,18).validClass,u["ɵnov"](n,18).invalidClass)}))}function vn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["D is automatically updated on k and m changes"]))],null,null)}function bn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["D can be set from "," to ",""]))],null,(function(l,n){var e=n.component;l(n,1,0,e.getDMin(),e.getDMax())}))}function Cn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["D can only be set to ",""]))],null,(function(l,n){l(n,1,0,n.component.getDMax())}))}function Rn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,4,null,null,null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,bn)),u["ɵdid"](2,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Cn)),u["ɵdid"](4,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,2,0,e.getDMin()0),l(n,23,0,e.failureDomainKeys)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function Pn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Fn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,19,{FormControlNames:1}),u["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","scalar_mds"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Scalar mds"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,10,"select",[["class","form-control custom-select"],["formControlName","scalar_mds"],["id","scalar_mds"],["name","scalar_mds"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,12).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,12).onTouched()&&t),t}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](14,671744,[[19,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](16,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](17,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,2,null,Pn)),u["ɵdid"](19,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),u["ɵpad"](20,3)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.clay.scalar_mds),l(n,14,0,"scalar_mds"),l(n,17,0,"scalar_mds");var u=l(n,20,0,e.PLUGIN.JERASURE,e.PLUGIN.ISA,e.PLUGIN.SHEC);l(n,19,0,u)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function An(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Bn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,21,{FormControlNames:1}),u["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","technique"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Technique"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","technique"],["id","technique"],["name","technique"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,12).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,12).onTouched()&&t),t}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](14,671744,[[21,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](16,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](17,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,An)),u["ɵdid"](19,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins[e.plugin].technique),l(n,14,0,"technique"),l(n,17,0,"technique"),l(n,19,0,e.techniques)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function On(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Must be equal to or greater than 1."]))],null,null)}function Ln(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,23,{FormControlNames:1}),u["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","packetSize"]],null,null,null,null,null)),(l()(),u["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Packetsize"])),(l()(),u["ɵeld"](7,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](8,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](9,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](10,0,null,null,8,"input",[["class","form-control"],["formControlName","packetSize"],["id","packetSize"],["name","packetSize"],["placeholder","Packetsize..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,12)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,12).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,12)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,12)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,13).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,13).onTouched()&&t),t}),null,null)),u["ɵdid"](11,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](12,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](13,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](15,671744,[[23,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](17,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](18,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,On)),u["ɵdid"](20,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,8,0,e.tooltips.plugins.jerasure.packetSize),l(n,15,0,"packetSize"),l(n,18,0,"packetSize"),l(n,20,0,e.form.showError("packetSize",u["ɵnov"](n.parent,11),"min"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,10,0,u["ɵnov"](n,17).ngClassUntouched,u["ɵnov"](n,17).ngClassTouched,u["ɵnov"](n,17).ngClassPristine,u["ɵnov"](n,17).ngClassDirty,u["ɵnov"](n,17).ngClassValid,u["ɵnov"](n,17).ngClassInvalid,u["ɵnov"](n,17).ngClassPending,u["ɵnov"](n,18).validClass,u["ɵnov"](n,18).invalidClass)}))}function zn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Un(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function Mn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function jn(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),(l()(),u["ɵeld"](2,0,null,null,226,"cd-modal",[],null,null,null,nl.c,nl.b)),u["ɵdid"](3,49152,null,0,yl.a,[],{modalRef:[0,"modalRef"]},null),(l()(),u["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),u["ɵted"](5,null,[""," ",""])),u["ɵppd"](6,1),u["ɵppd"](7,1),(l()(),u["ɵeld"](8,0,null,1,220,null,null,null,null,null,null,null)),(l()(),u["ɵeld"](9,0,null,null,219,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var t=!0;return"submit"===n&&(t=!1!==u["ɵnov"](l,11).onSubmit(e)&&t),"reset"===n&&(t=!1!==u["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==u["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),u["ɵdid"](10,16384,null,0,i.G,[],null,null),u["ɵdid"](11,540672,[["frm",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,i.d,null,[i.l]),u["ɵdid"](13,16384,null,0,i.s,[[4,i.d]],null,null),u["ɵdid"](14,16384,null,0,Vl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](15,0,null,null,205,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](16,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](17,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,1,{FormControlNames:1}),u["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),u["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](22,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,26)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,26).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,26)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,26)._compositionEnd(e.target.value)&&t),t}),null,null)),u["ɵdid"](24,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](25,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](26,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](28,671744,[[1,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](30,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](31,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Xl)),u["ɵdid"](33,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ql)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ln)),u["ɵdid"](37,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](38,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](39,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,3,{FormControlNames:1}),u["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),u["ɵeld"](42,0,null,0,4,"label",[["class","cd-col-form-label"],["for","plugin"]],null,null,null,null,null)),(l()(),u["ɵeld"](43,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Plugin"])),(l()(),u["ɵeld"](45,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](46,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](47,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](48,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","plugin"],["id","plugin"],["name","plugin"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,50).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,50).onTouched()&&t),t}),null,null)),u["ɵdid"](49,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](50,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](52,671744,[[3,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](54,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](55,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,nn)),u["ɵdid"](57,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,en)),u["ɵdid"](59,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,un)),u["ɵdid"](61,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](62,0,null,null,30,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](63,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](66,0,null,0,4,"label",[["class","cd-col-form-label"],["for","k"]],null,null,null,null,null)),(l()(),u["ɵeld"](67,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Data chunks (k)"])),(l()(),u["ɵeld"](69,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](70,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](71,0,null,0,21,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](72,0,null,null,8,"input",[["class","form-control"],["formControlName","k"],["id","k"],["name","k"],["ng-model","$ctrl.erasureCodeProfile.k"],["placeholder","Data chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,74)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,74).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,74)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,74)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,75).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,75).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,75).onTouched()&&t),t}),null,null)),u["ɵdid"](73,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](74,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](75,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](77,671744,[[5,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](79,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](80,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,tn)),u["ɵdid"](82,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,an)),u["ɵdid"](84,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,on)),u["ɵdid"](86,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,sn)),u["ɵdid"](88,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,rn)),u["ɵdid"](90,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,dn)),u["ɵdid"](92,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](93,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](94,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](97,0,null,0,4,"label",[["class","cd-col-form-label"],["for","m"]],null,null,null,null,null)),(l()(),u["ɵeld"](98,0,null,null,1,"span",[["class","required"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Coding chunks (m)"])),(l()(),u["ɵeld"](100,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](101,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](102,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](103,0,null,null,8,"input",[["class","form-control"],["formControlName","m"],["id","m"],["name","m"],["placeholder","Coding chunks..."],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,105)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,105).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,105)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,105)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,106).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,106).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,106).onTouched()&&t),t}),null,null)),u["ɵdid"](104,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](105,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](106,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](108,671744,[[7,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](110,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](111,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,cn)),u["ɵdid"](113,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,mn)),u["ɵdid"](115,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,fn)),u["ɵdid"](117,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,hn)),u["ɵdid"](119,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Nn)),u["ɵdid"](121,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Tn)),u["ɵdid"](123,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](124,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](125,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,15,{FormControlNames:1}),u["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),u["ɵeld"](128,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushFailureDomain"]],null,null,null,null,null)),(l()(),u["ɵeld"](129,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush failure domain"])),(l()(),u["ɵeld"](131,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](132,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](133,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](134,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","crushFailureDomain"],["id","crushFailureDomain"],["name","crushFailureDomain"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,136).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,136).onTouched()&&t),t}),null,null)),u["ɵdid"](135,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](136,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](138,671744,[[15,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](140,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](141,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,_n)),u["ɵdid"](143,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Sn)),u["ɵdid"](145,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,xn)),u["ɵdid"](147,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Fn)),u["ɵdid"](149,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,2,null,Bn)),u["ɵdid"](151,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),u["ɵpad"](152,3),(l()(),u["ɵand"](16777216,null,null,1,null,Ln)),u["ɵdid"](154,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](155,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](156,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,25,{FormControlNames:1}),u["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),u["ɵeld"](159,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushRoot"]],null,null,null,null,null)),(l()(),u["ɵeld"](160,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush root"])),(l()(),u["ɵeld"](162,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](163,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](164,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](165,0,null,null,11,"select",[["class","form-control custom-select"],["formControlName","crushRoot"],["id","crushRoot"],["name","crushRoot"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,167).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,167).onTouched()&&t),t}),null,null)),u["ɵdid"](166,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](167,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](169,671744,[[25,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](171,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](172,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,zn)),u["ɵdid"](174,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Un)),u["ɵdid"](176,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](177,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](178,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,27,{FormControlNames:1}),u["ɵqud"](603979776,28,{messagesBlock:0}),(l()(),u["ɵeld"](181,0,null,0,4,"label",[["class","cd-col-form-label"],["for","crushDeviceClass"]],null,null,null,null,null)),(l()(),u["ɵeld"](182,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush device class"])),(l()(),u["ɵeld"](184,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](185,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](186,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](187,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","crushDeviceClass"],["id","crushDeviceClass"],["name","crushDeviceClass"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,189).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,189).onTouched()&&t),t}),null,null)),u["ɵdid"](188,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](189,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](191,671744,[[27,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](193,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](194,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](195,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](196,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](197,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Let Ceph decide"])),(l()(),u["ɵand"](16777216,null,null,1,null,Mn)),u["ɵdid"](200,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](201,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](202,null,["Available OSDs: ",""])),(l()(),u["ɵeld"](203,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](204,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,29,{FormControlNames:1}),u["ɵqud"](603979776,30,{messagesBlock:0}),(l()(),u["ɵeld"](207,0,null,0,4,"label",[["class","cd-col-form-label"],["for","directory"]],null,null,null,null,null)),(l()(),u["ɵeld"](208,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Directory"])),(l()(),u["ɵeld"](210,0,null,null,1,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](211,49152,null,0,kl.a,[],{html:[0,"html"]},null),(l()(),u["ɵeld"](212,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](213,0,null,null,7,"input",[["class","form-control"],["formControlName","directory"],["id","directory"],["name","directory"],["placeholder","Path..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,215)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,215).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,215)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,215)._compositionEnd(e.target.value)&&t),t}),null,null)),u["ɵdid"](214,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](215,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](217,671744,[[29,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](219,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](220,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](221,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](222,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.onSubmit()&&u),u}),ql.b,ql.a)),u["ɵdid"](223,114688,null,0,xl.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](224,0,[""," ",""])),u["ɵppd"](225,1),u["ɵppd"](226,1),(l()(),u["ɵeld"](227,0,null,null,1,"cd-back-button",[],null,null,null,Pl.b,Pl.a)),u["ɵdid"](228,49152,null,0,Fl.a,[El.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var e=n.component;l(n,3,0,e.bsModalRef),l(n,11,0,e.form),l(n,14,0,e.form),l(n,17,0),l(n,24,0,""),l(n,28,0,"name"),l(n,31,0,"name"),l(n,33,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,35,0,e.form.showError("name",u["ɵnov"](n,11),"pattern")),l(n,37,0,e.form.showError("name",u["ɵnov"](n,11),"uniqueName")),l(n,39,0),l(n,46,0,e.tooltips.plugins[e.plugin].description),l(n,52,0,"plugin"),l(n,55,0,"plugin"),l(n,57,0,!e.plugins),l(n,59,0,e.plugins),l(n,61,0,e.form.showError("name",u["ɵnov"](n,11),"required")),l(n,63,0),l(n,70,0,e.tooltips.k),l(n,77,0,"k"),l(n,80,0,"k"),l(n,82,0,e.form.showError("k",u["ɵnov"](n,11),"required")),l(n,84,0,e.form.showError("k",u["ɵnov"](n,11),"min")),l(n,86,0,e.form.showError("k",u["ɵnov"](n,11),"max")),l(n,88,0,e.form.showError("k",u["ɵnov"](n,11),"unequal")),l(n,90,0,e.form.showError("k",u["ɵnov"](n,11),"kLowerM")),l(n,92,0,"lrc"===e.plugin),l(n,94,0),l(n,101,0,e.tooltips.m),l(n,108,0,"m"),l(n,111,0,"m"),l(n,113,0,e.form.showError("m",u["ɵnov"](n,11),"required")),l(n,115,0,e.form.showError("m",u["ɵnov"](n,11),"min")),l(n,117,0,e.form.showError("m",u["ɵnov"](n,11),"max")),l(n,119,0,"shec"===e.plugin),l(n,121,0,"clay"===e.plugin),l(n,123,0,e.plugin===e.PLUGIN.LRC),l(n,125,0),l(n,132,0,e.tooltips.crushFailureDomain),l(n,138,0,"crushFailureDomain"),l(n,141,0,"crushFailureDomain"),l(n,143,0,!e.failureDomains),l(n,145,0,e.failureDomainKeys),l(n,147,0,e.plugin===e.PLUGIN.LRC),l(n,149,0,e.PLUGIN.CLAY===e.plugin);var t=l(n,152,0,e.PLUGIN.JERASURE,e.PLUGIN.ISA,e.PLUGIN.CLAY).includes(e.plugin);l(n,151,0,t),l(n,154,0,e.plugin===e.PLUGIN.JERASURE),l(n,156,0),l(n,163,0,e.tooltips.crushRoot),l(n,169,0,"crushRoot"),l(n,172,0,"crushRoot"),l(n,174,0,!e.buckets),l(n,176,0,e.buckets),l(n,178,0),l(n,185,0,e.tooltips.crushDeviceClass),l(n,191,0,"crushDeviceClass"),l(n,194,0,"crushDeviceClass"),l(n,196,0,""),l(n,197,0,""),l(n,200,0,e.devices),l(n,204,0),l(n,211,0,e.tooltips.directory),l(n,217,0,"directory"),l(n,220,0,"directory"),l(n,223,0,u["ɵnov"](n,11)),l(n,228,0,e.bsModalRef.hide)}),(function(l,n){var e=n.component,t=u["ɵunv"](n,5,0,l(n,6,0,u["ɵnov"](n,0),e.action)),i=u["ɵunv"](n,5,1,l(n,7,0,u["ɵnov"](n,1),e.resource));l(n,5,0,t,i),l(n,9,0,u["ɵnov"](n,13).ngClassUntouched,u["ɵnov"](n,13).ngClassTouched,u["ɵnov"](n,13).ngClassPristine,u["ɵnov"](n,13).ngClassDirty,u["ɵnov"](n,13).ngClassValid,u["ɵnov"](n,13).ngClassInvalid,u["ɵnov"](n,13).ngClassPending),l(n,16,0,u["ɵnov"](n,17).hasErrors,u["ɵnov"](n,17).hasSuccess),l(n,23,0,u["ɵnov"](n,30).ngClassUntouched,u["ɵnov"](n,30).ngClassTouched,u["ɵnov"](n,30).ngClassPristine,u["ɵnov"](n,30).ngClassDirty,u["ɵnov"](n,30).ngClassValid,u["ɵnov"](n,30).ngClassInvalid,u["ɵnov"](n,30).ngClassPending,u["ɵnov"](n,31).validClass,u["ɵnov"](n,31).invalidClass),l(n,38,0,u["ɵnov"](n,39).hasErrors,u["ɵnov"](n,39).hasSuccess),l(n,48,0,u["ɵnov"](n,54).ngClassUntouched,u["ɵnov"](n,54).ngClassTouched,u["ɵnov"](n,54).ngClassPristine,u["ɵnov"](n,54).ngClassDirty,u["ɵnov"](n,54).ngClassValid,u["ɵnov"](n,54).ngClassInvalid,u["ɵnov"](n,54).ngClassPending,u["ɵnov"](n,55).validClass,u["ɵnov"](n,55).invalidClass),l(n,62,0,u["ɵnov"](n,63).hasErrors,u["ɵnov"](n,63).hasSuccess),l(n,72,0,u["ɵnov"](n,79).ngClassUntouched,u["ɵnov"](n,79).ngClassTouched,u["ɵnov"](n,79).ngClassPristine,u["ɵnov"](n,79).ngClassDirty,u["ɵnov"](n,79).ngClassValid,u["ɵnov"](n,79).ngClassInvalid,u["ɵnov"](n,79).ngClassPending,u["ɵnov"](n,80).validClass,u["ɵnov"](n,80).invalidClass),l(n,93,0,u["ɵnov"](n,94).hasErrors,u["ɵnov"](n,94).hasSuccess),l(n,103,0,u["ɵnov"](n,110).ngClassUntouched,u["ɵnov"](n,110).ngClassTouched,u["ɵnov"](n,110).ngClassPristine,u["ɵnov"](n,110).ngClassDirty,u["ɵnov"](n,110).ngClassValid,u["ɵnov"](n,110).ngClassInvalid,u["ɵnov"](n,110).ngClassPending,u["ɵnov"](n,111).validClass,u["ɵnov"](n,111).invalidClass),l(n,124,0,u["ɵnov"](n,125).hasErrors,u["ɵnov"](n,125).hasSuccess),l(n,134,0,u["ɵnov"](n,140).ngClassUntouched,u["ɵnov"](n,140).ngClassTouched,u["ɵnov"](n,140).ngClassPristine,u["ɵnov"](n,140).ngClassDirty,u["ɵnov"](n,140).ngClassValid,u["ɵnov"](n,140).ngClassInvalid,u["ɵnov"](n,140).ngClassPending,u["ɵnov"](n,141).validClass,u["ɵnov"](n,141).invalidClass),l(n,155,0,u["ɵnov"](n,156).hasErrors,u["ɵnov"](n,156).hasSuccess),l(n,165,0,u["ɵnov"](n,171).ngClassUntouched,u["ɵnov"](n,171).ngClassTouched,u["ɵnov"](n,171).ngClassPristine,u["ɵnov"](n,171).ngClassDirty,u["ɵnov"](n,171).ngClassValid,u["ɵnov"](n,171).ngClassInvalid,u["ɵnov"](n,171).ngClassPending,u["ɵnov"](n,172).validClass,u["ɵnov"](n,172).invalidClass),l(n,177,0,u["ɵnov"](n,178).hasErrors,u["ɵnov"](n,178).hasSuccess),l(n,187,0,u["ɵnov"](n,193).ngClassUntouched,u["ɵnov"](n,193).ngClassTouched,u["ɵnov"](n,193).ngClassPristine,u["ɵnov"](n,193).ngClassDirty,u["ɵnov"](n,193).ngClassValid,u["ɵnov"](n,193).ngClassInvalid,u["ɵnov"](n,193).ngClassPending,u["ɵnov"](n,194).validClass,u["ɵnov"](n,194).invalidClass),l(n,202,0,e.deviceCount),l(n,203,0,u["ɵnov"](n,204).hasErrors,u["ɵnov"](n,204).hasSuccess),l(n,213,0,u["ɵnov"](n,219).ngClassUntouched,u["ɵnov"](n,219).ngClassTouched,u["ɵnov"](n,219).ngClassPristine,u["ɵnov"](n,219).ngClassDirty,u["ɵnov"](n,219).ngClassValid,u["ɵnov"](n,219).ngClassInvalid,u["ɵnov"](n,219).ngClassPending,u["ɵnov"](n,220).validClass,u["ɵnov"](n,220).invalidClass);var a=u["ɵunv"](n,224,0,l(n,225,0,u["ɵnov"](n,0),e.action)),o=u["ɵunv"](n,224,1,l(n,226,0,u["ɵnov"](n,1),e.resource));l(n,224,0,a,o)}))}function Gn(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-erasure-code-profile-form-modal",[],null,null,null,jn,Zl)),u["ɵdid"](1,114688,null,0,_,[V.a,Al.a,y.a,c,s.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var $n=u["ɵccf"]("cd-erasure-code-profile-form-modal",_,Gn,{},{submitAction:"submitAction"},[]),Kn=e("w9WL"),Jn=e("yT6U"),Wn=e("4DD9"),Hn=e("iExv"),Yn=e("85J/"),Zn=e("+0ag"),Xn=e("IzCI"),Qn=e("Dwqy"),le=e("uYzU"),ne=e("FFMq"),ee=e("E2fk"),ue=e("a0VL"),te=e("nSDx"),ie=e("SB+Q"),ae=e("TYzs"),oe=e("BQkM"),se=e("dEH0"),re=e("G1/K"),de=e("TJUb"),ce=e("efK2"),me=e("CNMR"),fe=e("KOzp"),ge=e("2uy1"),pe=e("z/SZ"),he=e("38Bd"),ve=e("978R"),be=e("FE24"),Ce=e("Avrn"),Re=e("iInd"),Ie=e("2ZVE"),Ee=e("ienR"),Ne=e("gk6K"),ye=e("9Xeq"),Ve=e("hrfs"),we=e("yGOH"),Te=e("bxSN"),_e=e("WF9J"),Se=e("V/fk"),De=e("ChqD"),ke=e("PCNd"),qe=e("zWsK"),xe=e("kJI8"),Pe=e("kccj"),Fe=e("yYhs"),Ae=e("k/xb"),Be=e("C6Ij"),Oe=e("AWcq"),Le=e("xSw7"),ze=e("GgAd"),Ue=e("a278"),Me=e("insk"),je=e("cUpR"),Ge=e("20UP"),$e=e("pKUh"),Ke=e("25BL"),Je=e("NUGo"),We=e("S7zO"),He=e("EFGL"),Ye=e("aAWM"),Ze=e("o8EM"),Xe=e("sLuX"),Qe=e("FSuO");e("jKX/");class lu{constructor(l,n){this.i18n=l,this.poolService=n,this.cacheTierColumns=[],this.cacheTierColumns=[{prop:"pool_name",name:this.i18n("Name"),flexGrow:3},{prop:"cache_mode",name:this.i18n("Cache Mode"),flexGrow:2},{prop:"cache_min_evict_age",name:this.i18n("Min Evict Age"),flexGrow:2},{prop:"cache_min_flush_age",name:this.i18n("Min Flush Age"),flexGrow:2},{prop:"target_max_bytes",name:this.i18n("Target Max Bytes"),flexGrow:2},{prop:"target_max_objects",name:this.i18n("Target Max Objects"),flexGrow:2}]}ngOnChanges(){this.selection&&this.poolService.getConfiguration(this.selection.pool_name).subscribe(l=>{this.selectedPoolConfiguration=l})}filterNonPoolData(l){return a.omit(l,["cdExecuting","cdIsBinary"])}}var nu=u["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function eu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Performance Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","three"],["uid","-xyV8KCiz"]],null,null,null,Ue.b,Ue.a)),u["ɵdid"](3,638976,null,0,Me.a,[je.b,Ge.a,s.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Performance Details"),l(n,3,0,"ceph-pool-detail?var-pool_name="+e.selection.pool_name,"three","-xyV8KCiz")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function uu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Configuration"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-rbd-configuration-table",[],null,null,null,He.b,He.a)),u["ɵdid"](3,638976,null,0,Ye.a,[N.a,Ze.a,s.a],{data:[0,"data"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Configuration"),l(n,3,0,e.selectedPoolConfiguration)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function tu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Cache Tiers Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,Ke.b,Ke.a)),u["ɵdid"](3,2867200,null,0,P.a,[u.NgZone,u.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],autoSave:[3,"autoSave"]},null)],(function(l,n){var e=n.component;l(n,1,0,"Cache Tiers Details"),l(n,3,0,e.cacheTiers,e.cacheTierColumns,"flex",!1)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function iu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,11,"tabset",[["cdTableDetail",""]],[[2,"tab-container",null]],null,null,$e.b,$e.a)),u["ɵdid"](1,180224,[[1,4],["tabsetChild",4]],0,Ie.e,[Ie.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](3,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](4,0,null,null,1,"cd-table-key-value",[],null,null,null,Xe.b,Xe.a)),u["ɵdid"](5,638976,null,0,Qe.a,[ue.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,eu)),u["ɵdid"](7,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,uu)),u["ɵdid"](9,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,0,1,null,tu)),u["ɵdid"](11,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,3,0,"Details"),l(n,5,0,e.filterNonPoolData(e.selection),!1,!0),l(n,7,0,e.permissions.grafana.read),l(n,9,0,"replicated"===e.selection.type),l(n,11,0,(null==e.selection.tiers?null:e.selection.tiers.length)>0)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).clazz),l(n,2,0,u["ɵnov"](n,3).id,u["ɵnov"](n,3).active,u["ɵnov"](n,3).addClass,u["ɵnov"](n,3).role,u["ɵnov"](n,3).ariaLabelledby)}))}function au(l){return u["ɵvid"](0,[u["ɵqud"](671088640,1,{tabsetChild:0}),(l()(),u["ɵand"](16777216,null,null,1,null,iu)),u["ɵdid"](2,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,2,0,n.component.selection)}),null)}var ou=e("ufoC"),su=e("mSOc"),ru=u["ɵcrt"]({encapsulation:0,styles:[[".pg-clean{color:#0b0} .pg-working{color:#2b99a8} .pg-warning{color:#ffc200} .pg-unknown{color:red}"]],data:{}});function du(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-view-cache",[],null,null,null,Be.b,Be.a)),u["ɵdid"](1,114688,null,0,Oe.a,[],{status:[0,"status"],statusFor:[1,"statusFor"]},null)],(function(l,n){l(n,1,0,n.context.$implicit.status,n.context.$implicit.statusFor)}),null)}function cu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-usage-bar",[["decimals","2"]],null,null,null,Le.b,Le.a)),u["ɵdid"](1,573440,null,0,ze.a,[],{total:[0,"total"],used:[1,"used"],decimals:[2,"decimals"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.stats.bytes_used.latest+n.parent.context.row.stats.avail_raw.latest,n.parent.context.row.stats.bytes_used.latest,"2")}),null)}function mu(l){return u["ɵvid"](0,[(l()(),u["ɵand"](16777216,null,null,1,null,cu)),u["ɵdid"](1,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,null==n.context.row.stats||null==n.context.row.stats.avail_raw?null:n.context.row.stats.avail_raw.latest)}),null)}function fu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"tab",[["heading","Overall Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](1,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","z99hzWtmk"]],null,null,null,Ue.b,Ue.a)),u["ɵdid"](3,638976,null,0,Me.a,[je.b,Ge.a,s.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Overall Performance"),l(n,3,0,"ceph-pools-overview?","two","z99hzWtmk")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).id,u["ɵnov"](n,1).active,u["ɵnov"](n,1).addClass,u["ɵnov"](n,1).role,u["ɵnov"](n,1).ariaLabelledby)}))}function gu(l){return u["ɵvid"](0,[u["ɵqud"](402653184,1,{table:0}),u["ɵqud"](402653184,2,{poolUsageTpl:0}),u["ɵqud"](671088640,3,{poolConfigurationSourceTpl:0}),(l()(),u["ɵeld"](3,0,null,null,14,"tabset",[],[[2,"tab-container",null]],null,null,$e.b,$e.a)),u["ɵdid"](4,180224,null,0,Ie.e,[Ie.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](5,0,null,0,10,"tab",[["heading","Pools List"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](6,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,du)),u["ɵdid"](8,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](9,0,null,null,5,"cd-table",[["id","pool-list"],["selectionType","single"]],null,[[null,"setExpandedRow"],[null,"updateSelection"]],(function(l,n,e){var u=!0,t=l.component;return"setExpandedRow"===n&&(u=!1!==t.setExpandedRow(e)&&u),"updateSelection"===n&&(u=!1!==t.updateSelection(e)&&u),u}),Ke.b,Ke.a)),u["ɵdid"](10,2867200,[[1,4],["table",4]],0,P.a,[u.NgZone,u.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],hasDetails:[2,"hasDetails"],selectionType:[3,"selectionType"]},{updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),u["ɵeld"](11,0,null,1,1,"cd-table-actions",[["class","table-actions"],["id","pool-list-actions"]],null,null,null,Je.b,Je.a)),u["ɵdid"](12,114688,null,0,We.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),u["ɵeld"](13,0,null,3,1,"cd-pool-details",[["cdTableDetail",""],["id","pool-list-details"]],null,null,null,au,nu)),u["ɵdid"](14,573440,null,0,lu,[s.a,m.a],{selection:[0,"selection"],permissions:[1,"permissions"],cacheTiers:[2,"cacheTiers"]},null),(l()(),u["ɵand"](0,[[2,2],["poolUsageTpl",2]],null,0,null,mu)),(l()(),u["ɵand"](16777216,null,0,1,null,fu)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,6,0,"Pools List"),l(n,8,0,e.viewCacheStatusList),l(n,10,0,e.pools,e.columns,!0,"single"),l(n,12,0,e.permissions.pool,e.selection,e.tableActions),l(n,14,0,e.expandedRow,e.permissions,e.cacheTiers),l(n,17,0,e.permissions.grafana.read)}),(function(l,n){l(n,3,0,u["ɵnov"](n,4).clazz),l(n,5,0,u["ɵnov"](n,6).id,u["ɵnov"](n,6).active,u["ɵnov"](n,6).addClass,u["ɵnov"](n,6).role,u["ɵnov"](n,6).ariaLabelledby)}))}function pu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"cd-pool-list",[],null,null,null,gu,ru)),u["ɵprd"](131584,null,L.a,L.a,[ou.a,su.a]),u["ɵprd"](256,null,z.a,j,[]),u["ɵdid"](3,114688,null,0,G,[m.a,y.a,E.a,L.a,Al.b,s.a,U.a,O.a,z.a,q.a,t.b],null,null)],(function(l,n){l(n,3,0)}),null)}var hu=u["ɵccf"]("cd-pool-list",G,pu,{},{},[]),vu=e("QC43"),bu=e("XFyV"),Cu=e("i4WA"),Ru=e("6qls"),Iu=e("tz6c"),Eu=e("EmSq"),Nu=e("pYKc"),yu=e("ppaS"),Vu=e("BH9v"),wu=e("rFfW"),Tu=u["ɵcrt"]({encapsulation:0,styles:[[".crush-rule-steps[_ngcontent-%COMP%]{margin-top:10px}"]],data:{}});function _u(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,vu.b,vu.a)),u["ɵdid"](1,49152,null,0,bu.a,[],null,null),(l()(),u["ɵted"](-1,0,["Loading..."]))],null,null)}function Su(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Du(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The chosen Ceph pool name is already in use."]))],null,null)}function ku(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["It's not possible to create an RBD pool with '/' in the name. Please change the name or remove 'rbd' from the applications list."]))],null,null)}function qu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Pool name can only contain letters, numbers, '.', '-', '_' or '/'."]))],null,null)}function xu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Pu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Fu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Au(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function Bu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["At least one placement group is needed!"]))],null,null)}function Ou(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Your cluster can't handle this many PGs. Please recalculate the PG amount needed."]))],null,null)}function Lu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The current PGs settings were calculated for you, you should make sure the values suit your needs before submit."]))],null,null)}function zu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,28,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,11,{FormControlNames:1}),u["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","pgNum"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Placement groups"])),(l()(),u["ɵeld"](6,0,null,0,22,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,10,"input",[["class","form-control"],["formControlName","pgNum"],["id","pgNum"],["min","1"],["name","pgNum"],["required",""],["type","number"]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"focus"],[null,"blur"],[null,"input"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0,i=l.component;return"input"===n&&(t=!1!==u["ɵnov"](l,9)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,9)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),"focus"===n&&(t=0!=(i.externalPgChange=!1)&&t),"blur"===n&&(t=!1!==i.alignPgs()&&t),t}),null,null)),u["ɵdid"](8,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](9,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](10,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵdid"](11,16384,null,0,i.z,[],{required:[0,"required"]},null),u["ɵprd"](1024,null,i.o,(function(l){return[l]}),[i.z]),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](14,671744,[[11,4]],0,i.j,[[3,i.d],[6,i.o],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](16,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](17,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Au)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Bu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ou)),u["ɵdid"](23,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](24,0,null,null,2,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,1,"cd-doc",[["docText","Calculation help"],["section","pgs"]],null,null,null,Cu.b,Cu.a)),u["ɵdid"](26,114688,null,0,Ru.a,[Iu.a,s.a],{section:[0,"section"],docText:[1,"docText"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Lu)),u["ɵdid"](28,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,11,0,""),l(n,14,0,"pgNum"),l(n,17,0,"pgNum"),l(n,19,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"required")),l(n,21,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"min")),l(n,23,0,e.form.showError("pgNum",u["ɵnov"](n.parent.parent,2),"34")),l(n,26,0,"pgs","Calculation help"),l(n,28,0,e.externalPgChange)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,7,0,u["ɵnov"](n,11).required?"":null,u["ɵnov"](n,16).ngClassUntouched,u["ɵnov"](n,16).ngClassTouched,u["ɵnov"](n,16).ngClassPristine,u["ɵnov"](n,16).ngClassDirty,u["ɵnov"](n,16).ngClassValid,u["ɵnov"](n,16).ngClassInvalid,u["ɵnov"](n,16).ngClassPending,u["ɵnov"](n,17).validClass,u["ɵnov"](n,17).invalidClass)}))}function Uu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,5,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,4,"ul",[["class","list-inline"]],null,null,null,null,null)),(l()(),u["ɵeld"](2,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](3,null,["Minimum: ",""])),(l()(),u["ɵeld"](4,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](5,null,["Maximum: ",""]))],null,(function(l,n){var e=n.component;l(n,3,0,e.getMinSize()),l(n,5,0,e.getMaxSize())}))}function Mu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](1,null,["The size specified is out of range. A value from "," to "," is usable."]))],null,(function(l,n){var e=n.component;l(n,1,0,e.getMinSize(),e.getMaxSize())}))}function ju(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","text-warning-dark"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A size of 1 will not create a replication of the object. The 'Replicated size' includes the object itself."]))],null,null)}function Gu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,13,{FormControlNames:1}),u["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","size"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Replicated size"])),(l()(),u["ɵeld"](6,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","size"],["id","size"],["name","size"],["type","number"]],[[8,"max",0],[8,"min",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,9)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,9)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),t}),null,null)),u["ɵdid"](8,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](9,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](10,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](12,671744,[[13,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](14,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](15,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Uu)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Mu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ju)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,"size"),l(n,15,0,"size"),l(n,17,0,e.form.showError("size",u["ɵnov"](n.parent.parent,2))),l(n,19,0,e.form.showError("size",u["ɵnov"](n.parent.parent,2))),l(n,21,0,1===e.form.getValue("size"))}),(function(l,n){var e=n.component;l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,7,1,[e.getMaxSize(),e.getMinSize(),u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass])}))}function $u(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,15,{FormControlNames:1}),u["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Flags"])),(l()(),u["ɵeld"](6,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","ecOverwrites"],["id","ec-overwrites"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.checked)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),t}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,i.c,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.c]),u["ɵdid"](12,671744,[[15,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](14,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](15,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](16,0,null,null,1,"label",[["class","custom-control-label"],["for","ec-overwrites"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["EC Overwrites"]))],(function(l,n){l(n,1,0),l(n,12,0,"ecOverwrites"),l(n,15,0,"ecOverwrites")}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function Ku(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,23,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](2,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,9,{FormControlNames:1}),u["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),u["ɵeld"](5,0,null,0,1,"label",[["class","cd-col-form-label"],["for","pgAutoscaleMode"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["PG Autoscale"])),(l()(),u["ɵeld"](7,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","pgAutoscaleMode"],["id","pgAutoscaleMode"],["name","pgAutoscaleMode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),t}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](12,671744,[[9,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](14,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](15,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Fu)),u["ɵdid"](17,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,zu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Gu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,$u)),u["ɵdid"](23,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0),l(n,12,0,"pgAutoscaleMode"),l(n,15,0,"pgAutoscaleMode"),l(n,17,0,e.pgAutoscaleModes),l(n,19,0,"on"!==e.form.getValue("pgAutoscaleMode")),l(n,21,0,e.isReplicated),l(n,23,0,e.info.is_all_bluestore&&e.isErasure)}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).hasErrors,u["ɵnov"](n,2).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function Ju(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Wu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- No erasure code profile available --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Hu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select an erasure code profile --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Yu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.name)}))}function Zu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,4,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.addErasureCodeProfile()&&u),u}),null,null)),(l()(),u["ɵeld"](1,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](3,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](4,1)],(function(l,n){var e=l(n,4,0,n.component.icons.add);l(n,3,0,e)}),null)}function Xu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,16777216,null,null,5,"button",[["class","btn btn-light"],["tooltip","This profile can't be deleted as it is in use."],["triggers",""],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.deleteErasureCodeProfile()&&u),u}),null,null)),u["ɵdid"](1,212992,[[4,4],["ecpDeletionBtn",4]],0,ve.c,[u.ViewContainerRef,pe.a,ve.a,u.ElementRef,u.Renderer2,ge.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"]},null),(l()(),u["ɵeld"](2,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](4,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](5,1),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,1,0,"This profile can't be deleted as it is in use.","");var u=l(n,5,0,e.icons.trash);l(n,4,0,u)}),null)}function Qu(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Profile is not in use."]))],null,null)}function lt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit)}))}function nt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"ul",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,lt)),u["ɵdid"](2,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,2,0,n.component.ecpUsage)}),null)}function et(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,12,"span",[["class","form-text text-muted"],["id","ecp-info-block"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,$e.b,$e.a)),u["ɵdid"](2,180224,[[3,4],["ecpInfoTabs",4]],0,Ie.e,[Ie.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](3,0,null,0,4,"tab",[["class","ecp-info"],["heading","Profile"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](4,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](5,0,null,null,2,"cd-table-key-value",[],null,null,null,Xe.b,Xe.a)),u["ɵdid"](6,638976,null,0,Qe.a,[ue.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"],hideKeys:[3,"hideKeys"]},null),u["ɵpad"](7,1),(l()(),u["ɵeld"](8,0,null,0,4,"tab",[["class","used-by-pools"],["heading","Used by pools"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](9,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](0,[["ecpIsNotUsed",2]],null,0,null,Qu)),(l()(),u["ɵand"](16777216,null,null,1,null,nt)),u["ɵdid"](12,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,4,0,"Profile");var t=e.form.getValue("erasureProfile"),i=l(n,7,0,"name");l(n,6,0,t,!1,!0,i),l(n,9,0,"Used by pools"),l(n,12,0,e.ecpUsage,u["ɵnov"](n,10))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).clazz),l(n,3,0,u["ɵnov"](n,4).id,u["ɵnov"](n,4).active,u["ɵnov"](n,4).addClass,u["ɵnov"](n,4).role,u["ɵnov"](n,4).ariaLabelledby),l(n,8,0,u["ɵnov"](n,9).id,u["ɵnov"](n,9).active,u["ɵnov"](n,9).addClass,u["ɵnov"](n,9).role,u["ɵnov"](n,9).ariaLabelledby)}))}function ut(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,38,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,19,{FormControlNames:1}),u["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","erasureProfile"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Erasure code profile"])),(l()(),u["ɵeld"](6,0,null,0,32,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,29,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","erasureProfile"],["id","erasureProfile"],["name","erasureProfile"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),t}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](12,671744,[[19,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](14,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](15,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ju)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Wu)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Hu)),u["ɵdid"](21,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Yu)),u["ɵdid"](23,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](24,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),u["ɵeld"](25,0,null,null,7,"button",[["class","btn btn-light"],["id","ecp-info-button"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0,t=l.component;return"click"===n&&(u=0!=(t.data.erasureInfo=!t.data.erasureInfo)&&u),u}),null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](27,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),u["ɵpod"](28,{active:0}),(l()(),u["ɵeld"](29,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](31,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](32,1),(l()(),u["ɵand"](16777216,null,null,1,null,Zu)),u["ɵdid"](34,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Xu)),u["ɵdid"](36,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,et)),u["ɵdid"](38,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,12,0,"erasureProfile"),l(n,15,0,"erasureProfile"),l(n,17,0,!e.ecProfiles),l(n,19,0,e.ecProfiles&&0===e.ecProfiles.length),l(n,21,0,e.ecProfiles&&e.ecProfiles.length>0),l(n,23,0,e.ecProfiles);var u=l(n,28,0,e.data.erasureInfo);l(n,27,0,"btn btn-light",u);var t=l(n,32,0,e.icons.questionCircle);l(n,31,0,t),l(n,34,0,!e.editing),l(n,36,0,!e.editing),l(n,38,0,e.data.erasureInfo&&e.form.getValue("erasureProfile"))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass)}))}function tt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,21,{FormControlNames:1}),u["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","crushRule"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush ruleset"])),(l()(),u["ɵeld"](6,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A new crush ruleset will be implicitly created."]))],(function(l,n){l(n,1,0)}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess)}))}function it(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["There are no rules."])),(l()(),u["ɵted"](-1,null,["  "]))],null,null)}function at(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit.rule_name)}))}function ot(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,4,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.addCrushRule()&&u),u}),null,null)),(l()(),u["ɵeld"](1,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](3,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](4,1)],(function(l,n){var e=l(n,4,0,n.component.icons.add);l(n,3,0,e)}),null)}function st(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,16777216,null,null,5,"button",[["class","btn btn-light"],["tooltip","This rule can't be deleted as it is in use."],["triggers",""],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0;return"click"===n&&(u=!1!==l.component.deleteCrushRule()&&u),u}),null,null)),u["ɵdid"](1,212992,[[2,4],["crushDeletionBtn",4]],0,ve.c,[u.ViewContainerRef,pe.a,ve.a,u.ElementRef,u.Renderer2,ge.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"]},null),(l()(),u["ɵeld"](2,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](4,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](5,1),(l()(),u["ɵand"](0,null,null,0))],(function(l,n){var e=n.component;l(n,1,0,"This rule can't be deleted as it is in use.","");var u=l(n,5,0,e.icons.trash);l(n,4,0,u)}),null)}function rt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.describeCrushStep(n.context.$implicit))}))}function dt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Rule is not in use."]))],null,null)}function ct(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"li",[],null,null,null,null,null)),(l()(),u["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit)}))}function mt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,2,"ul",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,ct)),u["ɵdid"](2,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,2,0,n.component.crushUsage)}),null)}function ft(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,17,"span",[["class","form-text text-muted"],["id","crush-info-block"]],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,16,"tabset",[],[[2,"tab-container",null]],null,null,$e.b,$e.a)),u["ɵdid"](2,180224,[[1,4],["crushInfoTabs",4]],0,Ie.e,[Ie.f,u.Renderer2,u.ElementRef],null,null),(l()(),u["ɵeld"](3,0,null,0,4,"tab",[["class","crush-rule-info"],["heading","Crush rule"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](4,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](5,0,null,null,2,"cd-table-key-value",[],null,null,null,Xe.b,Xe.a)),u["ɵdid"](6,638976,null,0,Qe.a,[ue.a],{data:[0,"data"],autoReload:[1,"autoReload"],renderObjects:[2,"renderObjects"],hideKeys:[3,"hideKeys"]},null),u["ɵpad"](7,4),(l()(),u["ɵeld"](8,0,null,0,4,"tab",[["class","crush-rule-steps"],["heading","Crush steps"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](9,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵeld"](10,0,null,null,2,"ol",[],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,rt)),u["ɵdid"](12,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](13,0,null,0,4,"tab",[["class","used-by-pools"],["heading","Used by pools"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),u["ɵdid"](14,212992,null,0,Ie.b,[Ie.e,u.ElementRef,u.Renderer2],{heading:[0,"heading"]},null),(l()(),u["ɵand"](0,[["ruleIsNotUsed",2]],null,0,null,dt)),(l()(),u["ɵand"](16777216,null,null,1,null,mt)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,4,0,"Crush rule");var t=e.form.getValue("crushRule"),i=l(n,7,0,"steps","ruleset","type","rule_name");l(n,6,0,t,!1,!1,i),l(n,9,0,"Crush steps"),l(n,12,0,e.form.get("crushRule").value.steps),l(n,14,0,"Used by pools"),l(n,17,0,e.crushUsage,u["ɵnov"](n,15))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).clazz),l(n,3,0,u["ɵnov"](n,4).id,u["ɵnov"](n,4).active,u["ɵnov"](n,4).addClass,u["ɵnov"](n,4).role,u["ɵnov"](n,4).ariaLabelledby),l(n,8,0,u["ɵnov"](n,9).id,u["ɵnov"](n,9).active,u["ɵnov"](n,9).addClass,u["ɵnov"](n,9).role,u["ɵnov"](n,9).ariaLabelledby),l(n,13,0,u["ɵnov"](n,14).id,u["ɵnov"](n,14).active,u["ɵnov"](n,14).addClass,u["ɵnov"](n,14).role,u["ɵnov"](n,14).ariaLabelledby)}))}function gt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["This field is required!"]))],null,null)}function pt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The rule can't be used in the current cluster as it has too few OSDs to meet the minimum required OSD by this rule."]))],null,null)}function ht(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,34,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,27,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),u["ɵeld"](2,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","crushRule"],["id","crushRule"],["name","crushSet"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,4).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,4).onTouched()&&t),t}),null,null)),u["ɵdid"](3,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](4,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](6,671744,[[23,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](8,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](9,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](10,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](11,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](12,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select a crush rule --"])),(l()(),u["ɵand"](16777216,null,null,1,null,at)),u["ɵdid"](15,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](16,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),u["ɵeld"](17,0,null,null,7,"button",[["class","btn btn-light"],["id","crush-info-button"],["type","button"]],null,[[null,"click"]],(function(l,n,e){var u=!0,t=l.component;return"click"===n&&(u=0!=(t.data.crushInfo=!t.data.crushInfo)&&u),u}),null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](19,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),u["ɵpod"](20,{active:0}),(l()(),u["ɵeld"](21,0,null,null,3,"i",[["aria-hidden","true"]],null,null,null,null,null)),u["ɵprd"](512,null,El["ɵNgClassImpl"],El["ɵNgClassR2Impl"],[u.IterableDiffers,u.KeyValueDiffers,u.ElementRef,u.Renderer2]),u["ɵdid"](23,278528,null,0,El.NgClass,[El["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),u["ɵpad"](24,1),(l()(),u["ɵand"](16777216,null,null,1,null,ot)),u["ɵdid"](26,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,st)),u["ɵdid"](28,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ft)),u["ɵdid"](30,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,gt)),u["ɵdid"](32,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,pt)),u["ɵdid"](34,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,6,0,"crushRule"),l(n,9,0,"crushRule"),l(n,11,0,null),l(n,12,0,null),l(n,15,0,e.current.rules);var t=l(n,20,0,e.data.crushInfo);l(n,19,0,"btn btn-light",t);var i=l(n,24,0,e.icons.questionCircle);l(n,23,0,i),l(n,26,0,e.isReplicated&&!e.editing),l(n,28,0,e.isReplicated&&!e.editing),l(n,30,0,e.data.crushInfo&&e.form.getValue("crushRule")),l(n,32,0,e.form.showError("crushRule",u["ɵnov"](n.parent.parent.parent,2),"required")),l(n,34,0,e.form.showError("crushRule",u["ɵnov"](n.parent.parent.parent,2),"tooFewOsds"))}),(function(l,n){l(n,2,0,u["ɵnov"](n,8).ngClassUntouched,u["ɵnov"](n,8).ngClassTouched,u["ɵnov"](n,8).ngClassPristine,u["ɵnov"](n,8).ngClassDirty,u["ɵnov"](n,8).ngClassValid,u["ɵnov"](n,8).ngClassInvalid,u["ɵnov"](n,8).ngClassPending,u["ɵnov"](n,9).validClass,u["ɵnov"](n,9).invalidClass)}))}function vt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,9,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](1,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,23,{FormControlNames:1}),u["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),u["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","crushRule"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Crush ruleset"])),(l()(),u["ɵeld"](6,0,null,0,3,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵand"](0,[["noRules",2]],null,0,null,it)),(l()(),u["ɵand"](16777216,null,null,1,null,ht)),u["ɵdid"](9,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null)],(function(l,n){var e=n.component;l(n,1,0),l(n,9,0,e.current.rules.length>0,u["ɵnov"](n,7))}),(function(l,n){l(n,0,0,u["ɵnov"](n,1).hasErrors,u["ɵnov"](n,1).hasSuccess)}))}function bt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,8,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["CRUSH"])),(l()(),u["ɵand"](16777216,null,null,1,null,ut)),u["ɵdid"](4,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,tt)),u["ɵdid"](6,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,vt)),u["ɵdid"](8,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,4,0,e.isErasure),l(n,6,0,e.isErasure&&!e.editing),l(n,8,0,e.isReplicated||e.editing)}),null)}function Ct(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Rt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function It(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- No erasure compression algorithm available --"]))],(function(l,n){l(n,1,0,""),l(n,2,0,"")}),null)}function Et(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),u["ɵdid"](1,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{value:[0,"value"]},null),u["ɵdid"](2,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),u["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Nt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than 0"]))],null,null)}function yt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be less than the maximum blob size"]))],null,null)}function Vt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than 0"]))],null,null)}function wt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be greater than the minimum blob size"]))],null,null)}function Tt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Value should be between 0.0 and 1.0"]))],null,null)}function _t(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,79,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](1,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](2,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,27,{FormControlNames:1}),u["ɵqud"](603979776,28,{messagesBlock:0}),(l()(),u["ɵeld"](5,0,null,0,1,"label",[["class","cd-col-form-label"],["for","algorithm"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Algorithm"])),(l()(),u["ɵeld"](7,0,null,0,14,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](8,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","algorithm"],["id","algorithm"],["name","algorithm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,10).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,10).onTouched()&&t),t}),null,null)),u["ɵdid"](9,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](10,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](12,671744,[[27,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](14,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](15,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Rt)),u["ɵdid"](17,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,It)),u["ɵdid"](19,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Et)),u["ɵdid"](21,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵeld"](22,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](23,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,29,{FormControlNames:1}),u["ɵqud"](603979776,30,{messagesBlock:0}),(l()(),u["ɵeld"](26,0,null,0,1,"label",[["class","cd-col-form-label"],["for","minBlobSize"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Minimum blob size"])),(l()(),u["ɵeld"](28,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](29,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","KiB"],["formControlName","minBlobSize"],["id","minBlobSize"],["min","0"],["name","minBlobSize"],["placeholder","e.g., 128KiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,30)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,30).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,30)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,30)._compositionEnd(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,34).onBlur(e.target.value)&&t),t}),null,null)),u["ɵdid"](30,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](32,671744,[[29,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](34,81920,null,0,Eu.a,[u.ElementRef,i.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](35,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](36,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](37,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Nt)),u["ɵdid"](39,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,yt)),u["ɵdid"](41,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](42,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](43,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,31,{FormControlNames:1}),u["ɵqud"](603979776,32,{messagesBlock:0}),(l()(),u["ɵeld"](46,0,null,0,1,"label",[["class","cd-col-form-label"],["for","maxBlobSize"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Maximum blob size"])),(l()(),u["ɵeld"](48,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](49,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","KiB"],["formControlName","maxBlobSize"],["id","maxBlobSize"],["min","0"],["placeholder","e.g., 512KiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,50)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,50).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,50)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,50)._compositionEnd(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,54).onBlur(e.target.value)&&t),t}),null,null)),u["ɵdid"](50,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](52,671744,[[31,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](54,81920,null,0,Eu.a,[u.ElementRef,i.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](55,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](56,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](57,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Vt)),u["ɵdid"](59,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,wt)),u["ɵdid"](61,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](62,0,null,null,17,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](63,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,33,{FormControlNames:1}),u["ɵqud"](603979776,34,{messagesBlock:0}),(l()(),u["ɵeld"](66,0,null,0,1,"label",[["class","cd-col-form-label"],["for","ratio"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Ratio"])),(l()(),u["ɵeld"](68,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](69,0,null,null,8,"input",[["class","form-control"],["formControlName","ratio"],["id","ratio"],["max","1"],["min","0"],["name","ratio"],["placeholder","Compression ratio"],["step","0.1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,71)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,71).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,71)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,71)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,72).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,72).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,72).onTouched()&&t),t}),null,null)),u["ɵdid"](70,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](71,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](72,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](74,671744,[[33,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](76,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](77,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Tt)),u["ɵdid"](79,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,2,0),l(n,12,0,"algorithm"),l(n,15,0,"algorithm"),l(n,17,0,!e.info.compression_algorithms),l(n,19,0,e.info.compression_algorithms&&0===e.info.compression_algorithms.length),l(n,21,0,e.info.compression_algorithms),l(n,23,0),l(n,32,0,"minBlobSize"),l(n,34,0,"KiB"),l(n,37,0,"minBlobSize"),l(n,39,0,e.form.showError("minBlobSize",u["ɵnov"](n.parent.parent,2),"min")),l(n,41,0,e.form.showError("minBlobSize",u["ɵnov"](n.parent.parent,2),"maximum")),l(n,43,0),l(n,52,0,"maxBlobSize"),l(n,54,0,"KiB"),l(n,57,0,"maxBlobSize"),l(n,59,0,e.form.showError("maxBlobSize",u["ɵnov"](n.parent.parent,2),"min")),l(n,61,0,e.form.showError("maxBlobSize",u["ɵnov"](n.parent.parent,2),"minimum")),l(n,63,0),l(n,74,0,"ratio"),l(n,77,0,"ratio"),l(n,79,0,e.form.showError("ratio",u["ɵnov"](n.parent.parent,2),"min")||e.form.showError("ratio",u["ɵnov"](n.parent.parent,2),"max"))}),(function(l,n){l(n,1,0,u["ɵnov"](n,2).hasErrors,u["ɵnov"](n,2).hasSuccess),l(n,8,0,u["ɵnov"](n,14).ngClassUntouched,u["ɵnov"](n,14).ngClassTouched,u["ɵnov"](n,14).ngClassPristine,u["ɵnov"](n,14).ngClassDirty,u["ɵnov"](n,14).ngClassValid,u["ɵnov"](n,14).ngClassInvalid,u["ɵnov"](n,14).ngClassPending,u["ɵnov"](n,15).validClass,u["ɵnov"](n,15).invalidClass),l(n,22,0,u["ɵnov"](n,23).hasErrors,u["ɵnov"](n,23).hasSuccess),l(n,29,0,u["ɵnov"](n,36).ngClassUntouched,u["ɵnov"](n,36).ngClassTouched,u["ɵnov"](n,36).ngClassPristine,u["ɵnov"](n,36).ngClassDirty,u["ɵnov"](n,36).ngClassValid,u["ɵnov"](n,36).ngClassInvalid,u["ɵnov"](n,36).ngClassPending,u["ɵnov"](n,37).validClass,u["ɵnov"](n,37).invalidClass),l(n,42,0,u["ɵnov"](n,43).hasErrors,u["ɵnov"](n,43).hasSuccess),l(n,49,0,u["ɵnov"](n,56).ngClassUntouched,u["ɵnov"](n,56).ngClassTouched,u["ɵnov"](n,56).ngClassPristine,u["ɵnov"](n,56).ngClassDirty,u["ɵnov"](n,56).ngClassValid,u["ɵnov"](n,56).ngClassInvalid,u["ɵnov"](n,56).ngClassPending,u["ɵnov"](n,57).validClass,u["ɵnov"](n,57).invalidClass),l(n,62,0,u["ɵnov"](n,63).hasErrors,u["ɵnov"](n,63).hasSuccess),l(n,69,0,u["ɵnov"](n,76).ngClassUntouched,u["ɵnov"](n,76).ngClassTouched,u["ɵnov"](n,76).ngClassPristine,u["ɵnov"](n,76).ngClassDirty,u["ɵnov"](n,76).ngClassValid,u["ɵnov"](n,76).ngClassInvalid,u["ɵnov"](n,76).ngClassPending,u["ɵnov"](n,77).validClass,u["ɵnov"](n,77).invalidClass)}))}function St(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,24,"div",[["formGroupName","compression"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),u["ɵdid"](1,212992,null,0,i.m,[[3,i.d],[8,null],[8,null]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.d,null,[i.m]),u["ɵdid"](3,16384,null,0,i.s,[[4,i.d]],null,null),(l()(),u["ɵeld"](4,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Compression"])),(l()(),u["ɵeld"](6,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](7,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,25,{FormControlNames:1}),u["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),u["ɵeld"](10,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mode"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Mode"])),(l()(),u["ɵeld"](12,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](13,0,null,null,9,"select",[["class","form-control custom-select"],["formControlName","mode"],["id","mode"],["name","mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,15).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,15).onTouched()&&t),t}),null,null)),u["ɵdid"](14,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](15,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](17,671744,[[25,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](19,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](20,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ct)),u["ɵdid"](22,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,_t)),u["ɵdid"](24,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,1,0,"compression"),l(n,7,0),l(n,17,0,"mode"),l(n,20,0,"mode"),l(n,22,0,e.info.compression_modes),l(n,24,0,e.hasCompressionEnabled())}),(function(l,n){l(n,0,0,u["ɵnov"](n,3).ngClassUntouched,u["ɵnov"](n,3).ngClassTouched,u["ɵnov"](n,3).ngClassPristine,u["ɵnov"](n,3).ngClassDirty,u["ɵnov"](n,3).ngClassValid,u["ɵnov"](n,3).ngClassInvalid,u["ɵnov"](n,3).ngClassPending),l(n,6,0,u["ɵnov"](n,7).hasErrors,u["ɵnov"](n,7).hasSuccess),l(n,13,0,u["ɵnov"](n,19).ngClassUntouched,u["ɵnov"](n,19).ngClassTouched,u["ɵnov"](n,19).ngClassPristine,u["ɵnov"](n,19).ngClassDirty,u["ɵnov"](n,19).ngClassValid,u["ɵnov"](n,19).ngClassInvalid,u["ɵnov"](n,19).ngClassPending,u["ɵnov"](n,20).validClass,u["ɵnov"](n,20).invalidClass)}))}function Dt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["The value should be greater or equal to 0"]))],null,null)}function kt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,138,"form",[["name","form"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,e){var t=!0;return"submit"===n&&(t=!1!==u["ɵnov"](l,2).onSubmit(e)&&t),"reset"===n&&(t=!1!==u["ɵnov"](l,2).onReset()&&t),"submit"===n&&(t=!1!==u["ɵnov"](l,5).onSubmit()&&t),t}),null,null)),u["ɵdid"](1,16384,null,0,i.G,[],null,null),u["ɵdid"](2,540672,[["formDir",4]],0,i.l,[[8,null],[8,null]],{form:[0,"form"]},null),u["ɵprd"](2048,null,i.d,null,[i.l]),u["ɵdid"](4,16384,null,0,i.s,[[4,i.d]],null,null),u["ɵdid"](5,16384,null,0,Vl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),u["ɵeld"](6,0,null,null,132,"div",[["class","card"]],null,null,null,null,null)),(l()(),u["ɵeld"](7,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),u["ɵted"](8,null,[""," ",""])),u["ɵppd"](9,1),u["ɵppd"](10,1),(l()(),u["ɵeld"](11,0,null,null,118,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),u["ɵeld"](12,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](13,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,5,{FormControlNames:1}),u["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),u["ɵeld"](16,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","name"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Name"])),(l()(),u["ɵeld"](18,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](19,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,22)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,22).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,22)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,22)._compositionEnd(e.target.value)&&t),t}),null,null)),u["ɵdid"](20,4210688,null,0,Tl.a,[u.ElementRef],{autofocus:[0,"autofocus"]},null),u["ɵdid"](21,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](22,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](24,671744,[[5,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](26,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](27,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Su)),u["ɵdid"](29,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Du)),u["ɵdid"](31,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,ku)),u["ɵdid"](33,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,qu)),u["ɵdid"](35,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](36,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](37,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,7,{FormControlNames:1}),u["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),u["ɵeld"](40,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","poolType"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Pool type"])),(l()(),u["ɵeld"](42,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](43,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","poolType"],["id","poolType"],["name","poolType"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,e){var t=!0;return"change"===n&&(t=!1!==u["ɵnov"](l,45).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,45).onTouched()&&t),t}),null,null)),u["ɵdid"](44,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](45,16384,null,0,i.A,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.A]),u["ɵdid"](47,671744,[[7,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](49,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](50,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](51,0,null,null,3,"option",[["ngValue",""]],null,null,null,null,null)),u["ɵdid"](52,147456,null,0,i.v,[u.ElementRef,u.Renderer2,[2,i.A]],{ngValue:[0,"ngValue"]},null),u["ɵdid"](53,147456,null,0,i.F,[u.ElementRef,u.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),u["ɵted"](-1,null,["-- Select a pool type --"])),(l()(),u["ɵand"](16777216,null,null,1,null,xu)),u["ɵdid"](56,278528,null,0,El.NgForOf,[u.ViewContainerRef,u.TemplateRef,u.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Pu)),u["ɵdid"](58,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Ku)),u["ɵdid"](60,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](61,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](62,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,17,{FormControlNames:1}),u["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),u["ɵeld"](65,0,null,0,1,"label",[["class","cd-col-form-label"],["for","applications"]],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Applications"])),(l()(),u["ɵeld"](67,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](68,0,null,null,1,"cd-select-badges",[["id","applications"]],null,[[null,"selection"]],(function(l,n,e){var u=!0;return"selection"===n&&(u=!1!==l.component.appSelection()&&u),u}),Nu.b,Nu.a)),u["ɵdid"](69,49152,null,0,yu.a,[s.a],{data:[0,"data"],options:[1,"options"],messages:[2,"messages"],selectionLimit:[3,"selectionLimit"],customBadges:[4,"customBadges"],customBadgeValidators:[5,"customBadgeValidators"]},{selection:"selection"}),(l()(),u["ɵand"](16777216,null,null,1,null,bt)),u["ɵdid"](71,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,St)),u["ɵdid"](73,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](74,0,null,null,52,"div",[],null,null,null,null,null)),(l()(),u["ɵeld"](75,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Quotas"])),(l()(),u["ɵeld"](77,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](78,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,35,{FormControlNames:1}),u["ɵqud"](603979776,36,{messagesBlock:0}),(l()(),u["ɵeld"](81,0,null,0,9,"label",[["class","cd-col-form-label"],["for","max_bytes"]],null,null,null,null,null)),(l()(),u["ɵeld"](82,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Max bytes"])),(l()(),u["ɵeld"](84,0,null,null,6,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](85,49152,null,0,kl.a,[],null,null),(l()(),u["ɵeld"](86,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Leave it blank or specify 0 to disable this quota."])),(l()(),u["ɵeld"](88,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),u["ɵeld"](89,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A valid quota should be greater than 0."])),(l()(),u["ɵeld"](91,0,null,0,9,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](92,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["defaultUnit","GiB"],["formControlName","max_bytes"],["id","max_bytes"],["name","max_bytes"],["placeholder","e.g., 10GiB"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,93)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,93).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,93)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,93)._compositionEnd(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,97).onBlur(e.target.value)&&t),t}),null,null)),u["ɵdid"](93,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵprd"](1024,null,i.p,(function(l){return[l]}),[i.e]),u["ɵdid"](95,671744,[[35,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](97,81920,null,0,Eu.a,[u.ElementRef,i.q,I.a,N.a],{defaultUnit:[0,"defaultUnit"]},null),u["ɵdid"](98,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](99,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](100,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵeld"](101,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,wl.b,wl.a)),u["ɵdid"](102,1163264,null,2,Vl.c,[u.ElementRef,Vl.g],null,null),u["ɵqud"](603979776,37,{FormControlNames:1}),u["ɵqud"](603979776,38,{messagesBlock:0}),(l()(),u["ɵeld"](105,0,null,0,9,"label",[["class","cd-col-form-label"],["for","max_objects"]],null,null,null,null,null)),(l()(),u["ɵeld"](106,0,null,null,1,null,null,null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Max objects"])),(l()(),u["ɵeld"](108,0,null,null,6,"cd-helper",[],null,null,null,Dl.b,Dl.a)),u["ɵdid"](109,49152,null,0,kl.a,[],null,null),(l()(),u["ɵeld"](110,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["Leave it blank or specify 0 to disable this quota."])),(l()(),u["ɵeld"](112,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),u["ɵeld"](113,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),u["ɵted"](-1,null,["A valid quota should be greater than 0."])),(l()(),u["ɵeld"](115,0,null,0,11,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),u["ɵeld"](116,0,null,null,8,"input",[["class","form-control"],["formControlName","max_objects"],["id","max_objects"],["min","0"],["name","max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,e){var t=!0;return"input"===n&&(t=!1!==u["ɵnov"](l,118)._handleInput(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,118).onTouched()&&t),"compositionstart"===n&&(t=!1!==u["ɵnov"](l,118)._compositionStart()&&t),"compositionend"===n&&(t=!1!==u["ɵnov"](l,118)._compositionEnd(e.target.value)&&t),"change"===n&&(t=!1!==u["ɵnov"](l,119).onChange(e.target.value)&&t),"input"===n&&(t=!1!==u["ɵnov"](l,119).onChange(e.target.value)&&t),"blur"===n&&(t=!1!==u["ɵnov"](l,119).onTouched()&&t),t}),null,null)),u["ɵdid"](117,4210688,null,0,_l.a,[[2,Sl.a],E.a,u.ElementRef],null,null),u["ɵdid"](118,16384,null,0,i.e,[u.Renderer2,u.ElementRef,[2,i.b]],null,null),u["ɵdid"](119,16384,null,0,i.w,[u.Renderer2,u.ElementRef],null,null),u["ɵprd"](1024,null,i.p,(function(l,n){return[l,n]}),[i.e,i.w]),u["ɵdid"](121,671744,[[37,4]],0,i.j,[[3,i.d],[8,null],[8,null],[6,i.p],[2,i.E]],{name:[0,"name"]},null),u["ɵprd"](2048,null,i.q,null,[i.j]),u["ɵdid"](123,16384,null,0,i.r,[[4,i.q]],null,null),u["ɵdid"](124,16384,null,0,Vl.h,[[3,i.d],Vl.a],{formControlName:[0,"formControlName"]},null),(l()(),u["ɵand"](16777216,null,null,1,null,Dt)),u["ɵdid"](126,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](127,0,null,null,2,"div",[],[[8,"hidden",0]],null,null,null,null)),(l()(),u["ɵeld"](128,0,null,null,1,"cd-rbd-configuration-form",[],null,[[null,"changes"]],(function(l,n,e){var u=!0;return"changes"===n&&(u=!1!==(l.component.currentConfigurationValues=e())&&u),u}),Vu.b,Vu.a)),u["ɵdid"](129,114688,null,0,wu.a,[N.a,Ze.a],{form:[0,"form"],initializeData:[1,"initializeData"]},{changes:"changes"}),(l()(),u["ɵeld"](130,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),u["ɵeld"](131,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),u["ɵeld"](132,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,e){var u=!0;return"submitAction"===n&&(u=!1!==l.component.submit()&&u),u}),ql.b,ql.a)),u["ɵdid"](133,114688,null,0,xl.a,[u.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),u["ɵted"](134,0,[""," "," "])),u["ɵppd"](135,1),u["ɵppd"](136,1),(l()(),u["ɵeld"](137,0,null,null,1,"cd-back-button",[],null,null,null,Pl.b,Pl.a)),u["ɵdid"](138,49152,null,0,Fl.a,[El.Location,t.b],null,null)],(function(l,n){var e=n.component;l(n,2,0,e.form),l(n,5,0,e.form),l(n,13,0),l(n,20,0,""),l(n,24,0,"name"),l(n,27,0,"name"),l(n,29,0,e.form.showError("name",u["ɵnov"](n,2),"required")),l(n,31,0,e.form.showError("name",u["ɵnov"](n,2),"uniqueName")),l(n,33,0,e.form.showError("name",u["ɵnov"](n,2),"rbdPool")),l(n,35,0,e.form.showError("name",u["ɵnov"](n,2),"pattern")),l(n,37,0),l(n,47,0,"poolType"),l(n,50,0,"poolType"),l(n,52,0,""),l(n,53,0,""),l(n,56,0,e.data.poolTypes),l(n,58,0,e.form.showError("poolType",u["ɵnov"](n,2),"required")),l(n,60,0,e.isReplicated||e.isErasure),l(n,62,0),l(n,69,0,e.data.applications.selected,e.data.applications.available,e.data.applications.messages,4,!0,e.data.applications.validators),l(n,71,0,e.isErasure||e.isReplicated),l(n,73,0,e.info.is_all_bluestore),l(n,78,0),l(n,95,0,"max_bytes"),l(n,97,0,"GiB"),l(n,100,0,"max_bytes"),l(n,102,0),l(n,121,0,"max_objects"),l(n,124,0,"max_objects"),l(n,126,0,e.form.showError("max_objects",u["ɵnov"](n,2),"min")),l(n,129,0,e.form,e.initializeConfigData),l(n,133,0,u["ɵnov"](n,2))}),(function(l,n){var e=n.component;l(n,0,0,u["ɵnov"](n,4).ngClassUntouched,u["ɵnov"](n,4).ngClassTouched,u["ɵnov"](n,4).ngClassPristine,u["ɵnov"](n,4).ngClassDirty,u["ɵnov"](n,4).ngClassValid,u["ɵnov"](n,4).ngClassInvalid,u["ɵnov"](n,4).ngClassPending);var t=u["ɵunv"](n,8,0,l(n,9,0,u["ɵnov"](n.parent,0),e.action)),i=u["ɵunv"](n,8,1,l(n,10,0,u["ɵnov"](n.parent,1),e.resource));l(n,8,0,t,i),l(n,12,0,u["ɵnov"](n,13).hasErrors,u["ɵnov"](n,13).hasSuccess),l(n,19,0,u["ɵnov"](n,26).ngClassUntouched,u["ɵnov"](n,26).ngClassTouched,u["ɵnov"](n,26).ngClassPristine,u["ɵnov"](n,26).ngClassDirty,u["ɵnov"](n,26).ngClassValid,u["ɵnov"](n,26).ngClassInvalid,u["ɵnov"](n,26).ngClassPending,u["ɵnov"](n,27).validClass,u["ɵnov"](n,27).invalidClass),l(n,36,0,u["ɵnov"](n,37).hasErrors,u["ɵnov"](n,37).hasSuccess),l(n,43,0,u["ɵnov"](n,49).ngClassUntouched,u["ɵnov"](n,49).ngClassTouched,u["ɵnov"](n,49).ngClassPristine,u["ɵnov"](n,49).ngClassDirty,u["ɵnov"](n,49).ngClassValid,u["ɵnov"](n,49).ngClassInvalid,u["ɵnov"](n,49).ngClassPending,u["ɵnov"](n,50).validClass,u["ɵnov"](n,50).invalidClass),l(n,61,0,u["ɵnov"](n,62).hasErrors,u["ɵnov"](n,62).hasSuccess),l(n,77,0,u["ɵnov"](n,78).hasErrors,u["ɵnov"](n,78).hasSuccess),l(n,92,0,u["ɵnov"](n,99).ngClassUntouched,u["ɵnov"](n,99).ngClassTouched,u["ɵnov"](n,99).ngClassPristine,u["ɵnov"](n,99).ngClassDirty,u["ɵnov"](n,99).ngClassValid,u["ɵnov"](n,99).ngClassInvalid,u["ɵnov"](n,99).ngClassPending,u["ɵnov"](n,100).validClass,u["ɵnov"](n,100).invalidClass),l(n,101,0,u["ɵnov"](n,102).hasErrors,u["ɵnov"](n,102).hasSuccess),l(n,116,0,u["ɵnov"](n,123).ngClassUntouched,u["ɵnov"](n,123).ngClassTouched,u["ɵnov"](n,123).ngClassPristine,u["ɵnov"](n,123).ngClassDirty,u["ɵnov"](n,123).ngClassValid,u["ɵnov"](n,123).ngClassInvalid,u["ɵnov"](n,123).ngClassPending,u["ɵnov"](n,124).validClass,u["ɵnov"](n,124).invalidClass),l(n,127,0,e.isErasure||-1===e.data.applications.selected.indexOf("rbd"));var a=u["ɵunv"](n,134,0,l(n,135,0,u["ɵnov"](n.parent,0),e.action)),o=u["ɵunv"](n,134,1,l(n,136,0,u["ɵnov"](n.parent,1),e.resource));l(n,134,0,a,o)}))}function qt(l){return u["ɵvid"](0,[u["ɵpid"](0,El.TitleCasePipe,[]),u["ɵpid"](0,Nl.a,[]),u["ɵqud"](671088640,1,{crushInfoTabs:0}),u["ɵqud"](671088640,2,{crushDeletionBtn:0}),u["ɵqud"](671088640,3,{ecpInfoTabs:0}),u["ɵqud"](671088640,4,{ecpDeletionBtn:0}),(l()(),u["ɵand"](16777216,null,null,1,null,_u)),u["ɵdid"](7,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),u["ɵeld"](8,0,null,null,2,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),u["ɵand"](16777216,null,null,1,null,kt)),u["ɵdid"](10,16384,null,0,El.NgIf,[u.ViewContainerRef,u.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var e=n.component;l(n,7,0,!(e.info&&e.ecProfiles)),l(n,10,0,e.info&&e.ecProfiles)}),null)}function xt(l){return u["ɵvid"](0,[(l()(),u["ɵeld"](0,0,null,null,1,"cd-pool-form",[],null,null,null,qt,Tu)),u["ɵdid"](1,114688,null,0,k,[I.a,Re.a,Re.m,Al.b,m.a,E.a,N.a,Al.b,y.a,c,d,s.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var Pt=u["ɵccf"]("cd-pool-form",k,xt,{},{},[]);e.d(n,"PoolModuleNgFactory",(function(){return Ft})),e.d(n,"RoutedPoolModuleNgFactory",(function(){return At}));var Ft=u["ɵcmf"]($,[],(function(l){return u["ɵmod"]([u["ɵmpd"](512,u.ComponentFactoryResolver,u["ɵCodegenComponentFactoryResolver"],[[8,[H.a,Y.a,Z.a,X.a,Q.a,Q.b,ll.a,nl.a,el.a,ul.a,tl.a,il.a,al.a,ol.a,sl.a,rl.a,dl.a,cl.a,cl.c,cl.b,cl.d,ml.a,fl.a,gl.a,pl.a,hl.a,vl.a,bl.a,Cl.a,Rl.a,Il.a,Yl,$n]],[3,u.ComponentFactoryResolver],u.NgModuleRef]),u["ɵmpd"](4608,El.NgLocalization,El.NgLocaleLocalization,[u.LOCALE_ID,[2,El["ɵangular_packages_common_common_a"]]]),u["ɵmpd"](4608,Kn.y,Kn.y,[El.DOCUMENT]),u["ɵmpd"](4608,Kn.r,Kn.r,[]),u["ɵmpd"](4608,Kn.a,Kn.a,[]),u["ɵmpd"](4608,i.D,i.D,[]),u["ɵmpd"](4608,Jn.a,Jn.a,[]),u["ɵmpd"](4608,Wn.a,Wn.a,[]),u["ɵmpd"](4608,Hn.a,Hn.a,[s.a]),u["ɵmpd"](4608,El.DatePipe,El.DatePipe,[u.LOCALE_ID]),u["ɵmpd"](4608,Yn.a,Yn.a,[]),u["ɵmpd"](4608,Zn.a,Zn.a,[]),u["ɵmpd"](4608,N.a,N.a,[]),u["ɵmpd"](4608,I.a,I.a,[N.a]),u["ɵmpd"](4608,Xn.a,Xn.a,[N.a]),u["ɵmpd"](4608,O.a,O.a,[N.a]),u["ɵmpd"](4608,Qn.a,Qn.a,[]),u["ɵmpd"](4608,le.a,le.a,[]),u["ɵmpd"](4608,ne.a,ne.a,[]),u["ɵmpd"](4608,ee.a,ee.a,[]),u["ɵmpd"](4608,ue.a,ue.a,[El.DatePipe]),u["ɵmpd"](4608,te.a,te.a,[]),u["ɵmpd"](4608,ie.a,ie.a,[]),u["ɵmpd"](4608,ae.a,ae.a,[]),u["ɵmpd"](4608,oe.a,oe.a,[]),u["ɵmpd"](4608,se.a,se.a,[]),u["ɵmpd"](4608,re.a,re.a,[s.a]),u["ɵmpd"](4608,Nl.a,Nl.a,[]),u["ɵmpd"](4608,de.a,de.a,[]),u["ɵmpd"](4608,ce.a,ce.a,[]),u["ɵmpd"](4608,i.h,i.h,[]),u["ɵmpd"](4608,me.b,me.b,[]),u["ɵmpd"](4608,fe.a,fe.a,[]),u["ɵmpd"](4608,ge.a,ge.a,[u.NgZone,u.RendererFactory2,u.PLATFORM_ID]),u["ɵmpd"](4608,pe.a,pe.a,[u.ComponentFactoryResolver,u.NgZone,u.Injector,ge.a,u.ApplicationRef]),u["ɵmpd"](4608,he.c,he.c,[]),u["ɵmpd"](4608,ve.a,ve.a,[]),u["ɵmpd"](4608,Al.b,Al.b,[u.RendererFactory2,pe.a]),u["ɵmpd"](4608,be.f,be.f,[]),u["ɵmpd"](4608,E.a,E.a,[]),u["ɵmpd"](4608,Ce.a,Ce.a,[Re.m,E.a]),u["ɵmpd"](4608,Ie.f,Ie.f,[]),u["ɵmpd"](4608,Ee.t,Ee.t,[]),u["ɵmpd"](4608,Ee.v,Ee.v,[]),u["ɵmpd"](4608,Ee.a,Ee.a,[]),u["ɵmpd"](4608,Ee.h,Ee.h,[]),u["ɵmpd"](4608,Ee.d,Ee.d,[]),u["ɵmpd"](4608,Ee.j,Ee.j,[]),u["ɵmpd"](4608,Ee.l,Ee.l,[]),u["ɵmpd"](4608,Ee.u,Ee.u,[Ee.v,Ee.l]),u["ɵmpd"](4608,Ne.a,Ne.a,[]),u["ɵmpd"](1073742336,El.CommonModule,El.CommonModule,[]),u["ɵmpd"](1073742336,Kn.u,Kn.u,[]),u["ɵmpd"](1073742336,i.C,i.C,[]),u["ɵmpd"](1073742336,i.n,i.n,[]),u["ɵmpd"](1073742336,be.e,be.e,[]),u["ɵmpd"](1073742336,ye.a,ye.a,[]),u["ɵmpd"](1073742336,i.y,i.y,[]),u["ɵmpd"](1073742336,me.c,me.c,[]),u["ɵmpd"](1073742336,fe.d,fe.d,[]),u["ɵmpd"](1073742336,he.d,he.d,[]),u["ɵmpd"](1073742336,ve.d,ve.d,[]),u["ɵmpd"](1073742336,Ve.b,Ve.b,[]),u["ɵmpd"](1073742336,Al.e,Al.e,[]),u["ɵmpd"](1073742336,we.a,we.a,[]),u["ɵmpd"](1073742336,Vl.f,Vl.f,[]),u["ɵmpd"](1073742336,Te.ClickOutsideModule,Te.ClickOutsideModule,[]),u["ɵmpd"](1073742336,_e.b,_e.b,[]),u["ɵmpd"](1073742336,Re.q,Re.q,[[2,Re.v],[2,Re.m]]),u["ɵmpd"](1073742336,Se.a,Se.a,[]),u["ɵmpd"](1073742336,De.a,De.a,[]),u["ɵmpd"](1073742336,r.a,r.a,[]),u["ɵmpd"](1073742336,ke.a,ke.a,[]),u["ɵmpd"](1073742336,Ie.d,Ie.d,[]),u["ɵmpd"](1073742336,qe.a,qe.a,[]),u["ɵmpd"](1073742336,xe.a,xe.a,[]),u["ɵmpd"](1073742336,Pe.a,Pe.a,[]),u["ɵmpd"](1073742336,Ee.g,Ee.g,[]),u["ɵmpd"](1073742336,Fe.b,Fe.b,[]),u["ɵmpd"](1073742336,Ae.a,Ae.a,[]),u["ɵmpd"](1073742336,$,$,[]),u["ɵmpd"](256,u.LOCALE_ID,"en-US",[]),u["ɵmpd"](256,be.a,{autoClose:!0,insideClick:!1},[]),u["ɵmpd"](256,u.TRANSLATIONS_FORMAT,"xlf",[])])})),At=u["ɵcmf"](W,[],(function(l){return u["ɵmod"]([u["ɵmpd"](512,u.ComponentFactoryResolver,u["ɵCodegenComponentFactoryResolver"],[[8,[H.a,Y.a,Z.a,X.a,Q.a,Q.b,ll.a,nl.a,el.a,ul.a,tl.a,il.a,al.a,ol.a,sl.a,rl.a,dl.a,cl.a,cl.c,cl.b,cl.d,ml.a,fl.a,gl.a,pl.a,hl.a,vl.a,bl.a,Cl.a,Rl.a,Il.a,Yl,$n,hu,Pt]],[3,u.ComponentFactoryResolver],u.NgModuleRef]),u["ɵmpd"](4608,El.NgLocalization,El.NgLocaleLocalization,[u.LOCALE_ID,[2,El["ɵangular_packages_common_common_a"]]]),u["ɵmpd"](4608,Kn.y,Kn.y,[El.DOCUMENT]),u["ɵmpd"](4608,Kn.r,Kn.r,[]),u["ɵmpd"](4608,Kn.a,Kn.a,[]),u["ɵmpd"](4608,i.D,i.D,[]),u["ɵmpd"](4608,Jn.a,Jn.a,[]),u["ɵmpd"](4608,Wn.a,Wn.a,[]),u["ɵmpd"](4608,Hn.a,Hn.a,[s.a]),u["ɵmpd"](4608,El.DatePipe,El.DatePipe,[u.LOCALE_ID]),u["ɵmpd"](4608,Yn.a,Yn.a,[]),u["ɵmpd"](4608,Zn.a,Zn.a,[]),u["ɵmpd"](4608,N.a,N.a,[]),u["ɵmpd"](4608,I.a,I.a,[N.a]),u["ɵmpd"](4608,Xn.a,Xn.a,[N.a]),u["ɵmpd"](4608,O.a,O.a,[N.a]),u["ɵmpd"](4608,Qn.a,Qn.a,[]),u["ɵmpd"](4608,le.a,le.a,[]),u["ɵmpd"](4608,ne.a,ne.a,[]),u["ɵmpd"](4608,ee.a,ee.a,[]),u["ɵmpd"](4608,ue.a,ue.a,[El.DatePipe]),u["ɵmpd"](4608,te.a,te.a,[]),u["ɵmpd"](4608,ie.a,ie.a,[]),u["ɵmpd"](4608,ae.a,ae.a,[]),u["ɵmpd"](4608,oe.a,oe.a,[]),u["ɵmpd"](4608,se.a,se.a,[]),u["ɵmpd"](4608,re.a,re.a,[s.a]),u["ɵmpd"](4608,Nl.a,Nl.a,[]),u["ɵmpd"](4608,de.a,de.a,[]),u["ɵmpd"](4608,ce.a,ce.a,[]),u["ɵmpd"](4608,i.h,i.h,[]),u["ɵmpd"](4608,me.b,me.b,[]),u["ɵmpd"](4608,fe.a,fe.a,[]),u["ɵmpd"](4608,ge.a,ge.a,[u.NgZone,u.RendererFactory2,u.PLATFORM_ID]),u["ɵmpd"](4608,pe.a,pe.a,[u.ComponentFactoryResolver,u.NgZone,u.Injector,ge.a,u.ApplicationRef]),u["ɵmpd"](4608,he.c,he.c,[]),u["ɵmpd"](4608,ve.a,ve.a,[]),u["ɵmpd"](4608,Al.b,Al.b,[u.RendererFactory2,pe.a]),u["ɵmpd"](4608,be.f,be.f,[]),u["ɵmpd"](4608,E.a,E.a,[]),u["ɵmpd"](4608,Ce.a,Ce.a,[Re.m,E.a]),u["ɵmpd"](4608,Ie.f,Ie.f,[]),u["ɵmpd"](4608,Ee.t,Ee.t,[]),u["ɵmpd"](4608,Ee.v,Ee.v,[]),u["ɵmpd"](4608,Ee.a,Ee.a,[]),u["ɵmpd"](4608,Ee.h,Ee.h,[]),u["ɵmpd"](4608,Ee.d,Ee.d,[]),u["ɵmpd"](4608,Ee.j,Ee.j,[]),u["ɵmpd"](4608,Ee.l,Ee.l,[]),u["ɵmpd"](4608,Ee.u,Ee.u,[Ee.v,Ee.l]),u["ɵmpd"](4608,Ne.a,Ne.a,[]),u["ɵmpd"](1073742336,El.CommonModule,El.CommonModule,[]),u["ɵmpd"](1073742336,Kn.u,Kn.u,[]),u["ɵmpd"](1073742336,i.C,i.C,[]),u["ɵmpd"](1073742336,i.n,i.n,[]),u["ɵmpd"](1073742336,be.e,be.e,[]),u["ɵmpd"](1073742336,ye.a,ye.a,[]),u["ɵmpd"](1073742336,i.y,i.y,[]),u["ɵmpd"](1073742336,me.c,me.c,[]),u["ɵmpd"](1073742336,fe.d,fe.d,[]),u["ɵmpd"](1073742336,he.d,he.d,[]),u["ɵmpd"](1073742336,ve.d,ve.d,[]),u["ɵmpd"](1073742336,Ve.b,Ve.b,[]),u["ɵmpd"](1073742336,Al.e,Al.e,[]),u["ɵmpd"](1073742336,we.a,we.a,[]),u["ɵmpd"](1073742336,Vl.f,Vl.f,[]),u["ɵmpd"](1073742336,Te.ClickOutsideModule,Te.ClickOutsideModule,[]),u["ɵmpd"](1073742336,_e.b,_e.b,[]),u["ɵmpd"](1073742336,Re.q,Re.q,[[2,Re.v],[2,Re.m]]),u["ɵmpd"](1073742336,Se.a,Se.a,[]),u["ɵmpd"](1073742336,De.a,De.a,[]),u["ɵmpd"](1073742336,r.a,r.a,[]),u["ɵmpd"](1073742336,ke.a,ke.a,[]),u["ɵmpd"](1073742336,Ie.d,Ie.d,[]),u["ɵmpd"](1073742336,qe.a,qe.a,[]),u["ɵmpd"](1073742336,xe.a,xe.a,[]),u["ɵmpd"](1073742336,Pe.a,Pe.a,[]),u["ɵmpd"](1073742336,Ee.g,Ee.g,[]),u["ɵmpd"](1073742336,Fe.b,Fe.b,[]),u["ɵmpd"](1073742336,Ae.a,Ae.a,[]),u["ɵmpd"](1073742336,$,$,[]),u["ɵmpd"](1073742336,W,W,[]),u["ɵmpd"](256,u.LOCALE_ID,"en-US",[]),u["ɵmpd"](256,be.a,{autoClose:!0,insideClick:!1},[]),u["ɵmpd"](1024,Re.k,(function(){return[[{path:"",component:G},{path:"create",component:k,data:K},{path:"edit/:name",component:k,data:J}]]}),[]),u["ɵmpd"](256,u.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/7.1891b10149a7c2d765ac.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/7.1891b10149a7c2d765ac.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/7.1891b10149a7c2d765ac.js 2020-12-16 17:37:20.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/7.1891b10149a7c2d765ac.js 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{Znkk:function(l,n,u){"use strict";u.r(n);var e=u("8Y7J"),t=u("sne2"),a=u("Avrn");class i{constructor(l){this.route=l,this.message="The Object Gateway service is not configured."}ngOnInit(){this.routeParamsSubscribe=this.route.params.subscribe(l=>{this.message=l.message})}ngOnDestroy(){this.routeParamsSubscribe.unsubscribe()}}var o=u("s7LF"),s=u("LvDl"),d=u("mrSG"),r=u("IheW"),c=u("LRne"),m=u("5+tZ"),f=u("xTzq"),g=u("pL04");let p=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/bucket"}list(){let l=new r.h;return l=l.append("stats","true"),this.http.get(this.url,{params:l})}enumerate(){return this.http.get(this.url)}get(l){return this.http.get(`${this.url}/${l}`)}create(l,n,u,e,t,a,i,o){return this.http.post(this.url,null,{params:new r.h({fromObject:{bucket:l,uid:n,zonegroup:u,placement_target:e,lock_enabled:String(t),lock_mode:a,lock_retention_period_days:i,lock_retention_period_years:o}})})}update(l,n,u,e,t,a,i,o,s,d){let c=new r.h;return c=c.append("bucket_id",n),c=c.append("uid",u),c=c.append("versioning_state",e),c=c.append("mfa_delete",t),c=c.append("mfa_token_serial",a),c=c.append("mfa_token_pin",i),c=c.append("lock_mode",o),c=c.append("lock_retention_period_days",s),c=c.append("lock_retention_period_years",d),this.http.put(`${this.url}/${l}`,null,{params:c})}delete(l,n=!0){let u=new r.h;return u=u.append("purge_objects",n?"true":"false"),this.http.delete(`${this.url}/${l}`,{params:u})}exists(l){return this.enumerate().pipe(Object(m.a)(n=>{const u=s.indexOf(n,l);return Object(c.a)(-1!==u)}))}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})(),v=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/site"}get(l){let n=new r.h;return l&&(n=n.append("query",l)),this.http.get(this.url,{params:n})}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})();var b=u("P8lu"),h=u("oxzT"),C=u("mtw6"),_=u("2EZI"),R=u("1Ni5"),y=u("9nlD"),k=function(l){return l.ENABLED="Enabled",l.DISABLED="Disabled",l}({}),I=function(l){return l.ENABLED="Enabled",l.SUSPENDED="Suspended",l}({});class E{constructor(l,n,u,e,a,i,o,s,d){this.route=l,this.router=n,this.formBuilder=u,this.rgwBucketService=e,this.rgwSiteService=a,this.rgwUserService=i,this.notificationService=o,this.i18n=s,this.actionLabels=d,this.editing=!1,this.error=!1,this.loading=!1,this.owners=null,this.placementTargets=[],this.isVersioningEnabled=!1,this.isVersioningAlreadyEnabled=!1,this.isMfaDeleteEnabled=!1,this.isMfaDeleteAlreadyEnabled=!1,this.icons=h.a,this.editing=this.router.url.startsWith("/rgw/bucket/"+t.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource=this.i18n("bucket"),this.createForm()}createForm(){const l=this,n=R.a.custom("eitherDaysOrYears",()=>{if(!l.bucketForm||!s.get(l.bucketForm.getRawValue(),"lock_enabled"))return!1;const n=l.bucketForm.getValue("lock_retention_period_years"),u=l.bucketForm.getValue("lock_retention_period_days");return u>0&&n>0||0===u&&0===n}),u=[0,[R.a.number(!1),n]];this.bucketForm=this.formBuilder.group({id:[null],bid:[null,[o.B.required],this.editing?[]:[this.bucketNameValidator()]],owner:[null,[o.B.required]],"placement-target":[null,this.editing?[]:[o.B.required]],versioning:[null],"mfa-delete":[null],"mfa-token-serial":[""],"mfa-token-pin":[""],lock_enabled:[{value:!1,disabled:this.editing}],lock_mode:["COMPLIANCE"],lock_retention_period_days:u,lock_retention_period_years:u})}ngOnInit(){this.rgwUserService.enumerate().subscribe(l=>{this.owners=l.sort()}),this.editing||this.rgwSiteService.get("placement-targets").subscribe(l=>{this.zonegroup=l.zonegroup,s.forEach(l.placement_targets,l=>{l.description=`${l.name} (${this.i18n("pool")}: ${l.data_pool})`,this.placementTargets.push(l)}),1===this.placementTargets.length&&this.bucketForm.get("placement-target").setValue(this.placementTargets[0].name)}),this.route.params.subscribe(l=>{if(!l.hasOwnProperty("bid"))return;const n=decodeURIComponent(l.bid);this.loading=!0,this.rgwBucketService.get(n).subscribe(l=>{this.loading=!1;const n=s.clone(this.bucketForm.getRawValue());let u=s.pick(l,s.keys(n));u["placement-target"]=l.placement_rule,u=s.merge(n,u),this.bucketForm.setValue(u),this.editing&&(this.setVersioningStatus(l.versioning),this.isVersioningAlreadyEnabled=this.isVersioningEnabled,this.setMfaDeleteStatus(l.mfa_delete),this.isMfaDeleteAlreadyEnabled=this.isMfaDeleteEnabled,this.setMfaDeleteValidators())})})}goToListView(){this.router.navigate(["/rgw/bucket"])}submit(){if(this.bucketForm.pristine)return void this.goToListView();const l=this.bucketForm.value;if(this.editing){const n=this.getVersioningStatus(),u=this.getMfaDeleteStatus();this.rgwBucketService.update(l.bid,l.id,l.owner,n,u,l["mfa-token-serial"],l["mfa-token-pin"],l.lock_mode,l.lock_retention_period_days,l.lock_retention_period_years).subscribe(()=>{this.notificationService.show(C.a.success,this.i18n('Updated Object Gateway bucket "{{bid}}".',l)),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}else this.rgwBucketService.create(l.bid,l.owner,this.zonegroup,l["placement-target"],l.lock_enabled,l.lock_mode,l.lock_retention_period_days,l.lock_retention_period_years).subscribe(()=>{this.notificationService.show(C.a.success,this.i18n('Created Object Gateway bucket "{{bid}}"',l)),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}bucketNameValidator(){const l=this.rgwBucketService;return n=>new Promise(u=>{if(n.pristine||""===n.value)return void u(null);const e=[];e.push(l=>!R.a.ip()(l)),e.push(l=>s.inRange(l.length,3,64)),e.push(l=>{const n=s.split(l,".");return s.every(n,l=>l===s.toLower(l)&&!l.includes("_")&&!!/[0-9a-z-]/.test(l)&&s.every([0,l.length],n=>/[a-z]/.test(l[n])||s.isInteger(s.parseInt(l[n]))))}),s.every(e,l=>l(n.value))?l.exists(n.value).subscribe(l=>{u(l?{bucketNameExists:!0}:null)}):u({bucketNameInvalid:!0})})}areMfaCredentialsRequired(){return this.isMfaDeleteEnabled!==this.isMfaDeleteAlreadyEnabled||this.isMfaDeleteAlreadyEnabled&&this.isVersioningEnabled!==this.isVersioningAlreadyEnabled}setMfaDeleteValidators(){const l=this.bucketForm.get("mfa-token-serial"),n=this.bucketForm.get("mfa-token-pin");this.areMfaCredentialsRequired()?(l.setValidators(o.B.required),n.setValidators(o.B.required)):(l.setValidators(null),n.setValidators(null)),l.updateValueAndValidity(),n.updateValueAndValidity()}getVersioningStatus(){return this.isVersioningEnabled?I.ENABLED:I.SUSPENDED}setVersioningStatus(l){this.isVersioningEnabled=l===I.ENABLED}updateVersioning(){this.isVersioningEnabled=!this.isVersioningEnabled,this.setMfaDeleteValidators()}getMfaDeleteStatus(){return this.isMfaDeleteEnabled?k.ENABLED:k.DISABLED}setMfaDeleteStatus(l){this.isMfaDeleteEnabled=l===k.ENABLED}updateMfaDelete(){this.isMfaDeleteEnabled=!this.isMfaDeleteEnabled,this.setMfaDeleteValidators()}}var w=u("HDdC"),q=u("cp0P"),N=u("+fVR"),T=u("0+/T"),x=u("uIqm"),V=u("vCyI"),S=u("Fgil"),D=u("o4+5"),F=u("aexS"),j=u("EgGo");const B=new j.a("rgw/bucket");class P extends N.a{constructor(l,n,u,e,t,a,i,o,s,d){super(),this.authStorageService=l,this.dimlessBinaryPipe=n,this.dimlessPipe=u,this.rgwBucketService=e,this.bsModalService=t,this.i18n=a,this.urlBuilder=i,this.actionLabels=o,this.ngZone=s,this.changeDetectorRef=d,this.columns=[],this.buckets=[],this.selection=new V.a,this.isStale=!1,this.permission=this.authStorageService.getPermissions().rgw;const r=()=>this.selection.first()&&""+encodeURIComponent(this.selection.first().bid);this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:l=>!l.hasSelection},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(r()),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:l=>l.hasMultiSelection}],this.timeConditionReached()}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"bid",flexGrow:2},{name:this.i18n("Owner"),prop:"owner",flexGrow:3},{name:this.i18n("Used Capacity"),prop:"bucket_size",flexGrow:.5,pipe:this.dimlessBinaryPipe},{name:this.i18n("Capacity Limit %"),prop:"size_usage",cellTemplate:this.bucketSizeTpl,flexGrow:1},{name:this.i18n("Objects"),prop:"num_objects",flexGrow:.5,pipe:this.dimlessPipe},{name:this.i18n("Object Limit %"),prop:"object_usage",cellTemplate:this.bucketObjectTpl,flexGrow:1}]}transformBucketData(){s.forEach(this.buckets,l=>{const n=l.bucket_quota.max_size,u=l.bucket_quota.max_objects;let e=0,t=0;s.forEach(l.usage,l=>{e+=l.size_actual,t+=l.num_objects}),l.bucket_size=e,l.num_objects=t,l.size_usage=n>0?e/n:void 0,l.object_usage=u>0?t/u:void 0})}timeConditionReached(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.isStale=!0})},1e4)})}getBucketList(l){this.isStale=!1,this.timeConditionReached(),this.rgwBucketService.list().subscribe(l=>{this.buckets=l,this.transformBucketData(),this.changeDetectorRef.detectChanges()},()=>{l.error()})}updateSelection(l){this.selection=l}deleteAction(){this.bsModalService.show(T.a,{initialState:{itemDescription:this.i18n(this.selection.hasSingleSelection?"bucket":"buckets"),itemNames:this.selection.selected.map(l=>l.bid),submitActionObservable:()=>new w.a(l=>{Object(q.a)(this.selection.selected.map(l=>this.rgwBucketService.delete(l.bid))).subscribe(null,n=>{l.error(n),this.table.refreshBtn()},()=>{l.complete(),this.table.refreshBtn()})})}})}}let A=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/daemon"}list(){return this.http.get(this.url)}get(l){return this.http.get(`${this.url}/${l}`)}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})();var M=u("85J/");class O extends N.a{constructor(l,n,u,e,t){super(),this.rgwDaemonService=l,this.authStorageService=n,this.cephShortVersionPipe=u,this.i18n=e,this.rgwSiteService=t,this.columns=[],this.daemons=[]}ngOnInit(){this.grafanaPermission=this.authStorageService.getPermissions().grafana,this.columns=[{name:this.i18n("ID"),prop:"id",flexGrow:2},{name:this.i18n("Hostname"),prop:"server_hostname",flexGrow:2},{name:this.i18n("Version"),prop:"version",flexGrow:1,pipe:this.cephShortVersionPipe}],this.rgwSiteService.get("realms").subscribe(l=>this.isMultiSite=l.length>0)}getDaemonList(l){this.rgwDaemonService.list().subscribe(l=>{this.daemons=l},()=>{l.error()})}}var U=u("GyhO"),L=u("aXbf"),z=function(l){return l.USERS="users",l.BUCKETS="buckets",l.METADATA="metadata",l.USAGE="usage",l.ZONE="zone",l}({});let G=(()=>{class l{static getAll(){return Object.values(l.capabilities)}}return l.capabilities=z,l})();class K{constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.editing=!0,this.types=[],this.resource=this.i18n("capability"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({type:[null,[o.B.required]],perm:[null,[o.B.required]]})}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.ADD}setValues(l,n){this.formGroup.setValue({type:l,perm:n})}setCapabilities(l){const n=[];l.forEach(l=>{n.push(l.type)}),this.types=[],G.getAll().forEach(l=>{-1===s.indexOf(n,l)&&this.types.push(l)})}onSubmit(){this.submitAction.emit(this.formGroup.value),this.bsModalRef.hide()}}class ${constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.viewing=!0,this.userCandidates=[],this.resource=this.i18n("S3 Key"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({user:[null,[o.B.required]],generate_key:[!0],access_key:[null,[R.a.requiredIf({generate_key:!1})]],secret_key:[null,[R.a.requiredIf({generate_key:!1})]]})}setViewing(l=!0){this.viewing=l,this.action=this.viewing?this.actionLabels.SHOW:this.actionLabels.CREATE}setValues(l,n,u){this.formGroup.setValue({user:l,generate_key:s.isEmpty(n),access_key:n,secret_key:u})}setUserCandidates(l){this.userCandidates=l}onSubmit(){this.submitAction.emit(this.formGroup.value),this.bsModalRef.hide()}}class Z{}class Q{constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.editing=!0,this.subusers=[],this.resource=this.i18n("Subuser"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({uid:[null],subuid:[null,[o.B.required,this.subuserValidator()]],perm:[null,[o.B.required]],generate_secret:[!0],secret_key:[null,[R.a.requiredIf({generate_secret:!1})]]})}subuserValidator(){const l=this;return n=>l.editing||Object(R.b)(n.value)?null:l.subusers.some(u=>s.isEqual(l.getSubuserName(u.id),n.value))?{subuserIdExists:!0}:null}getSubuserName(l){if(s.isEmpty(l))return l;const n=l.match(/([^:]+)(:(.+))?/);return s.isUndefined(n[3])?n[1]:n[3]}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE}setValues(l,n="",u=""){this.formGroup.setValue({uid:l,subuid:this.getSubuserName(n),perm:u,generate_secret:!0,secret_key:null})}setSubusers(l){this.subusers=l}onSubmit(){const l=this.formGroup.value,n=new Z;n.id=`${l.uid}:${l.subuid}`,n.permissions=l.perm,n.generate_secret=l.generate_secret,n.secret_key=l.secret_key,this.submitAction.emit(n),this.bsModalRef.hide()}}class Y{constructor(l,n,u){this.bsModalRef=l,this.i18n=n,this.actionLabels=u,this.resource=this.i18n("Swift Key"),this.action=this.actionLabels.SHOW}setValues(l,n){this.user=l,this.secret_key=n}}class W{constructor(l,n,u,e,t,a,i,o){this.formBuilder=l,this.route=n,this.router=u,this.rgwUserService=e,this.bsModalService=t,this.notificationService=a,this.i18n=i,this.actionLabels=o,this.editing=!1,this.error=!1,this.loading=!1,this.submitObservables=[],this.icons=h.a,this.subusers=[],this.s3Keys=[],this.swiftKeys=[],this.capabilities=[],this.resource=this.i18n("user"),this.subuserLabel=this.i18n("subuser"),this.s3keyLabel=this.i18n("S3 Key"),this.capabilityLabel=this.i18n("capability"),this.createForm()}createForm(){this.userForm=this.formBuilder.group({uid:[null,[o.B.required],[R.a.unique(this.rgwUserService.exists,this.rgwUserService)]],display_name:[null,[o.B.required]],email:[null,[R.a.email],[R.a.unique(this.rgwUserService.emailExists,this.rgwUserService)]],max_buckets_mode:[1],max_buckets:[1e3,[R.a.requiredIf({max_buckets_mode:"1"}),R.a.number(!1),o.B.min(1)]],suspended:[!1],generate_key:[!0],access_key:[null,[R.a.requiredIf({generate_key:!1})]],secret_key:[null,[R.a.requiredIf({generate_key:!1})]],user_quota_enabled:[!1],user_quota_max_size_unlimited:[!0],user_quota_max_size:[null,[R.a.composeIf({user_quota_enabled:!0,user_quota_max_size_unlimited:!1},[o.B.required,this.quotaMaxSizeValidator])]],user_quota_max_objects_unlimited:[!0],user_quota_max_objects:[null,[o.B.min(0),R.a.requiredIf({user_quota_enabled:!0,user_quota_max_objects_unlimited:!1})]],bucket_quota_enabled:[!1],bucket_quota_max_size_unlimited:[!0],bucket_quota_max_size:[null,[R.a.composeIf({bucket_quota_enabled:!0,bucket_quota_max_size_unlimited:!1},[o.B.required,this.quotaMaxSizeValidator])]],bucket_quota_max_objects_unlimited:[!0],bucket_quota_max_objects:[null,[o.B.min(0),R.a.requiredIf({bucket_quota_enabled:!0,bucket_quota_max_objects_unlimited:!1})]]})}ngOnInit(){this.editing=this.router.url.startsWith("/rgw/user/"+t.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.route.params.subscribe(l=>{if(!l.hasOwnProperty("uid"))return;const n=decodeURIComponent(l.uid);this.loading=!0;const u=[];u.push(this.rgwUserService.get(n)),u.push(this.rgwUserService.getQuota(n)),Object(q.a)(u).subscribe(l=>{this.loading=!1;const n=s.clone(this.userForm.value);let u=s.pick(l[0],s.keys(this.userForm.value));switch(u.max_buckets){case-1:u.max_buckets_mode=-1,u.max_buckets="";break;case 0:u.max_buckets_mode=0,u.max_buckets="";break;default:u.max_buckets_mode=1}["user","bucket"].forEach(n=>{const e=l[1][n+"_quota"];u[n+"_quota_enabled"]=e.enabled,e.max_size<0?(u[n+"_quota_max_size_unlimited"]=!0,u[n+"_quota_max_size"]=null):(u[n+"_quota_max_size_unlimited"]=!1,u[n+"_quota_max_size"]=e.max_size+" B"),e.max_objects<0?(u[n+"_quota_max_objects_unlimited"]=!0,u[n+"_quota_max_objects"]=null):(u[n+"_quota_max_objects_unlimited"]=!1,u[n+"_quota_max_objects"]=e.max_objects)}),u=s.merge(n,u),this.userForm.setValue(u),this.subusers=l[0].subusers,this.s3Keys=l[0].keys,this.swiftKeys=l[0].swift_keys;const e={"read, write":"*"};l[0].caps.forEach(l=>{l.perm in e&&(l.perm=e[l.perm])}),this.capabilities=l[0].caps},l=>{this.error=l})})}goToListView(){this.router.navigate(["/rgw/user"])}onSubmit(){let l;if(this.userForm.pristine)return void this.goToListView();const n=this.userForm.getValue("uid");if(this.editing){if(this._isGeneralDirty()){const l=this._getUpdateArgs();this.submitObservables.push(this.rgwUserService.update(n,l))}l=this.i18n('Updated Object Gateway user "{{uid}}"',{uid:n})}else{const u=this._getCreateArgs();this.submitObservables.push(this.rgwUserService.create(u)),l=this.i18n('Created Object Gateway user "{{uid}}"',{uid:n})}if(this._isUserQuotaDirty()){const l=this._getUserQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,l))}if(this._isBucketQuotaDirty()){const l=this._getBucketQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,l))}Object(U.a)(...this.submitObservables).subscribe({error:()=>{this.userForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.notificationService.show(C.a.success,l),this.goToListView()}})}quotaMaxSizeValidator(l){return Object(R.b)(l.value)?null:null===RegExp("^(\\d+(\\.\\d+)?)\\s*(B|K(B|iB)?|M(B|iB)?|G(B|iB)?|T(B|iB)?)?$","i").exec(l.value)||(new L.a).toBytes(l.value)<1024?{quotaMaxSize:!0}:null}setSubuser(l,n){const u={"full-control":"full","read-write":"readwrite"},e=this.userForm.getValue("uid");this.submitObservables.push(this.rgwUserService.createSubuser(e,{subuser:l.id,access:l.permissions in u?u[l.permissions]:l.permissions,key_type:"swift",secret_key:l.secret_key,generate_secret:l.generate_secret?"true":"false"})),s.isNumber(n)?this.subusers[n]=l:(this.subusers.push(l),this.swiftKeys.push({user:l.id,secret_key:l.generate_secret?"Apply your changes first...":l.secret_key})),this.userForm.markAsDirty()}deleteSubuser(l){const n=this.subusers[l];this.submitObservables.push(this.rgwUserService.deleteSubuser(this.userForm.getValue("uid"),n.id)),this.s3Keys=this.s3Keys.filter(l=>l.user!==n.id),this.swiftKeys=this.swiftKeys.filter(l=>l.user!==n.id),this.subusers.splice(l,1),this.userForm.markAsDirty()}setCapability(l,n){const u=this.userForm.getValue("uid");if(s.isNumber(n)){const e=this.capabilities[n];this.submitObservables.push(this.rgwUserService.deleteCapability(u,e.type,e.perm)),this.submitObservables.push(this.rgwUserService.addCapability(u,l.type,l.perm)),this.capabilities[n]=l}else this.submitObservables.push(this.rgwUserService.addCapability(u,l.type,l.perm)),this.capabilities.push(l);this.userForm.markAsDirty()}deleteCapability(l){const n=this.capabilities[l];this.submitObservables.push(this.rgwUserService.deleteCapability(this.userForm.getValue("uid"),n.type,n.perm)),this.capabilities.splice(l,1),this.userForm.markAsDirty()}hasAllCapabilities(){return!s.difference(G.getAll(),s.map(this.capabilities,"type")).length}setS3Key(l,n){if(s.isNumber(n));else{const n=l.user.match(/([^:]+)(:(.+))?/),u=n[1],e={subuser:n[2]?n[3]:"",generate_key:l.generate_key?"true":"false"};"false"===e.generate_key&&(s.isNil(l.access_key)||(e.access_key=l.access_key),s.isNil(l.secret_key)||(e.secret_key=l.secret_key)),this.submitObservables.push(this.rgwUserService.addS3Key(u,e)),this.s3Keys.push({user:l.user,access_key:l.generate_key?"Apply your changes first...":l.access_key,secret_key:l.generate_key?"Apply your changes first...":l.secret_key})}this.userForm.markAsDirty()}deleteS3Key(l){const n=this.s3Keys[l];this.submitObservables.push(this.rgwUserService.deleteS3Key(this.userForm.getValue("uid"),n.access_key)),this.s3Keys.splice(l,1),this.userForm.markAsDirty()}showSubuserModal(l){const n=this.userForm.getValue("uid"),u=this.bsModalService.show(Q);if(s.isNumber(l)){const e=this.subusers[l];u.content.setEditing(),u.content.setValues(n,e.id,e.permissions)}else u.content.setEditing(!1),u.content.setValues(n),u.content.setSubusers(this.subusers);u.content.submitAction.subscribe(n=>{this.setSubuser(n,l)})}showS3KeyModal(l){const n=this.bsModalService.show($);if(s.isNumber(l)){const u=this.s3Keys[l];n.content.setViewing(),n.content.setValues(u.user,u.access_key,u.secret_key)}else{const l=this._getS3KeyUserCandidates();n.content.setViewing(!1),n.content.setUserCandidates(l),n.content.submitAction.subscribe(l=>{this.setS3Key(l)})}}showSwiftKeyModal(l){const n=this.bsModalService.show(Y),u=this.swiftKeys[l];n.content.setValues(u.user,u.secret_key)}showCapabilityModal(l){const n=this.bsModalService.show(K);if(s.isNumber(l)){const u=this.capabilities[l];n.content.setEditing(),n.content.setValues(u.type,u.perm)}else n.content.setEditing(!1),n.content.setCapabilities(this.capabilities);n.content.submitAction.subscribe(n=>{this.setCapability(n,l)})}_isGeneralDirty(){return["display_name","email","max_buckets_mode","max_buckets","suspended"].some(l=>this.userForm.get(l).dirty)}_isUserQuotaDirty(){return["user_quota_enabled","user_quota_max_size_unlimited","user_quota_max_size","user_quota_max_objects_unlimited","user_quota_max_objects"].some(l=>this.userForm.get(l).dirty)}_isBucketQuotaDirty(){return["bucket_quota_enabled","bucket_quota_max_size_unlimited","bucket_quota_max_size","bucket_quota_max_objects_unlimited","bucket_quota_max_objects"].some(l=>this.userForm.get(l).dirty)}_getCreateArgs(){const l={uid:this.userForm.getValue("uid"),display_name:this.userForm.getValue("display_name"),suspended:this.userForm.getValue("suspended"),email:"",max_buckets:this.userForm.getValue("max_buckets"),generate_key:this.userForm.getValue("generate_key"),access_key:"",secret_key:""},n=this.userForm.getValue("email");s.isString(n)&&n.length>0&&s.merge(l,{email:n}),this.userForm.getValue("generate_key")||s.merge(l,{generate_key:!1,access_key:this.userForm.getValue("access_key"),secret_key:this.userForm.getValue("secret_key")});const u=parseInt(this.userForm.getValue("max_buckets_mode"),10);return s.includes([-1,0],u)&&s.merge(l,{max_buckets:u}),l}_getUpdateArgs(){const l={},n=["display_name","email","max_buckets","suspended"];for(const e of n)l[e]=this.userForm.getValue(e);const u=parseInt(this.userForm.getValue("max_buckets_mode"),10);return s.includes([-1,0],u)&&(l.max_buckets=u),l}_getUserQuotaArgs(){const l={quota_type:"user",enabled:this.userForm.getValue("user_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("user_quota_max_size_unlimited")){const n=(new L.a).toBytes(this.userForm.getValue("user_quota_max_size"));l.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("user_quota_max_objects_unlimited")||(l.max_objects=this.userForm.getValue("user_quota_max_objects")),l}_getBucketQuotaArgs(){const l={quota_type:"bucket",enabled:this.userForm.getValue("bucket_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("bucket_quota_max_size_unlimited")){const n=(new L.a).toBytes(this.userForm.getValue("bucket_quota_max_size"));l.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("bucket_quota_max_objects_unlimited")||(l.max_objects=this.userForm.getValue("bucket_quota_max_objects")),l}_getS3KeyUserCandidates(){let l=[];const n=this.userForm.getValue("uid");return s.isString(n)&&!s.isEmpty(n)&&l.push(n),this.subusers.forEach(n=>{l.push(n.id)}),this.s3Keys.forEach(n=>{l.push(n.user)}),l=s.uniq(l),l}onMaxBucketsModeChange(l){"1"===l&&(this.userForm.get("max_buckets").valid||this.userForm.patchValue({max_buckets:1e3}))}}var J=u("x38r");const X=new j.a("rgw/user");class H extends N.a{constructor(l,n,u,e,t,a,i){super(),this.authStorageService=l,this.rgwUserService=n,this.bsModalService=u,this.i18n=e,this.urlBuilder=t,this.actionLabels=a,this.ngZone=i,this.columns=[],this.users=[],this.selection=new V.a,this.isStale=!1,this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:this.i18n("Username"),prop:"uid",flexGrow:1},{name:this.i18n("Full name"),prop:"display_name",flexGrow:1},{name:this.i18n("Email address"),prop:"email",flexGrow:1},{name:this.i18n("Suspended"),prop:"suspended",flexGrow:1,cellClass:"text-center",cellTransformation:J.a.checkIcon},{name:this.i18n("Max. buckets"),prop:"max_buckets",flexGrow:1,cellTransformation:J.a.map,customTemplateConfig:{"-1":this.i18n("Disabled"),0:this.i18n("Unlimited")}}];const o=()=>this.selection.first()&&""+encodeURIComponent(this.selection.first().uid);this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:l=>!l.hasSelection},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(o()),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:l=>l.hasMultiSelection}],this.timeConditionReached()}timeConditionReached(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.isStale=!0})},1e4)})}getUserList(l){this.isStale=!1,this.timeConditionReached(),this.rgwUserService.list().subscribe(l=>{this.users=l},()=>{l.error()})}updateSelection(l){this.selection=l}deleteAction(){this.bsModalService.show(T.a,{initialState:{itemDescription:this.i18n(this.selection.hasSingleSelection?"user":"users"),itemNames:this.selection.selected.map(l=>l.uid),submitActionObservable:()=>new w.a(l=>{Object(q.a)(this.selection.selected.map(l=>this.rgwUserService.delete(l.uid))).subscribe(null,n=>{l.error(n),this.table.refreshBtn()},()=>{l.complete(),this.table.refreshBtn()})})}})}}class ll{}const nl={breadcrumbs:"Daemons"},ul={breadcrumbs:"Users"},el={breadcrumbs:t.a.CREATE},tl={breadcrumbs:t.a.EDIT},al={breadcrumbs:"Buckets"},il={breadcrumbs:t.a.CREATE},ol={breadcrumbs:t.a.EDIT},sl={breadcrumbs:"Object Gateway"};class dl{}var rl=u("MdoF"),cl=u("ES0t"),ml=u("Xg1U"),fl=u("z5nN"),gl=u("iutN"),pl=u("pMnS"),vl=u("EEJc"),bl=u("PEr+"),hl=u("a40w"),Cl=u("hfeG"),_l=u("2ZVE"),Rl=u("a278"),yl=u("insk"),kl=u("cUpR"),Il=u("20UP"),El=u("GiVz"),wl=u("pKUh"),ql=u("sLuX"),Nl=u("FSuO"),Tl=u("a0VL"),xl=u("j8L6"),Vl=u("b5OY"),Sl=u("pxLl"),Dl=u("SVse");class Fl{constructor(l,n){this.rgwDaemonService=l,this.authStorageService=n,this.serviceId="",this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection&&(this.serviceId=this.selection.id)}getMetaData(){s.isEmpty(this.serviceId)||this.rgwDaemonService.get(this.serviceId).subscribe(l=>{this.metadata=l.rgw_metadata})}}var jl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Bl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Performance Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","one"],["uid","x5ARzZtmk"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var u=n.component;l(n,1,0,"Performance Details"),l(n,3,0,"rgw-instance-detail?var-rgw_servers=rgw."+u.serviceId,"one","x5ARzZtmk")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function Pl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,1,"cd-table-key-value",[],null,[[null,"fetchData"]],(function(l,n,u){var e=!0;return"fetchData"===n&&(e=!1!==l.component.getMetaData()&&e),e}),ql.b,ql.a)),e["ɵdid"](5,638976,null,0,Nl.a,[Tl.a],{data:[0,"data"]},{fetchData:"fetchData"}),(l()(),e["ɵeld"](6,0,null,0,3,"tab",[["heading","Performance Counters"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](7,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](8,0,null,null,1,"cd-table-performance-counter",[["serviceType","rgw"]],null,null,null,xl.b,xl.a)),e["ɵdid"](9,114688,null,0,Vl.a,[Sl.a,El.a],{serviceType:[0,"serviceType"],serviceId:[1,"serviceId"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,Bl)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.metadata),l(n,7,0,"Performance Counters"),l(n,9,0,"rgw",u.serviceId),l(n,11,0,u.grafanaPermission.read)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby),l(n,6,0,e["ɵnov"](n,7).id,e["ɵnov"](n,7).active,e["ɵnov"](n,7).addClass,e["ɵnov"](n,7).role,e["ɵnov"](n,7).ariaLabelledby)}))}function Al(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Pl)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,1,0,n.component.selection)}),null)}function Ml(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-daemon-details",[],null,null,null,Al,jl)),e["ɵdid"](1,573440,null,0,Fl,[A,F.a],null,null)],null,null)}var Ol=e["ɵccf"]("cd-rgw-daemon-details",Fl,Ml,{selection:"selection"},{},[]),Ul=u("iExv");class Ll{constructor(l){this.rgwBucketService=l}ngOnChanges(){this.selection&&this.rgwBucketService.get(this.selection.bid).subscribe(l=>{this.selection=l})}}var zl=e["ɵcrt"]({encapsulation:0,styles:[["table[_ngcontent-%COMP%]{table-layout:fixed}table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{word-wrap:break-word}"]],data:{}});function Gl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function Kl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.selection.bucket_quota.max_size));l(n,1,0,t)}))}function $l(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function Zl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.selection.bucket_quota.max_objects)}))}function Ql(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,24,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](3,0,null,null,21,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,20,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,6,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,Gl)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Kl)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](18,0,null,null,6,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](19,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,$l)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Zl)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,u.selection.bucket_quota.max_size<=-1),l(n,17,0,u.selection.bucket_quota.max_size>-1),l(n,22,0,u.selection.bucket_quota.max_objects<=-1),l(n,24,0,u.selection.bucket_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,1),u.selection.bucket_quota.enabled));l(n,9,0,t)}))}function Yl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Mode"])),(l()(),e["ɵeld"](4,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](5,null,["",""])),(l()(),e["ɵeld"](6,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Days"])),(l()(),e["ɵeld"](9,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](10,null,["",""])),(l()(),e["ɵeld"](11,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Years"])),(l()(),e["ɵeld"](14,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](15,null,["",""]))],null,(function(l,n){var u=n.component;l(n,5,0,u.selection.lock_mode),l(n,10,0,u.selection.lock_retention_period_days),l(n,15,0,u.selection.lock_retention_period_years)}))}function Wl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,82,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,67,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,66,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](7,null,["",""])),(l()(),e["ɵeld"](8,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["ID"])),(l()(),e["ɵeld"](11,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](12,null,["",""])),(l()(),e["ɵeld"](13,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](14,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Owner"])),(l()(),e["ɵeld"](16,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](17,null,["",""])),(l()(),e["ɵeld"](18,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](19,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Index type"])),(l()(),e["ɵeld"](21,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](22,null,["",""])),(l()(),e["ɵeld"](23,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](24,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Placement rule"])),(l()(),e["ɵeld"](26,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](27,null,["",""])),(l()(),e["ɵeld"](28,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](29,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Marker"])),(l()(),e["ɵeld"](31,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](32,null,["",""])),(l()(),e["ɵeld"](33,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](34,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum marker"])),(l()(),e["ɵeld"](36,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](37,null,["",""])),(l()(),e["ɵeld"](38,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](39,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Version"])),(l()(),e["ɵeld"](41,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](42,null,["",""])),(l()(),e["ɵeld"](43,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](44,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Master version"])),(l()(),e["ɵeld"](46,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](47,null,["",""])),(l()(),e["ɵeld"](48,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](49,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Modification time"])),(l()(),e["ɵeld"](51,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](52,null,["",""])),e["ɵppd"](53,1),(l()(),e["ɵeld"](54,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](55,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Zonegroup"])),(l()(),e["ɵeld"](57,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](58,null,["",""])),(l()(),e["ɵeld"](59,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](60,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Versioning"])),(l()(),e["ɵeld"](62,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](63,null,["",""])),(l()(),e["ɵeld"](64,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](65,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["MFA Delete"])),(l()(),e["ɵeld"](67,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](68,null,["",""])),(l()(),e["ɵand"](16777216,null,null,1,null,Ql)),e["ɵdid"](70,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](71,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Locking"])),(l()(),e["ɵeld"](73,0,null,null,9,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](74,0,null,null,8,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](75,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](76,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](78,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](79,null,["",""])),e["ɵppd"](80,1),(l()(),e["ɵand"](16777216,null,null,1,null,Yl)),e["ɵdid"](82,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,70,0,u.selection.bucket_quota),l(n,82,0,u.selection.lock_enabled)}),(function(l,n){var u=n.component;l(n,7,0,u.selection.bid),l(n,12,0,u.selection.id),l(n,17,0,u.selection.owner),l(n,22,0,u.selection.index_type),l(n,27,0,u.selection.placement_rule),l(n,32,0,u.selection.marker),l(n,37,0,u.selection.max_marker),l(n,42,0,u.selection.ver),l(n,47,0,u.selection.master_ver);var t=e["ɵunv"](n,52,0,l(n,53,0,e["ɵnov"](n.parent.parent,0),u.selection.mtime));l(n,52,0,t),l(n,58,0,u.selection.zonegroup),l(n,63,0,u.selection.versioning),l(n,68,0,u.selection.mfa_delete);var a=e["ɵunv"](n,79,0,l(n,80,0,e["ɵnov"](n.parent.parent,1),u.selection.lock_enabled));l(n,79,0,a)}))}function Jl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Wl)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.selection)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function Xl(l){return e["ɵvid"](0,[e["ɵpid"](0,Tl.a,[Dl.DatePipe]),e["ɵpid"](0,Ul.a,[El.a]),e["ɵpid"](0,D.a,[L.a]),(l()(),e["ɵand"](16777216,null,null,1,null,Jl)),e["ɵdid"](4,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,4,0,n.component.selection)}),null)}function Hl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-bucket-details",[],null,null,null,Xl,zl)),e["ɵdid"](1,573440,null,0,Ll,[p],null,null)],null,null)}var ln=e["ɵccf"]("cd-rgw-bucket-details",Ll,Hl,{selection:"selection"},{},[]),nn=u("25BL"),un=u("FE24"),en=u("z/SZ"),tn=u("GS7A"),an=u("TJUb");class on{constructor(l,n,u){this.rgwUserService=l,this.bsModalService=n,this.i18n=u,this.keys=[],this.keysColumns=[],this.keysSelection=new V.a,this.icons=h.a}ngOnInit(){this.keysColumns=[{name:this.i18n("Username"),prop:"username",flexGrow:1},{name:this.i18n("Type"),prop:"type",flexGrow:1}],this.maxBucketsMap={"-1":this.i18n("Disabled"),0:this.i18n("Unlimited")}}ngOnChanges(){this.selection&&(this.user=this.selection,this.user.subusers=s.sortBy(this.user.subusers,"id"),this.user.caps=s.sortBy(this.user.caps,"type"),this.rgwUserService.getQuota(this.user.uid).subscribe(l=>{s.extend(this.user,l)}),this.keys=[],this.user.keys&&this.user.keys.forEach(l=>{this.keys.push({id:this.keys.length+1,type:"S3",username:l.user,ref:l})}),this.user.swift_keys&&this.user.swift_keys.forEach(l=>{this.keys.push({id:this.keys.length+1,type:"Swift",username:l.user,ref:l})}),this.keys=s.sortBy(this.keys,"user"))}updateKeysSelection(l){this.keysSelection=l}showKeyModal(){const l=this.keysSelection.first(),n=this.bsModalService.show("S3"===l.type?$:Y);switch(l.type){case"S3":n.content.setViewing(),n.content.setValues(l.ref.user,l.ref.access_key,l.ref.secret_key);break;case"Swift":n.content.setValues(l.ref.user,l.ref.secret_key)}}}var sn=u("LqlI"),dn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email address"])),(l()(),e["ɵeld"](3,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](4,null,["",""]))],null,(function(l,n){l(n,4,0,n.component.user.email)}))}function cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"div",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," (",") "]))],null,(function(l,n){l(n,1,0,n.context.$implicit.id,n.context.$implicit.permissions)}))}function mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Subusers"])),(l()(),e["ɵeld"](3,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,cn)),e["ɵdid"](5,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,5,0,n.component.user.subusers)}),null)}function fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"div",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," (",") "]))],null,(function(l,n){l(n,1,0,n.context.$implicit.type,n.context.$implicit.perm)}))}function gn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Capabilities"])),(l()(),e["ɵeld"](3,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,fn)),e["ɵdid"](5,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,5,0,n.component.user.caps)}),null)}function pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function bn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.user.user_quota.max_size));l(n,1,0,t)}))}function hn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function Cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function _n(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.user.user_quota.max_objects)}))}function Rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,28,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User quota"])),(l()(),e["ɵeld"](3,0,null,null,25,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,24,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,pn)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vn)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bn)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](20,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](21,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,hn)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Cn)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,_n)),e["ɵdid"](28,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,!u.user.user_quota.enabled),l(n,17,0,u.user.user_quota.enabled&&u.user.user_quota.max_size<=-1),l(n,19,0,u.user.user_quota.enabled&&u.user.user_quota.max_size>-1),l(n,24,0,!u.user.user_quota.enabled),l(n,26,0,u.user.user_quota.enabled&&u.user.user_quota.max_objects<=-1),l(n,28,0,u.user.user_quota.enabled&&u.user.user_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,0),u.user.user_quota.enabled));l(n,9,0,t)}))}function yn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function kn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function In(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.user.bucket_quota.max_size));l(n,1,0,t)}))}function En(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function wn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function qn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.user.bucket_quota.max_objects)}))}function Nn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,28,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](3,0,null,null,25,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,24,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,yn)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,kn)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,In)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](20,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](21,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,En)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,wn)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,qn)),e["ɵdid"](28,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,!u.user.bucket_quota.enabled),l(n,17,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_size<=-1),l(n,19,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_size>-1),l(n,24,0,!u.user.bucket_quota.enabled),l(n,26,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_objects<=-1),l(n,28,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,0),u.user.bucket_quota.enabled));l(n,9,0,t)}))}function Tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,40,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,35,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,34,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](7,null,["",""])),(l()(),e["ɵeld"](8,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](11,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](12,null,["",""])),(l()(),e["ɵand"](16777216,null,null,1,null,rn)),e["ɵdid"](14,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](15,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Suspended"])),(l()(),e["ɵeld"](18,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](19,null,["",""])),e["ɵppd"](20,1),(l()(),e["ɵeld"](21,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["System"])),(l()(),e["ɵeld"](24,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](25,null,["",""])),e["ɵppd"](26,1),(l()(),e["ɵeld"](27,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](28,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum buckets"])),(l()(),e["ɵeld"](30,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](31,null,["",""])),e["ɵppd"](32,2),(l()(),e["ɵand"](16777216,null,null,1,null,mn)),e["ɵdid"](34,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gn)),e["ɵdid"](36,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Rn)),e["ɵdid"](38,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Nn)),e["ɵdid"](40,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,14,0,null==u.user.email?null:u.user.email.length),l(n,34,0,u.user.subusers&&u.user.subusers.length),l(n,36,0,u.user.caps&&u.user.caps.length),l(n,38,0,u.user.user_quota),l(n,40,0,u.user.bucket_quota)}),(function(l,n){var u=n.component;l(n,7,0,u.user.uid),l(n,12,0,u.user.display_name);var t=e["ɵunv"](n,19,0,l(n,20,0,e["ɵnov"](n.parent.parent,0),u.user.suspended));l(n,19,0,t);var a=e["ɵunv"](n,25,0,l(n,26,0,e["ɵnov"](n.parent.parent,0),"true"===u.user.system));l(n,25,0,a);var i=e["ɵunv"](n,31,0,l(n,32,0,e["ɵnov"](n.parent.parent,1),u.user.max_buckets,u.maxBucketsMap));l(n,31,0,i)}))}function xn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"tab",[["heading","Keys"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,12,"cd-table",[["columnMode","flex"],["forceIdentifier","true"],["selectionType","multi"]],null,[[null,"updateSelection"]],(function(l,n,u){var e=!0;return"updateSelection"===n&&(e=!1!==l.component.updateKeysSelection(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](3,2867200,null,0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],forceIdentifier:[3,"forceIdentifier"],selectionType:[4,"selectionType"]},{updateSelection:"updateSelection"}),(l()(),e["ɵeld"](4,0,null,1,10,"div",[["class","table-actions"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,16777216,null,null,9,"div",[["class","btn-group"],["dropdown",""]],[[2,"dropup",null],[2,"open",null],[2,"show",null]],null,null,null,null)),e["ɵprd"](512,null,un.f,un.f,[]),e["ɵdid"](7,212992,null,0,un.c,[e.ElementRef,e.Renderer2,e.ViewContainerRef,en.a,un.f,un.a,tn.b],null,null),(l()(),e["ɵeld"](8,0,null,null,6,"button",[["class","btn btn-secondary"],["type","button"]],[[8,"disabled",0]],[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showKeyModal()&&e),e}),null,null)),(l()(),e["ɵeld"](9,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](11,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](12,1),(l()(),e["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Show"]))],(function(l,n){var u=n.component;l(n,1,0,"Keys"),l(n,3,0,u.keys,u.keysColumns,"flex","true","multi"),l(n,7,0);var e=l(n,12,0,u.icons.show);l(n,11,0,e)}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby),l(n,5,0,e["ɵnov"](n,7).dropup,e["ɵnov"](n,7).isOpen,e["ɵnov"](n,7).isOpen&&e["ɵnov"](n,7).isBs4),l(n,8,0,!u.keysSelection.hasSingleSelection)}))}function Vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Tn)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,xn)),e["ɵdid"](7,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.user),l(n,7,0,u.keys.length)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function Sn(l){return e["ɵvid"](0,[e["ɵpid"](0,Ul.a,[El.a]),e["ɵpid"](0,an.a,[]),e["ɵpid"](0,S.a,[L.a]),e["ɵqud"](671088640,1,{accessKeyTpl:0}),e["ɵqud"](671088640,2,{secretKeyTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,Vn)),e["ɵdid"](6,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,6,0,n.component.selection)}),null)}function Dn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-details",[],null,null,null,Sn,dn)),e["ɵdid"](1,638976,null,0,on,[b.a,sn.b,El.a],null,null)],(function(l,n){l(n,1,0)}),null)}var Fn=e["ɵccf"]("cd-rgw-user-details",on,Dn,{selection:"selection"},{},[]),jn=u("8xTl"),Bn=u("ajRT"),Pn=u("mXUL"),An=u("+gVj"),Mn=u("ANnk"),On=u("f/UV"),Un=u("D4zM"),Ln=u("OcYo"),zn=u("EApP"),Gn=u("KVJa"),Kn=u("Z21x"),$n=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Zn(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,51,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," "," "])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,45,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,41,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,40,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,12).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,12).onReset()&&t),t}),null,null)),e["ɵdid"](11,16384,null,0,o.G,[],null,null),e["ɵdid"](12,4210688,null,0,o.t,[[8,null],[8,null]],null,null),e["ɵprd"](2048,null,o.d,null,[o.t]),e["ɵdid"](14,16384,null,0,o.s,[[4,o.d]],null,null),(l()(),e["ɵeld"](15,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](16,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](19,0,null,0,1,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](21,0,null,0,8,"div",[["class","cd-col-form-inpu"]],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,7,"input",[["class","form-control"],["id","user"],["name","user"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0,a=l.component;return"input"===n&&(t=!1!==e["ɵnov"](l,24)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,24).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,24)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,24)._compositionEnd(u.target.value)&&t),"ngModelChange"===n&&(t=!1!==(a.user=u)&&t),t}),null,null)),e["ɵdid"](23,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](24,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](26,671744,null,0,o.u,[[2,o.d],[8,null],[8,null],[6,o.p]],{name:[0,"name"],model:[1,"model"]},{update:"ngModelChange"}),e["ɵprd"](2048,null,o.q,null,[o.u]),e["ɵdid"](28,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](29,16384,null,0,An.h,[[3,o.d],An.a],null,null),(l()(),e["ɵeld"](30,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](31,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](34,0,null,0,1,"label",[["class","cd-col-form-label"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](36,0,null,0,14,"div",[["class","cd-col-form-inpu"]],null,null,null,null,null)),(l()(),e["ɵeld"](37,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](38,0,null,null,7,"input",[["class","form-control"],["id","secret_key"],["name","secret_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0,a=l.component;return"input"===n&&(t=!1!==e["ɵnov"](l,40)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,40).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,40)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,40)._compositionEnd(u.target.value)&&t),"ngModelChange"===n&&(t=!1!==(a.secret_key=u)&&t),t}),null,null)),e["ɵdid"](39,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](40,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](42,671744,null,0,o.u,[[2,o.d],[8,null],[8,null],[6,o.p]],{name:[0,"name"],model:[1,"model"]},{update:"ngModelChange"}),e["ɵprd"](2048,null,o.q,null,[o.u]),e["ɵdid"](44,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](45,16384,null,0,An.h,[[3,o.d],An.a],null,null),(l()(),e["ɵeld"](46,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](47,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,48).onClick()&&t),t}),null,null)),e["ɵdid"](48,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](49,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,50).onClick()&&t),t}),null,null)),e["ɵdid"](50,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵeld"](51,0,null,null,2,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](52,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](53,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,16,0),l(n,26,0,"user",u.user),l(n,31,0),l(n,42,0,"secret_key",u.secret_key),l(n,48,0,"secret_key"),l(n,50,0,"secret_key"),l(n,53,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,10,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending),l(n,15,0,e["ɵnov"](n,16).hasErrors,e["ɵnov"](n,16).hasSuccess),l(n,22,0,!0,e["ɵnov"](n,28).ngClassUntouched,e["ɵnov"](n,28).ngClassTouched,e["ɵnov"](n,28).ngClassPristine,e["ɵnov"](n,28).ngClassDirty,e["ɵnov"](n,28).ngClassValid,e["ɵnov"](n,28).ngClassInvalid,e["ɵnov"](n,28).ngClassPending,e["ɵnov"](n,29).validClass,e["ɵnov"](n,29).invalidClass),l(n,30,0,e["ɵnov"](n,31).hasErrors,e["ɵnov"](n,31).hasSuccess),l(n,38,0,!0,e["ɵnov"](n,44).ngClassUntouched,e["ɵnov"](n,44).ngClassTouched,e["ɵnov"](n,44).ngClassPristine,e["ɵnov"](n,44).ngClassDirty,e["ɵnov"](n,44).ngClassValid,e["ɵnov"](n,44).ngClassInvalid,e["ɵnov"](n,44).ngClassPending,e["ɵnov"](n,45).validClass,e["ɵnov"](n,45).invalidClass)}))}function Qn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-swift-key-modal",[],null,null,null,Zn,$n)),e["ɵdid"](1,49152,null,0,Y,[sn.a,El.a,t.b],null,null)],null,null)}var Yn=e["ɵccf"]("cd-rgw-user-swift-key-modal",Y,Qn,{},{},[]),Wn=u("IZUe"),Jn=u("gp3X"),Xn=u("sb0X"),Hn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function lu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","user"],["id","user"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,2)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,2)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,2)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](4,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,4,0,"user"),l(n,7,0,"user")}),(function(l,n){l(n,0,0,!0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function nu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a username --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function uu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function eu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"select",[["autofocus",""],["class","form-control custom-select"],["formControlName","user"],["id","user"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,3).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](5,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,nu)),e["ɵdid"](10,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,uu)),e["ɵdid"](12,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,1,0,""),l(n,5,0,"user"),l(n,8,0,"user"),l(n,10,0,null!==u.userCandidates),l(n,12,0,u.userCandidates)}),(function(l,n){l(n,0,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function tu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function au(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_key"],["id","generate_key"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate key"]))],(function(l,n){l(n,1,0),l(n,10,0,"generate_key"),l(n,13,0,"generate_key")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function iu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ou(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","access_key"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵted"](-1,null,["Access key"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["class","form-control"],["formControlName","access_key"],["id","access_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](15,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](17,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](18,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,21).onClick()&&t),t}),null,null)),e["ɵdid"](21,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"button",[["cdCopy2ClipboardButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,23).onClick()&&t),t}),null,null)),e["ɵdid"](23,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,iu)),e["ɵdid"](25,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var t=l(n,7,0,!u.viewing);l(n,6,0,"cd-col-form-label",t),l(n,15,0,"access_key"),l(n,18,0,"access_key"),l(n,21,0,"access_key"),l(n,23,0,"access_key"),l(n,25,0,u.formGroup.showError("access_key",e["ɵnov"](n.parent,11),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,u.viewing,e["ɵnov"](n,17).ngClassUntouched,e["ɵnov"](n,17).ngClassTouched,e["ɵnov"](n,17).ngClassPristine,e["ɵnov"](n,17).ngClassDirty,e["ɵnov"](n,17).ngClassValid,e["ɵnov"](n,17).ngClassInvalid,e["ɵnov"](n,17).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass)}))}function su(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function du(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","secret_key"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](15,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](17,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](18,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,21).onClick()&&t),t}),null,null)),e["ɵdid"](21,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,23).onClick()&&t),t}),null,null)),e["ɵdid"](23,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,su)),e["ɵdid"](25,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var t=l(n,7,0,!u.viewing);l(n,6,0,"cd-col-form-label",t),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,21,0,"secret_key"),l(n,23,0,"secret_key"),l(n,25,0,u.formGroup.showError("secret_key",e["ɵnov"](n.parent,11),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,u.viewing,e["ɵnov"](n,17).ngClassUntouched,e["ɵnov"](n,17).ngClassTouched,e["ɵnov"](n,17).ngClassPristine,e["ɵnov"](n,17).ngClassDirty,e["ɵnov"](n,17).ngClassValid,e["ɵnov"](n,17).ngClassInvalid,e["ɵnov"](n,17).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass)}))}function ru(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](1,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](2,0,[""," ",""])),e["ɵppd"](3,1),e["ɵppd"](4,1)],(function(l,n){l(n,1,0,n.component.formGroup)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,2,0,l(n,3,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,2,1,l(n,4,0,e["ɵnov"](n.parent,1),u.resource));l(n,2,0,t,a)}))}function cu(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,40,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,34,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,33,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,22,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,4,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](22,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](23,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](25,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,lu)),e["ɵdid"](27,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,eu)),e["ɵdid"](29,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,tu)),e["ɵdid"](31,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,au)),e["ɵdid"](33,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ou)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,du)),e["ɵdid"](37,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](38,0,null,null,4,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,ru)),e["ɵdid"](40,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](42,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0);var t=l(n,23,0,!u.viewing);l(n,22,0,"cd-col-form-label",t),l(n,27,0,u.viewing),l(n,29,0,!u.viewing),l(n,31,0,u.formGroup.showError("user",e["ɵnov"](n,11),"required")),l(n,33,0,!u.viewing),l(n,35,0,!u.formGroup.getValue("generate_key")),l(n,37,0,!u.formGroup.getValue("generate_key")),l(n,40,0,!u.viewing),l(n,42,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess)}))}function mu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-s3-key-modal",[],null,null,null,cu,Hn)),e["ɵdid"](1,49152,null,0,$,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var fu=e["ɵccf"]("cd-rgw-user-s3-key-modal",$,mu,{},{submitAction:"submitAction"},[]),gu=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function pu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","type"],["id","type"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,2)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,2)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,2)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](4,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,4,0,"type"),l(n,7,0,"type")}),(function(l,n){l(n,0,0,!0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function vu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a type --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function bu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function hu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"select",[["autofocus",""],["class","form-control custom-select"],["formControlName","type"],["id","type"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,3).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](5,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vu)),e["ɵdid"](10,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bu)),e["ɵdid"](12,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,1,0,""),l(n,5,0,"type"),l(n,8,0,"type"),l(n,10,0,null!==u.types),l(n,12,0,u.types)}),(function(l,n){l(n,0,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function Cu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function _u(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Ru(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function yu(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,61,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,55,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,54,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,40,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,4,"label",[["class","cd-col-form-label"],["for","type"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](22,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](23,{required:0}),(l()(),e["ɵted"](-1,null,["Type"])),(l()(),e["ɵeld"](25,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,pu)),e["ɵdid"](27,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,hu)),e["ɵdid"](29,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Cu)),e["ɵdid"](31,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](32,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](33,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](36,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","perm"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permission"])),(l()(),e["ɵeld"](38,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](39,0,null,null,14,"select",[["class","form-control custom-select"],["formControlName","perm"],["id","perm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,41).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,41).onTouched()&&t),t}),null,null)),e["ɵdid"](40,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](41,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](43,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](45,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](46,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](47,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](48,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](49,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a permission --"])),(l()(),e["ɵand"](16777216,null,null,2,null,_u)),e["ɵdid"](52,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),e["ɵpad"](53,3),(l()(),e["ɵand"](16777216,null,null,1,null,Ru)),e["ɵdid"](55,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](56,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](57,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](58,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](59,0,[""," ",""])),e["ɵppd"](60,1),e["ɵppd"](61,1),(l()(),e["ɵeld"](62,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](63,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0);var t=l(n,23,0,!u.editing);l(n,22,0,"cd-col-form-label",t),l(n,27,0,u.editing),l(n,29,0,!u.editing),l(n,31,0,u.formGroup.showError("type",e["ɵnov"](n,11),"required")),l(n,33,0),l(n,43,0,"perm"),l(n,46,0,"perm"),l(n,48,0,null),l(n,49,0,null);var a=l(n,53,0,"read","write","*");l(n,52,0,a),l(n,55,0,u.formGroup.showError("perm",e["ɵnov"](n,11),"required")),l(n,58,0,u.formGroup),l(n,63,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess),l(n,32,0,e["ɵnov"](n,33).hasErrors,e["ɵnov"](n,33).hasSuccess),l(n,39,0,e["ɵnov"](n,45).ngClassUntouched,e["ɵnov"](n,45).ngClassTouched,e["ɵnov"](n,45).ngClassPristine,e["ɵnov"](n,45).ngClassDirty,e["ɵnov"](n,45).ngClassValid,e["ɵnov"](n,45).ngClassInvalid,e["ɵnov"](n,45).ngClassPending,e["ɵnov"](n,46).validClass,e["ɵnov"](n,46).invalidClass);var i=e["ɵunv"](n,59,0,l(n,60,0,e["ɵnov"](n,0),u.action)),o=e["ɵunv"](n,59,1,l(n,61,0,e["ɵnov"](n,1),u.resource));l(n,59,0,i,o)}))}function ku(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-capability-modal",[],null,null,null,yu,gu)),e["ɵdid"](1,49152,null,0,K,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var Iu=e["ɵccf"]("cd-rgw-user-capability-modal",K,ku,{},{submitAction:"submitAction"},[]),Eu=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function wu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function qu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen subuser ID is already in use."]))],null,null)}function Nu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Tu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function xu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Vu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,xu)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"secret_key"),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,20,0,"secret_key"),l(n,22,0,u.formGroup.showError("secret_key",e["ɵnov"](n.parent.parent,11),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function Su(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Swift key"])),(l()(),e["ɵeld"](3,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_secret"],["id","generate_secret"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_secret"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate secret"])),(l()(),e["ɵand"](16777216,null,null,1,null,Vu)),e["ɵdid"](20,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"generate_secret"),l(n,16,0,"generate_secret"),l(n,20,0,!u.editing&&!u.formGroup.getValue("generate_secret"))}),(function(l,n){l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function Du(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,93,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,87,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,86,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,72,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label"],["for","uid"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](22,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,7,"input",[["class","form-control"],["formControlName","uid"],["id","uid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,25)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,25).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,25)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,25)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](24,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](25,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](27,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](29,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](30,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](31,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](32,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](35,0,null,0,4,"label",[["class","cd-col-form-label"],["for","subuid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](37,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](38,{required:0}),(l()(),e["ɵted"](-1,null,["Subuser"])),(l()(),e["ɵeld"](40,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](41,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","subuid"],["id","subuid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,44)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,44).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,44)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,44)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](42,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](43,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](44,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](46,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](48,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](49,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,wu)),e["ɵdid"](51,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,qu)),e["ɵdid"](53,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](54,0,null,null,31,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](55,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](58,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","perm"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permission"])),(l()(),e["ɵeld"](60,0,null,0,25,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](61,0,null,null,22,"select",[["class","form-control custom-select"],["formControlName","perm"],["id","perm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,63).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,63).onTouched()&&t),t}),null,null)),e["ɵdid"](62,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](63,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](65,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](67,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](68,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](69,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](70,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](71,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a permission --"])),(l()(),e["ɵand"](16777216,null,null,2,null,Nu)),e["ɵdid"](74,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),e["ɵpad"](75,2),(l()(),e["ɵeld"](76,0,null,null,3,"option",[["value","read-write"]],null,null,null,null,null)),e["ɵdid"](77,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](78,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["read, write"])),(l()(),e["ɵeld"](80,0,null,null,3,"option",[["value","full-control"]],null,null,null,null,null)),e["ɵdid"](81,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](82,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["full"])),(l()(),e["ɵand"](16777216,null,null,1,null,Tu)),e["ɵdid"](85,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Su)),e["ɵdid"](87,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](88,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](89,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](90,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](91,0,[""," ",""])),e["ɵppd"](92,1),e["ɵppd"](93,1),(l()(),e["ɵeld"](94,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](95,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0),l(n,27,0,"uid"),l(n,30,0,"uid"),l(n,32,0);var t=l(n,38,0,!u.editing);l(n,37,0,"cd-col-form-label",t),l(n,42,0,""),l(n,46,0,"subuid"),l(n,49,0,"subuid"),l(n,51,0,u.formGroup.showError("subuid",e["ɵnov"](n,11),"required")),l(n,53,0,u.formGroup.showError("subuid",e["ɵnov"](n,11),"subuserIdExists")),l(n,55,0),l(n,65,0,"perm"),l(n,68,0,"perm"),l(n,70,0,null),l(n,71,0,null);var a=l(n,75,0,"read","write");l(n,74,0,a),l(n,77,0,"read-write"),l(n,78,0,"read-write"),l(n,81,0,"full-control"),l(n,82,0,"full-control"),l(n,85,0,u.formGroup.showError("perm",e["ɵnov"](n,11),"required")),l(n,87,0,!u.editing),l(n,90,0,u.formGroup),l(n,95,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess),l(n,23,0,!0,e["ɵnov"](n,29).ngClassUntouched,e["ɵnov"](n,29).ngClassTouched,e["ɵnov"](n,29).ngClassPristine,e["ɵnov"](n,29).ngClassDirty,e["ɵnov"](n,29).ngClassValid,e["ɵnov"](n,29).ngClassInvalid,e["ɵnov"](n,29).ngClassPending,e["ɵnov"](n,30).validClass,e["ɵnov"](n,30).invalidClass),l(n,31,0,e["ɵnov"](n,32).hasErrors,e["ɵnov"](n,32).hasSuccess),l(n,41,0,u.editing,e["ɵnov"](n,48).ngClassUntouched,e["ɵnov"](n,48).ngClassTouched,e["ɵnov"](n,48).ngClassPristine,e["ɵnov"](n,48).ngClassDirty,e["ɵnov"](n,48).ngClassValid,e["ɵnov"](n,48).ngClassInvalid,e["ɵnov"](n,48).ngClassPending,e["ɵnov"](n,49).validClass,e["ɵnov"](n,49).invalidClass),l(n,54,0,e["ɵnov"](n,55).hasErrors,e["ɵnov"](n,55).hasSuccess),l(n,61,0,e["ɵnov"](n,67).ngClassUntouched,e["ɵnov"](n,67).ngClassTouched,e["ɵnov"](n,67).ngClassPristine,e["ɵnov"](n,67).ngClassDirty,e["ɵnov"](n,67).ngClassValid,e["ɵnov"](n,67).ngClassInvalid,e["ɵnov"](n,67).ngClassPending,e["ɵnov"](n,68).validClass,e["ɵnov"](n,68).invalidClass);var i=e["ɵunv"](n,91,0,l(n,92,0,e["ɵnov"](n,0),u.action)),o=e["ɵunv"](n,91,1,l(n,93,0,e["ɵnov"](n,1),u.resource));l(n,91,0,i,o)}))}function Fu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-subuser-modal",[],null,null,null,Du,Eu)),e["ɵdid"](1,49152,null,0,Q,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var ju=e["ɵccf"]("cd-rgw-user-subuser-modal",Q,Fu,{},{submitAction:"submitAction"},[]),Bu=u("yT6U"),Pu=u("4DD9"),Au=u("+0ag"),Mu=u("IzCI"),Ou=u("Dwqy"),Uu=u("uYzU"),Lu=u("FFMq"),zu=u("E2fk"),Gu=u("nSDx"),Ku=u("SB+Q"),$u=u("TYzs"),Zu=u("BQkM"),Qu=u("dEH0"),Yu=u("G1/K"),Wu=u("efK2"),Ju=u("CNMR"),Xu=u("KOzp"),Hu=u("2uy1"),le=u("38Bd"),ne=u("978R"),ue=u("w9WL"),ee=u("iInd"),te=u("9Xeq"),ae=u("hrfs"),ie=u("yGOH"),oe=u("bxSN"),se=u("WF9J"),de=u("V/fk"),re=u("ChqD"),ce=u("PCNd"),me=u("G6Q+"),fe=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ge(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Overall Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","WAkugZpiz"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Overall Performance"),l(n,3,0,"rgw-overview?","two","WAkugZpiz")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function pe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Sync Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","rgw-sync-overview"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Sync Performance"),l(n,3,0,"radosgw-sync-overview?","two","rgw-sync-overview")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function ve(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,5,"tab",[["heading","Daemons List"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,3,"cd-table",[["columnMode","flex"]],null,[[null,"setExpandedRow"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"fetchData"===n&&(e=!1!==t.getDaemonList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](5,2867200,null,0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"]},{fetchData:"fetchData",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](6,0,null,3,1,"cd-rgw-daemon-details",[["cdTableDetail",""]],null,null,null,Al,jl)),e["ɵdid"](7,573440,null,0,Fl,[A,F.a],{selection:[0,"selection"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,ge)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,pe)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Daemons List"),l(n,5,0,u.daemons,u.columns,"flex",!0),l(n,7,0,u.expandedRow),l(n,9,0,u.grafanaPermission.read),l(n,11,0,u.grafanaPermission.read&&u.isMultiSite)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function be(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-daemon-list",[],null,null,null,ve,fe)),e["ɵdid"](1,114688,null,0,O,[A,F.a,M.a,El.a,v],null,null)],(function(l,n){l(n,1,0)}),null)}var he=e["ɵccf"]("cd-rgw-daemon-list",O,be,{},{},[]),Ce=u("DqMs"),_e=u("/NlG"),Re=u("NUGo"),ye=u("S7zO"),ke=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ie(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["size","slim"],["type","warning"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"],size:[1,"size"]},null),(l()(),e["ɵted"](-1,0,["The user list data might be stale. If needed, you can manually reload it."]))],(function(l,n){l(n,1,0,"warning","slim")}),null)}function Ee(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{table:0}),(l()(),e["ɵand"](16777216,null,null,1,null,Ie)),e["ɵdid"](2,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](3,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","uid"],["selectionType","multiClick"]],null,[[null,"setExpandedRow"],[null,"updateSelection"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"updateSelection"===n&&(e=!1!==t.updateSelection(u)&&e),"fetchData"===n&&(e=!1!==t.getUserList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](4,2867200,[[1,4],["table",4]],0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],autoReload:[4,"autoReload"],identifier:[5,"identifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](5,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Re.b,Re.a)),e["ɵdid"](6,114688,null,0,ye.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](7,0,null,3,1,"cd-rgw-user-details",[["cdTableDetail",""]],null,null,null,Sn,dn)),e["ɵdid"](8,638976,null,0,on,[b.a,sn.b,El.a],{selection:[0,"selection"]},null)],(function(l,n){var u=n.component;l(n,2,0,u.isStale),l(n,4,0,u.users,u.columns,"flex",!0,!1,"uid","multiClick"),l(n,6,0,u.permission,u.selection,u.tableActions),l(n,8,0,u.expandedRow)}),null)}function we(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-rgw-user-list",[],null,null,null,Ee,ke)),e["ɵprd"](256,null,j.a,X,[]),e["ɵdid"](2,49152,null,0,H,[F.a,b.a,sn.b,El.a,j.a,t.b,e.NgZone],null,null)],null,null)}var qe=e["ɵccf"]("cd-rgw-user-list",H,we,{},{},[]),Ne=u("QC43"),Te=u("XFyV"),xe=u("EmSq"),Ve=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Se(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Ne.b,Ne.a)),e["ɵdid"](1,49152,null,0,Te.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading user data..."]))],null,null)}function De(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["type","error"]],null,[[null,"backAction"]],(function(l,n,u){var e=!0;return"backAction"===n&&(e=!1!==l.component.goToListView()&&e),e}),Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"]},{backAction:"backAction"}),(l()(),e["ɵted"](-1,0,["The user data could not be loaded."]))],(function(l,n){l(n,1,0,"error")}),null)}function Fe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function je(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen user ID is already in use."]))],null,null)}function Be(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Pe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This is not a valid email address."]))],null,null)}function Ae(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen email address is already in use."]))],null,null)}function Me(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Oe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 1."]))],null,null)}function Ue(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,0,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,8,"input",[["class","form-control"],["formControlName","max_buckets"],["id","max_buckets"],["min","1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](9,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](11,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Me)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Oe)),e["ɵdid"](18,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"max_buckets"),l(n,14,0,"max_buckets"),l(n,16,0,u.userForm.showError("max_buckets",e["ɵnov"](n.parent,3),"required")),l(n,18,0,u.userForm.showError("max_buckets",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function Le(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ze(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,15,{FormControlNames:1}),e["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","access_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Access key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","access_key"],["id","access_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[15,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Le)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"access_key"),l(n,15,0,"access_key"),l(n,18,0,"access_key"),l(n,20,0,"access_key"),l(n,22,0,u.userForm.showError("access_key",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function Ge(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ke(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,17,{FormControlNames:1}),e["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[17,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ge)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"secret_key"),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,20,0,"secret_key"),l(n,22,0,u.userForm.showError("secret_key",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function $e(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["S3 key"])),(l()(),e["ɵeld"](3,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,13,{FormControlNames:1}),e["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_key"],["id","generate_key"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[13,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate key"])),(l()(),e["ɵand"](16777216,null,null,1,null,ze)),e["ɵdid"](20,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ke)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"generate_key"),l(n,16,0,"generate_key"),l(n,20,0,!u.editing&&!u.userForm.getValue("generate_key")),l(n,22,0,!u.editing&&!u.userForm.getValue("generate_key"))}),(function(l,n){l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function Ze(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no subusers."]))],null,null)}function Qe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,23,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,2,"div",[["class","input-group-prepend border-left-0 border-right-0"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](11,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](12,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,16777216,null,null,5,"button",[["class","btn btn-light tc_showSubuserButton"],["tooltip","Edit"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSubuserModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](14,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](15,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](17,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](18,1),(l()(),e["ɵeld"](19,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteSubuserButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteSubuser(l.context.index)&&e),e}),null,null)),e["ɵdid"](20,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](21,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](23,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](24,1),(l()(),e["ɵeld"](25,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,14,0,"Edit");var e=l(n,18,0,u.icons.edit);l(n,17,0,e),l(n,20,0,"Delete");var t=l(n,24,0,u.icons.destroy);l(n,23,0,t)}),(function(l,n){var u=n.component;l(n,4,0,e["ɵinlineInterpolate"](1,"",u.icons.user,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.id,"")),l(n,9,0,e["ɵinlineInterpolate"](1,"",u.icons.share,"")),l(n,10,0,e["ɵinlineInterpolate"](1,"","full-control"===n.context.$implicit.permissions?"full":n.context.$implicit.permissions,""))}))}function Ye(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Subusers"])),(l()(),e["ɵeld"](3,0,null,null,17,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,16,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Ze)),e["ɵdid"](6,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Qe)),e["ɵdid"](8,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](9,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"button",[["class","btn btn-light float-right tc_addSubuserButton"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSubuserModal()&&e),e}),null,null)),(l()(),e["ɵeld"](12,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](14,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](15,1),(l()(),e["ɵeld"](16,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](17,null,[""," ",""])),e["ɵppd"](18,1),e["ɵppd"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,6,0,0===u.subusers.length),l(n,8,0,u.subusers);var e=l(n,15,0,u.icons.add);l(n,14,0,e)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,17,0,l(n,18,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.CREATE)),a=e["ɵunv"](n,17,1,l(n,19,0,e["ɵnov"](n.parent.parent,1),u.subuserLabel));l(n,17,0,t,a)}))}function We(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no keys."]))],null,null)}function Je(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,18,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"div",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_showS3KeyButton"],["tooltip","Show"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showS3KeyModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteS3KeyButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteS3Key(l.context.index)&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Show");var e=l(n,13,0,u.icons.show);l(n,12,0,e),l(n,15,0,"Delete");var t=l(n,19,0,u.icons.destroy);l(n,18,0,t)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.key,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.user,""))}))}function Xe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no keys."]))],null,null)}function He(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,12,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,6,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_showSwiftKeyButton"],["tooltip","Show"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSwiftKeyModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Show");var e=l(n,13,0,u.icons.show);l(n,12,0,e)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.key,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.user,""))}))}function lt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,37,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Keys"])),(l()(),e["ɵeld"](3,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,19,{FormControlNames:1}),e["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["S3"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,We)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Je)),e["ɵdid"](13,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](14,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](15,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,8,"button",[["class","btn btn-light float-right tc_addS3KeyButton"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showS3KeyModal()&&e),e}),null,null)),(l()(),e["ɵeld"](17,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](19,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](20,1),(l()(),e["ɵeld"](21,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](22,null,[""," ",""])),e["ɵppd"](23,1),e["ɵppd"](24,1),(l()(),e["ɵeld"](25,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null)),(l()(),e["ɵeld"](26,0,null,0,0,"hr",[],null,null,null,null,null)),(l()(),e["ɵeld"](27,0,null,null,10,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](28,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,21,{FormControlNames:1}),e["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),e["ɵeld"](31,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Swift"])),(l()(),e["ɵeld"](33,0,null,0,4,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Xe)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,He)),e["ɵdid"](37,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,11,0,0===u.s3Keys.length),l(n,13,0,u.s3Keys);var e=l(n,20,0,u.icons.add);l(n,19,0,e),l(n,28,0),l(n,35,0,0===u.swiftKeys.length),l(n,37,0,u.swiftKeys)}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess);var t=e["ɵunv"](n,22,0,l(n,23,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.CREATE)),a=e["ɵunv"](n,22,1,l(n,24,0,e["ɵnov"](n.parent.parent,1),u.s3keyLabel));l(n,22,0,t,a),l(n,27,0,e["ɵnov"](n,28).hasErrors,e["ɵnov"](n,28).hasSuccess)}))}function nt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no capabilities."]))],null,null)}function ut(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,18,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"span",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"div",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_editCapButton"],["tooltip","Edit"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showCapabilityModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteCapButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteCapability(l.context.index)&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Edit");var e=l(n,13,0,u.icons.edit);l(n,12,0,e),l(n,15,0,"Delete");var t=l(n,19,0,u.icons.destroy);l(n,18,0,t)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.share,"")),l(n,5,0,e["ɵinlineInterpolate"](2,"",n.context.$implicit.type,":",n.context.$implicit.perm,""))}))}function et(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,24,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Capabilities"])),(l()(),e["ɵeld"](3,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,23,{FormControlNames:1}),e["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,17,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,nt)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ut)),e["ɵdid"](11,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](12,0,null,null,11,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,10,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](14,16777216,null,null,9,"button",[["class","btn btn-light float-right tc_addCapButton"],["tooltip","All capabilities are already added."],["triggers","pointerenter pointerleave"],["type","button"]],[[8,"disabled",0]],[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showCapabilityModal()&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"],isDisabled:[2,"isDisabled"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](21,null,[""," ",""])),e["ɵppd"](22,1),e["ɵppd"](23,1),(l()(),e["ɵeld"](24,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,4,0),l(n,9,0,0===u.capabilities.length),l(n,11,0,u.capabilities),l(n,15,0,"All capabilities are already added.","pointerenter pointerleave",!u.hasAllCapabilities());var e=l(n,19,0,u.icons.add);l(n,18,0,e)}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,14,0,u.hasAllCapabilities());var t=e["ɵunv"](n,21,0,l(n,22,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.ADD)),a=e["ɵunv"](n,21,1,l(n,23,0,e["ɵnov"](n.parent.parent,1),u.capabilityLabel));l(n,21,0,t,a)}))}function tt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,27,{FormControlNames:1}),e["ɵqud"](603979776,28,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_max_size_unlimited"],["id","user_quota_max_size_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[27,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_max_size_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited size"]))],(function(l,n){l(n,1,0),l(n,10,0,"user_quota_max_size_unlimited"),l(n,13,0,"user_quota_max_size_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function at(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function it(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function ot(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,29,{FormControlNames:1}),e["ɵqud"](603979776,30,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","user_quota_max_size"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. size"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["formControlName","user_quota_max_size"],["id","user_quota_max_size"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,12).onBlur(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](10,671744,[[29,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,81920,null,0,xe.a,[e.ElementRef,o.q,S.a,L.a],null,null),e["ɵdid"](13,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,at)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,it)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,10,0,"user_quota_max_size"),l(n,12,0),l(n,15,0,"user_quota_max_size"),l(n,17,0,u.userForm.showError("user_quota_max_size",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("user_quota_max_size",e["ɵnov"](n.parent,3),"quotaMaxSize"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function st(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,31,{FormControlNames:1}),e["ɵqud"](603979776,32,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_max_objects_unlimited"],["id","user_quota_max_objects_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[31,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_max_objects_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited objects"]))],(function(l,n){l(n,1,0),l(n,10,0,"user_quota_max_objects_unlimited"),l(n,13,0,"user_quota_max_objects_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function dt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function rt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 0."]))],null,null)}function ct(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,33,{FormControlNames:1}),e["ɵqud"](603979776,34,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","user_quota_max_objects"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. objects"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","user_quota_max_objects"],["id","user_quota_max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](10,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](12,671744,[[33,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,dt)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,rt)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"user_quota_max_objects"),l(n,15,0,"user_quota_max_objects"),l(n,17,0,u.userForm.showError("user_quota_max_objects",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("user_quota_max_objects",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function mt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,37,{FormControlNames:1}),e["ɵqud"](603979776,38,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_max_size_unlimited"],["id","bucket_quota_max_size_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[37,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_max_size_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited size"]))],(function(l,n){l(n,1,0),l(n,10,0,"bucket_quota_max_size_unlimited"),l(n,13,0,"bucket_quota_max_size_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function ft(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function gt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function pt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,39,{FormControlNames:1}),e["ɵqud"](603979776,40,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","bucket_quota_max_size"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. size"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["formControlName","bucket_quota_max_size"],["id","bucket_quota_max_size"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,12).onBlur(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](10,671744,[[39,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,81920,null,0,xe.a,[e.ElementRef,o.q,S.a,L.a],null,null),e["ɵdid"](13,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ft)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gt)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,10,0,"bucket_quota_max_size"),l(n,12,0),l(n,15,0,"bucket_quota_max_size"),l(n,17,0,u.userForm.showError("bucket_quota_max_size",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("bucket_quota_max_size",e["ɵnov"](n.parent,3),"quotaMaxSize"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function vt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,41,{FormControlNames:1}),e["ɵqud"](603979776,42,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_max_objects_unlimited"],["id","bucket_quota_max_objects_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[41,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_max_objects_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited objects"]))],(function(l,n){l(n,1,0),l(n,10,0,"bucket_quota_max_objects_unlimited"),l(n,13,0,"bucket_quota_max_objects_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function bt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ht(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 0."]))],null,null)}function Ct(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,43,{FormControlNames:1}),e["ɵqud"](603979776,44,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","bucket_quota_max_objects"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. objects"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","bucket_quota_max_objects"],["id","bucket_quota_max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](10,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](12,671744,[[43,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bt)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ht)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"bucket_quota_max_objects"),l(n,15,0,"bucket_quota_max_objects"),l(n,17,0,u.userForm.showError("bucket_quota_max_objects",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("bucket_quota_max_objects",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function _t(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,190,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,189,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,3).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,3).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,6).onSubmit()&&t),t}),null,null)),e["ɵdid"](2,16384,null,0,o.G,[],null,null),e["ɵdid"](3,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](5,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](6,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](7,0,null,null,183,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,[""," ",""])),e["ɵppd"](10,1),e["ɵppd"](11,1),(l()(),e["ɵeld"](12,0,null,null,169,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](14,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](17,0,null,0,4,"label",[["class","cd-col-form-label"],["for","uid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](19,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](20,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](22,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","uid"],["id","uid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,26)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,26).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,26)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,26)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](24,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](25,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](26,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](28,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](30,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](31,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Fe)),e["ɵdid"](33,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,je)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](36,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](37,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](40,0,null,0,4,"label",[["class","cd-col-form-label"],["for","display_name"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](42,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](43,{required:0}),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](45,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](46,0,null,null,7,"input",[["class","form-control"],["formControlName","display_name"],["id","display_name"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,48)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,48).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,48)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,48)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](47,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](48,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](50,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](52,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](53,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Be)),e["ɵdid"](55,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](56,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](57,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"],["for","email"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email address"])),(l()(),e["ɵeld"](62,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,7,"input",[["class","form-control"],["formControlName","email"],["id","email"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,65)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,65).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,65)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,65)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](64,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](65,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](67,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](69,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](70,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Pe)),e["ɵdid"](72,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ae)),e["ɵdid"](74,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](75,0,null,null,26,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](76,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](79,0,null,0,1,"label",[["class","cd-col-form-label"],["for","max_buckets_mode"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. buckets"])),(l()(),e["ɵeld"](81,0,null,0,20,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](82,0,null,null,19,"select",[["class","form-control custom-select"],["formControlName","max_buckets_mode"],["id","max_buckets_mode"],["name","max_buckets_mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,84).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,84).onTouched()&&t),"change"===n&&(t=!1!==a.onMaxBucketsModeChange(u.target.value)&&t),t}),null,null)),e["ɵdid"](83,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](84,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](86,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](88,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](89,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](90,0,null,null,3,"option",[["value","-1"]],null,null,null,null,null)),e["ɵdid"](91,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](92,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Disabled"])),(l()(),e["ɵeld"](94,0,null,null,3,"option",[["value","0"]],null,null,null,null,null)),e["ɵdid"](95,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](96,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Unlimited"])),(l()(),e["ɵeld"](98,0,null,null,3,"option",[["value","1"]],null,null,null,null,null)),e["ɵdid"](99,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](100,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Custom"])),(l()(),e["ɵand"](16777216,null,null,1,null,Ue)),e["ɵdid"](103,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](104,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](105,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,11,{FormControlNames:1}),e["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),e["ɵeld"](108,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](109,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](110,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","suspended"],["id","suspended"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,112).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,112).onTouched()&&t),t}),null,null)),e["ɵdid"](111,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](112,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](114,671744,[[11,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](116,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](117,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](118,0,null,null,1,"label",[["class","custom-control-label"],["for","suspended"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Suspended"])),(l()(),e["ɵand"](16777216,null,null,1,null,$e)),e["ɵdid"](121,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ye)),e["ɵdid"](123,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,lt)),e["ɵdid"](125,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,et)),e["ɵdid"](127,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](128,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](129,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User quota"])),(l()(),e["ɵeld"](131,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](132,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,25,{FormControlNames:1}),e["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),e["ɵeld"](135,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](136,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](137,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_enabled"],["id","user_quota_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,139).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,139).onTouched()&&t),t}),null,null)),e["ɵdid"](138,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](139,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](141,671744,[[25,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](143,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](144,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](145,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵand"](16777216,null,null,1,null,tt)),e["ɵdid"](148,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ot)),e["ɵdid"](150,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,st)),e["ɵdid"](152,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ct)),e["ɵdid"](154,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](155,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](156,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](158,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](159,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,35,{FormControlNames:1}),e["ɵqud"](603979776,36,{messagesBlock:0}),(l()(),e["ɵeld"](162,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](163,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](164,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_enabled"],["id","bucket_quota_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,166).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,166).onTouched()&&t),t}),null,null)),e["ɵdid"](165,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](166,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](168,671744,[[35,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](170,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](171,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](172,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵand"](16777216,null,null,1,null,mt)),e["ɵdid"](175,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,pt)),e["ɵdid"](177,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vt)),e["ɵdid"](179,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ct)),e["ɵdid"](181,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](182,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](183,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](184,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](185,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](186,0,[""," ",""])),e["ɵppd"](187,1),e["ɵppd"](188,1),(l()(),e["ɵeld"](189,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](190,49152,null,0,Kn.a,[Dl.Location,t.b],null,null)],(function(l,n){var u=n.component;l(n,3,0,u.userForm),l(n,6,0,u.userForm),l(n,14,0);var t=l(n,20,0,!u.editing);l(n,19,0,"cd-col-form-label",t),l(n,24,0,""),l(n,28,0,"uid"),l(n,31,0,"uid"),l(n,33,0,u.userForm.showError("uid",e["ɵnov"](n,3),"required")),l(n,35,0,u.userForm.showError("uid",e["ɵnov"](n,3),"notUnique")),l(n,37,0);var a=l(n,43,0,!u.editing);l(n,42,0,"cd-col-form-label",a),l(n,50,0,"display_name"),l(n,53,0,"display_name"),l(n,55,0,u.userForm.showError("display_name",e["ɵnov"](n,3),"required")),l(n,57,0),l(n,67,0,"email"),l(n,70,0,"email"),l(n,72,0,u.userForm.showError("email",e["ɵnov"](n,3),"email")),l(n,74,0,u.userForm.showError("email",e["ɵnov"](n,3),"notUnique")),l(n,76,0),l(n,86,0,"max_buckets_mode"),l(n,89,0,"max_buckets_mode"),l(n,91,0,"-1"),l(n,92,0,"-1"),l(n,95,0,"0"),l(n,96,0,"0"),l(n,99,0,"1"),l(n,100,0,"1"),l(n,103,0,1==u.userForm.get("max_buckets_mode").value),l(n,105,0),l(n,114,0,"suspended"),l(n,117,0,"suspended"),l(n,121,0,!u.editing),l(n,123,0,u.editing),l(n,125,0,u.editing),l(n,127,0,u.editing),l(n,132,0),l(n,141,0,"user_quota_enabled"),l(n,144,0,"user_quota_enabled"),l(n,148,0,u.userForm.controls.user_quota_enabled.value),l(n,150,0,u.userForm.controls.user_quota_enabled.value&&!u.userForm.getValue("user_quota_max_size_unlimited")),l(n,152,0,u.userForm.controls.user_quota_enabled.value),l(n,154,0,u.userForm.controls.user_quota_enabled.value&&!u.userForm.getValue("user_quota_max_objects_unlimited")),l(n,159,0),l(n,168,0,"bucket_quota_enabled"),l(n,171,0,"bucket_quota_enabled"),l(n,175,0,u.userForm.controls.bucket_quota_enabled.value),l(n,177,0,u.userForm.controls.bucket_quota_enabled.value&&!u.userForm.getValue("bucket_quota_max_size_unlimited")),l(n,179,0,u.userForm.controls.bucket_quota_enabled.value),l(n,181,0,u.userForm.controls.bucket_quota_enabled.value&&!u.userForm.getValue("bucket_quota_max_objects_unlimited")),l(n,185,0,u.userForm)}),(function(l,n){var u=n.component;l(n,1,0,e["ɵnov"](n,5).ngClassUntouched,e["ɵnov"](n,5).ngClassTouched,e["ɵnov"](n,5).ngClassPristine,e["ɵnov"](n,5).ngClassDirty,e["ɵnov"](n,5).ngClassValid,e["ɵnov"](n,5).ngClassInvalid,e["ɵnov"](n,5).ngClassPending);var t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,9,1,l(n,11,0,e["ɵnov"](n.parent,1),u.resource));l(n,9,0,t,a),l(n,13,0,e["ɵnov"](n,14).hasErrors,e["ɵnov"](n,14).hasSuccess),l(n,23,0,u.editing,e["ɵnov"](n,30).ngClassUntouched,e["ɵnov"](n,30).ngClassTouched,e["ɵnov"](n,30).ngClassPristine,e["ɵnov"](n,30).ngClassDirty,e["ɵnov"](n,30).ngClassValid,e["ɵnov"](n,30).ngClassInvalid,e["ɵnov"](n,30).ngClassPending,e["ɵnov"](n,31).validClass,e["ɵnov"](n,31).invalidClass),l(n,36,0,e["ɵnov"](n,37).hasErrors,e["ɵnov"](n,37).hasSuccess),l(n,46,0,e["ɵnov"](n,52).ngClassUntouched,e["ɵnov"](n,52).ngClassTouched,e["ɵnov"](n,52).ngClassPristine,e["ɵnov"](n,52).ngClassDirty,e["ɵnov"](n,52).ngClassValid,e["ɵnov"](n,52).ngClassInvalid,e["ɵnov"](n,52).ngClassPending,e["ɵnov"](n,53).validClass,e["ɵnov"](n,53).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess),l(n,63,0,e["ɵnov"](n,69).ngClassUntouched,e["ɵnov"](n,69).ngClassTouched,e["ɵnov"](n,69).ngClassPristine,e["ɵnov"](n,69).ngClassDirty,e["ɵnov"](n,69).ngClassValid,e["ɵnov"](n,69).ngClassInvalid,e["ɵnov"](n,69).ngClassPending,e["ɵnov"](n,70).validClass,e["ɵnov"](n,70).invalidClass),l(n,75,0,e["ɵnov"](n,76).hasErrors,e["ɵnov"](n,76).hasSuccess),l(n,82,0,e["ɵnov"](n,88).ngClassUntouched,e["ɵnov"](n,88).ngClassTouched,e["ɵnov"](n,88).ngClassPristine,e["ɵnov"](n,88).ngClassDirty,e["ɵnov"](n,88).ngClassValid,e["ɵnov"](n,88).ngClassInvalid,e["ɵnov"](n,88).ngClassPending,e["ɵnov"](n,89).validClass,e["ɵnov"](n,89).invalidClass),l(n,104,0,e["ɵnov"](n,105).hasErrors,e["ɵnov"](n,105).hasSuccess),l(n,110,0,e["ɵnov"](n,116).ngClassUntouched,e["ɵnov"](n,116).ngClassTouched,e["ɵnov"](n,116).ngClassPristine,e["ɵnov"](n,116).ngClassDirty,e["ɵnov"](n,116).ngClassValid,e["ɵnov"](n,116).ngClassInvalid,e["ɵnov"](n,116).ngClassPending,e["ɵnov"](n,117).validClass,e["ɵnov"](n,117).invalidClass),l(n,131,0,e["ɵnov"](n,132).hasErrors,e["ɵnov"](n,132).hasSuccess),l(n,137,0,e["ɵnov"](n,143).ngClassUntouched,e["ɵnov"](n,143).ngClassTouched,e["ɵnov"](n,143).ngClassPristine,e["ɵnov"](n,143).ngClassDirty,e["ɵnov"](n,143).ngClassValid,e["ɵnov"](n,143).ngClassInvalid,e["ɵnov"](n,143).ngClassPending,e["ɵnov"](n,144).validClass,e["ɵnov"](n,144).invalidClass),l(n,158,0,e["ɵnov"](n,159).hasErrors,e["ɵnov"](n,159).hasSuccess),l(n,164,0,e["ɵnov"](n,170).ngClassUntouched,e["ɵnov"](n,170).ngClassTouched,e["ɵnov"](n,170).ngClassPristine,e["ɵnov"](n,170).ngClassDirty,e["ɵnov"](n,170).ngClassValid,e["ɵnov"](n,170).ngClassInvalid,e["ɵnov"](n,170).ngClassPending,e["ɵnov"](n,171).validClass,e["ɵnov"](n,171).invalidClass);var i=e["ɵunv"](n,186,0,l(n,187,0,e["ɵnov"](n.parent,0),u.action)),o=e["ɵunv"](n,186,1,l(n,188,0,e["ɵnov"](n.parent,1),u.resource));l(n,186,0,i,o)}))}function Rt(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵand"](16777216,null,null,1,null,Se)),e["ɵdid"](3,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,De)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,_t)),e["ɵdid"](7,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.editing&&u.loading&&!u.error),l(n,5,0,u.editing&&u.error),l(n,7,0,!u.loading&&!u.error)}),null)}function yt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-form",[],null,null,null,Rt,Ve)),e["ɵdid"](1,114688,null,0,W,[_.a,ee.a,ee.m,b.a,sn.b,y.a,El.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var kt=e["ɵccf"]("cd-rgw-user-form",W,yt,{},{},[]),It=u("xSw7"),Et=u("GgAd"),wt=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function qt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["size","slim"],["type","warning"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"],size:[1,"size"]},null),(l()(),e["ɵted"](-1,0,["The bucket list data might be stale. If needed, you can manually reload it."]))],(function(l,n){l(n,1,0,"warning","slim")}),null)}function Nt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-usage-bar",[],null,null,null,It.b,It.a)),e["ɵdid"](1,573440,null,0,Et.a,[],{total:[0,"total"],used:[1,"used"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.bucket_quota.max_size,n.parent.context.row.bucket_size)}),null)}function Tt(l){return e["ɵvid"](0,[(l()(),e["ɵted"](-1,null,["No Limit"]))],null,null)}function xt(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Nt)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](0,[["noSizeQuota",2]],null,0,null,Tt))],(function(l,n){l(n,1,0,n.context.row.bucket_quota.max_size>0&&n.context.row.bucket_quota.enabled,e["ɵnov"](n,2))}),null)}function Vt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-usage-bar",[],null,null,null,It.b,It.a)),e["ɵdid"](1,573440,null,0,Et.a,[],{total:[0,"total"],used:[1,"used"],isBinary:[2,"isBinary"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.bucket_quota.max_objects,n.parent.context.row.num_objects,!1)}),null)}function St(l){return e["ɵvid"](0,[(l()(),e["ɵted"](-1,null,["No Limit"]))],null,null)}function Dt(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Vt)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](0,[["noObjectQuota",2]],null,0,null,St))],(function(l,n){l(n,1,0,n.context.row.bucket_quota.max_objects>0&&n.context.row.bucket_quota.enabled,e["ɵnov"](n,2))}),null)}function Ft(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{table:0}),e["ɵqud"](402653184,2,{bucketSizeTpl:0}),e["ɵqud"](402653184,3,{bucketObjectTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,qt)),e["ɵdid"](4,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](5,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","bid"],["selectionType","multiClick"]],null,[[null,"setExpandedRow"],[null,"updateSelection"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"updateSelection"===n&&(e=!1!==t.updateSelection(u)&&e),"fetchData"===n&&(e=!1!==t.getBucketList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](6,2867200,[[1,4],["table",4]],0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],autoReload:[4,"autoReload"],identifier:[5,"identifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](7,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Re.b,Re.a)),e["ɵdid"](8,114688,null,0,ye.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](9,0,null,3,1,"cd-rgw-bucket-details",[["cdTableDetail",""]],null,null,null,Xl,zl)),e["ɵdid"](10,573440,null,0,Ll,[p],{selection:[0,"selection"]},null),(l()(),e["ɵand"](0,[[2,2],["bucketSizeTpl",2]],null,0,null,xt)),(l()(),e["ɵand"](0,[[3,2],["bucketObjectTpl",2]],null,0,null,Dt))],(function(l,n){var u=n.component;l(n,4,0,u.isStale),l(n,6,0,u.buckets,u.columns,"flex",!0,!1,"bid","multiClick"),l(n,8,0,u.permission,u.selection,u.tableActions),l(n,10,0,u.expandedRow)}),null)}function jt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-rgw-bucket-list",[],null,null,null,Ft,wt)),e["ɵprd"](256,null,j.a,B,[]),e["ɵdid"](2,114688,null,0,P,[F.a,S.a,D.a,p,sn.b,El.a,j.a,t.b,e.NgZone,e.ChangeDetectorRef],null,null)],(function(l,n){l(n,2,0)}),null)}var Bt=e["ɵccf"]("cd-rgw-bucket-list",P,jt,{},{},[]),Pt=u("4HWh"),At=u("p4Cf"),Mt=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ot(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Ne.b,Ne.a)),e["ɵdid"](1,49152,null,0,Te.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading bucket data..."]))],null,null)}function Ut(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","id"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Id"])),(l()(),e["ɵeld"](6,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","id"],["id","id"],["name","id"],["readonly",""],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,1,0),l(n,11,0,"id"),l(n,14,0,"id")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function Lt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function zt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function Gt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen name is already in use."]))],null,null)}function Kt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function $t(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a user --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Zt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Qt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Yt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Wt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a placement target --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Jt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.name),l(n,2,0,n.context.$implicit.name)}),(function(l,n){l(n,3,0,n.context.$implicit.description)}))}function Xt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ht(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","placement-target"],["id","placement-target"],["name","placement-target"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,2).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](4,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Yt)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Wt)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Jt)),e["ɵdid"](13,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Xt)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](0,null,null,0))],(function(l,n){var u=n.component;l(n,4,0,"placement-target"),l(n,7,0,"placement-target"),l(n,9,0,null===u.placementTargets),l(n,11,0,null!==u.placementTargets),l(n,13,0,u.placementTargets),l(n,15,0,u.bucketForm.showError("placement-target",e["ɵnov"](n.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function la(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,8,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,7,"input",[["class","form-control"],["formControlName","placement-target"],["id","placement-target"],["name","placement-target"],["readonly",""],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,3)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,3)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,3)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](5,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,5,0,"placement-target"),l(n,8,0,"placement-target")}),(function(l,n){l(n,1,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function na(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Versioning"])),(l()(),e["ɵeld"](3,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","versioning"],["id","versioning"],["name","versioning"],["type","checkbox"]],[[8,"checked",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),"change"===n&&(t=!1!==a.updateVersioning()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","versioning"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](19,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](20,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](21,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables versioning for the objects in the bucket."]))],(function(l,n){l(n,4,0),l(n,13,0,"versioning"),l(n,16,0,"versioning")}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,u.isVersioningEnabled,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function ua(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ea(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,13,{FormControlNames:1}),e["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mfa-token-serial"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Token Serial Number"])),(l()(),e["ɵeld"](6,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","mfa-token-serial"],["id","mfa-token-serial"],["name","mfa-token-serial"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[13,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ua)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"mfa-token-serial"),l(n,14,0,"mfa-token-serial"),l(n,16,0,u.bucketForm.showError("mfa-token-serial",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function ta(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function aa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,15,{FormControlNames:1}),e["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mfa-token-pin"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Token PIN"])),(l()(),e["ɵeld"](6,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","mfa-token-pin"],["id","mfa-token-pin"],["name","mfa-token-pin"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[15,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ta)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"mfa-token-pin"),l(n,14,0,"mfa-token-pin"),l(n,16,0,u.bucketForm.showError("mfa-token-pin",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function ia(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Multi-Factor Authentication"])),(l()(),e["ɵeld"](3,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,11,{FormControlNames:1}),e["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","mfa-delete"],["id","mfa-delete"],["name","mfa-delete"],["type","checkbox"]],[[8,"checked",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),"change"===n&&(t=!1!==a.updateMfaDelete()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[11,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","mfa-delete"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Delete enabled"])),(l()(),e["ɵeld"](19,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](20,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](21,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables MFA (multi-factor authentication) Delete, which requires additional authentication for changing the bucket versioning state."])),(l()(),e["ɵand"](16777216,null,null,1,null,ea)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,aa)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"mfa-delete"),l(n,16,0,"mfa-delete"),l(n,24,0,u.areMfaCredentialsRequired()),l(n,26,0,u.areMfaCredentialsRequired())}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,u.isMfaDeleteEnabled,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function oa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,19,{FormControlNames:1}),e["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","lock_mode"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Mode"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","lock_mode"],["id","lock_mode"],["name","lock_mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](11,671744,[[19,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](15,0,null,null,3,"option",[["value","COMPLIANCE"]],null,null,null,null,null)),e["ɵdid"](16,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](17,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Compliance"])),(l()(),e["ɵeld"](19,0,null,null,3,"option",[["value","GOVERNANCE"]],null,null,null,null,null)),e["ɵdid"](20,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](21,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Governance"]))],(function(l,n){l(n,1,0),l(n,11,0,"lock_mode"),l(n,14,0,"lock_mode"),l(n,16,0,"COMPLIANCE"),l(n,17,0,"COMPLIANCE"),l(n,20,0,"GOVERNANCE"),l(n,21,0,"GOVERNANCE")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function sa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be a positive integer."]))],null,null)}function da(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Retention period requires either Days or Years."]))],null,null)}function ra(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,21,{FormControlNames:1}),e["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,5,"label",[["class","cd-col-form-label"],["for","lock_retention_period_days"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Days"])),(l()(),e["ɵeld"](7,0,null,null,2,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](8,49152,null,0,At.a,[],null,null),(l()(),e["ɵted"](-1,0,["The number of days that you want to specify for the default retention period that will be applied to new objects placed in this bucket."])),(l()(),e["ɵeld"](10,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"input",[["class","form-control"],["formControlName","lock_retention_period_days"],["id","lock_retention_period_days"],["min","0"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,14).onTouched()&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](14,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](16,671744,[[21,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](18,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](19,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,sa)),e["ɵdid"](21,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,da)),e["ɵdid"](23,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,16,0,"lock_retention_period_days"),l(n,19,0,"lock_retention_period_days"),l(n,21,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"pattern")),l(n,23,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"eitherDaysOrYears"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,18).ngClassUntouched,e["ɵnov"](n,18).ngClassTouched,e["ɵnov"](n,18).ngClassPristine,e["ɵnov"](n,18).ngClassDirty,e["ɵnov"](n,18).ngClassValid,e["ɵnov"](n,18).ngClassInvalid,e["ɵnov"](n,18).ngClassPending,e["ɵnov"](n,19).validClass,e["ɵnov"](n,19).invalidClass)}))}function ca(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be a positive integer."]))],null,null)}function ma(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Retention period requires either Days or Years."]))],null,null)}function fa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,23,{FormControlNames:1}),e["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,5,"label",[["class","cd-col-form-label"],["for","lock_retention_period_years"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Years"])),(l()(),e["ɵeld"](7,0,null,null,2,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](8,49152,null,0,At.a,[],null,null),(l()(),e["ɵted"](-1,0,["The number of years that you want to specify for the default retention period that will be applied to new objects placed in this bucket."])),(l()(),e["ɵeld"](10,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"input",[["class","form-control"],["formControlName","lock_retention_period_years"],["id","lock_retention_period_years"],["min","0"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,14).onTouched()&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](14,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](16,671744,[[23,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](18,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](19,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ca)),e["ɵdid"](21,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ma)),e["ɵdid"](23,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,16,0,"lock_retention_period_years"),l(n,19,0,"lock_retention_period_years"),l(n,21,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"pattern")),l(n,23,0,u.bucketForm.showError("lock_retention_period_years",e["ɵnov"](n.parent,3),"eitherDaysOrYears"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,18).ngClassUntouched,e["ɵnov"](n,18).ngClassTouched,e["ɵnov"](n,18).ngClassPristine,e["ɵnov"](n,18).ngClassDirty,e["ɵnov"](n,18).ngClassValid,e["ɵnov"](n,18).ngClassInvalid,e["ɵnov"](n,18).ngClassPending,e["ɵnov"](n,19).validClass,e["ɵnov"](n,19).invalidClass)}))}function ga(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,118,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,117,"form",[["name","bucketForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,3).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,3).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,6).onSubmit()&&t),t}),null,null)),e["ɵdid"](2,16384,null,0,o.G,[],null,null),e["ɵdid"](3,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](5,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](6,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](7,0,null,null,111,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,[""," ",""])),e["ɵppd"](10,1),e["ɵppd"](11,1),(l()(),e["ɵeld"](12,0,null,null,97,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Ut)),e["ɵdid"](14,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](15,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](16,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](19,0,null,0,4,"label",[["class","cd-col-form-label"],["for","bid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](21,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](22,{required:0}),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](24,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](25,0,null,null,8,"input",[["class","form-control"],["formControlName","bid"],["id","bid"],["name","bid"],["placeholder","Name..."],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,28)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,28).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,28)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,28)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](26,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](27,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](28,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](30,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](32,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](33,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Lt)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,zt)),e["ɵdid"](37,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Gt)),e["ɵdid"](39,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](40,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](41,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](44,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","owner"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Owner"])),(l()(),e["ɵeld"](46,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](47,0,null,null,14,"select",[["class","form-control custom-select"],["formControlName","owner"],["id","owner"],["name","owner"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,50).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,50).onTouched()&&t),t}),null,null)),e["ɵdid"](48,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](49,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](50,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](52,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](54,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](55,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Kt)),e["ɵdid"](57,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,$t)),e["ɵdid"](59,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Zt)),e["ɵdid"](61,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Qt)),e["ɵdid"](63,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](64,0,null,null,12,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](65,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](68,0,null,0,4,"label",[["class","cd-col-form-label"],["for","placement-target"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](70,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](71,{required:0}),(l()(),e["ɵted"](-1,null,["Placement target"])),(l()(),e["ɵeld"](73,0,null,0,3,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](0,[["placementTargetSelect",2]],null,0,null,Ht)),(l()(),e["ɵand"](16777216,null,null,1,null,la)),e["ɵdid"](76,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,na)),e["ɵdid"](78,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ia)),e["ɵdid"](80,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](81,0,null,null,28,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](82,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Locking"])),(l()(),e["ɵeld"](84,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](85,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,17,{FormControlNames:1}),e["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),e["ɵeld"](88,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](89,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](90,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","lock_enabled"],["id","lock_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,92).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,92).onTouched()&&t),t}),null,null)),e["ɵdid"](91,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](92,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](94,671744,[[17,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](96,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](97,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](98,0,null,null,1,"label",[["class","custom-control-label"],["for","lock_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](100,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](101,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](102,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket."])),(l()(),e["ɵand"](16777216,null,null,1,null,oa)),e["ɵdid"](105,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ra)),e["ɵdid"](107,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,fa)),e["ɵdid"](109,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](110,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](111,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](112,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](113,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](114,0,[""," ",""])),e["ɵppd"](115,1),e["ɵppd"](116,1),(l()(),e["ɵeld"](117,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](118,49152,null,0,Kn.a,[Dl.Location,t.b],null,null)],(function(l,n){var u=n.component;l(n,3,0,u.bucketForm),l(n,6,0,u.bucketForm),l(n,14,0,u.editing),l(n,16,0);var t=l(n,22,0,!u.editing);l(n,21,0,"cd-col-form-label",t),l(n,26,0,!u.editing),l(n,30,0,"bid"),l(n,33,0,"bid"),l(n,35,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"required")),l(n,37,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"bucketNameInvalid")),l(n,39,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"bucketNameExists")),l(n,41,0),l(n,48,0,u.editing),l(n,52,0,"owner"),l(n,55,0,"owner"),l(n,57,0,null===u.owners),l(n,59,0,null!==u.owners),l(n,61,0,u.owners),l(n,63,0,u.bucketForm.showError("owner",e["ɵnov"](n,3),"required")),l(n,65,0);var a=l(n,71,0,!u.editing);l(n,70,0,"cd-col-form-label",a),l(n,76,0,u.editing,e["ɵnov"](n,74)),l(n,78,0,u.editing),l(n,80,0,u.editing),l(n,85,0),l(n,94,0,"lock_enabled"),l(n,97,0,"lock_enabled"),l(n,105,0,u.bucketForm.getValue("lock_enabled")),l(n,107,0,u.bucketForm.getValue("lock_enabled")),l(n,109,0,u.bucketForm.getValue("lock_enabled")),l(n,113,0,u.bucketForm)}),(function(l,n){var u=n.component;l(n,1,0,e["ɵnov"](n,5).ngClassUntouched,e["ɵnov"](n,5).ngClassTouched,e["ɵnov"](n,5).ngClassPristine,e["ɵnov"](n,5).ngClassDirty,e["ɵnov"](n,5).ngClassValid,e["ɵnov"](n,5).ngClassInvalid,e["ɵnov"](n,5).ngClassPending);var t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,9,1,l(n,11,0,e["ɵnov"](n.parent,1),u.resource));l(n,9,0,t,a),l(n,15,0,e["ɵnov"](n,16).hasErrors,e["ɵnov"](n,16).hasSuccess),l(n,25,0,u.editing,e["ɵnov"](n,32).ngClassUntouched,e["ɵnov"](n,32).ngClassTouched,e["ɵnov"](n,32).ngClassPristine,e["ɵnov"](n,32).ngClassDirty,e["ɵnov"](n,32).ngClassValid,e["ɵnov"](n,32).ngClassInvalid,e["ɵnov"](n,32).ngClassPending,e["ɵnov"](n,33).validClass,e["ɵnov"](n,33).invalidClass),l(n,40,0,e["ɵnov"](n,41).hasErrors,e["ɵnov"](n,41).hasSuccess),l(n,47,0,e["ɵnov"](n,54).ngClassUntouched,e["ɵnov"](n,54).ngClassTouched,e["ɵnov"](n,54).ngClassPristine,e["ɵnov"](n,54).ngClassDirty,e["ɵnov"](n,54).ngClassValid,e["ɵnov"](n,54).ngClassInvalid,e["ɵnov"](n,54).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,64,0,e["ɵnov"](n,65).hasErrors,e["ɵnov"](n,65).hasSuccess),l(n,84,0,e["ɵnov"](n,85).hasErrors,e["ɵnov"](n,85).hasSuccess),l(n,90,0,e["ɵnov"](n,96).ngClassUntouched,e["ɵnov"](n,96).ngClassTouched,e["ɵnov"](n,96).ngClassPristine,e["ɵnov"](n,96).ngClassDirty,e["ɵnov"](n,96).ngClassValid,e["ɵnov"](n,96).ngClassInvalid,e["ɵnov"](n,96).ngClassPending,e["ɵnov"](n,97).validClass,e["ɵnov"](n,97).invalidClass);var i=e["ɵunv"](n,114,0,l(n,115,0,e["ɵnov"](n.parent,0),u.action)),o=e["ɵunv"](n,114,1,l(n,116,0,e["ɵnov"](n.parent,1),u.resource));l(n,114,0,i,o)}))}function pa(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵand"](16777216,null,null,1,null,Ot)),e["ɵdid"](3,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ga)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.editing&&u.loading&&!u.error),l(n,5,0,!u.loading&&!u.error)}),null)}function va(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-bucket-form",[],null,null,null,pa,Mt)),e["ɵdid"](1,114688,null,0,E,[ee.a,ee.m,_.a,p,v,b.a,y.a,El.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var ba=e["ɵccf"]("cd-rgw-bucket-form",E,va,{},{},[]),ha=u("i4WA"),Ca=u("6qls"),_a=u("tz6c"),Ra=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ya(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,8,"cd-alert-panel",[["type","info"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"]},null),(l()(),e["ɵted"](2,0,[" ",""])),(l()(),e["ɵeld"](3,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,0,4,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Please consult the "])),(l()(),e["ɵeld"](6,0,null,null,1,"cd-doc",[["section","rgw"]],null,null,null,ha.b,ha.a)),e["ɵdid"](7,114688,null,0,Ca.a,[_a.a,El.a],{section:[0,"section"]},null),(l()(),e["ɵted"](-1,null,[" on how to configure and enable the Object Gateway management functionality."]))],(function(l,n){l(n,1,0,"info"),l(n,7,0,"rgw")}),(function(l,n){l(n,2,0,n.component.message)}))}function ka(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-501",[],null,null,null,ya,Ra)),e["ɵdid"](1,245760,null,0,i,[ee.a],null,null)],(function(l,n){l(n,1,0)}),null)}var Ia=e["ɵccf"]("cd-rgw-501",i,ka,{},{},[]);u.d(n,"RgwModuleNgFactory",(function(){return Ea})),u.d(n,"RoutedRgwModuleNgFactory",(function(){return wa}));var Ea=e["ɵcmf"](ll,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[rl.a,cl.a,ml.a,fl.a,fl.b,gl.a,pl.a,vl.a,bl.a,hl.a,Cl.a,Ol,ln,Fn,Yn,fu,Iu,ju]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,Dl.NgLocalization,Dl.NgLocaleLocalization,[e.LOCALE_ID,[2,Dl["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,Bu.a,Bu.a,[]),e["ɵmpd"](4608,Pu.a,Pu.a,[]),e["ɵmpd"](4608,Ul.a,Ul.a,[El.a]),e["ɵmpd"](4608,Dl.DatePipe,Dl.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,Au.a,Au.a,[]),e["ɵmpd"](4608,L.a,L.a,[]),e["ɵmpd"](4608,S.a,S.a,[L.a]),e["ɵmpd"](4608,Mu.a,Mu.a,[L.a]),e["ɵmpd"](4608,D.a,D.a,[L.a]),e["ɵmpd"](4608,Ou.a,Ou.a,[]),e["ɵmpd"](4608,Uu.a,Uu.a,[]),e["ɵmpd"](4608,Lu.a,Lu.a,[]),e["ɵmpd"](4608,zu.a,zu.a,[]),e["ɵmpd"](4608,Tl.a,Tl.a,[Dl.DatePipe]),e["ɵmpd"](4608,Gu.a,Gu.a,[]),e["ɵmpd"](4608,Ku.a,Ku.a,[]),e["ɵmpd"](4608,$u.a,$u.a,[]),e["ɵmpd"](4608,Zu.a,Zu.a,[]),e["ɵmpd"](4608,Qu.a,Qu.a,[]),e["ɵmpd"](4608,Yu.a,Yu.a,[El.a]),e["ɵmpd"](4608,jn.a,jn.a,[]),e["ɵmpd"](4608,an.a,an.a,[]),e["ɵmpd"](4608,Wu.a,Wu.a,[]),e["ɵmpd"](4608,o.D,o.D,[]),e["ɵmpd"](4608,o.h,o.h,[]),e["ɵmpd"](4608,Ju.b,Ju.b,[]),e["ɵmpd"](4608,Xu.a,Xu.a,[]),e["ɵmpd"](4608,Hu.a,Hu.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,en.a,en.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,Hu.a,e.ApplicationRef]),e["ɵmpd"](4608,le.c,le.c,[]),e["ɵmpd"](4608,ne.a,ne.a,[]),e["ɵmpd"](4608,sn.b,sn.b,[e.RendererFactory2,en.a]),e["ɵmpd"](4608,ue.y,ue.y,[Dl.DOCUMENT]),e["ɵmpd"](4608,ue.r,ue.r,[]),e["ɵmpd"](4608,ue.a,ue.a,[]),e["ɵmpd"](4608,un.f,un.f,[]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,a.a,a.a,[ee.m,F.a]),e["ɵmpd"](4608,_l.f,_l.f,[]),e["ɵmpd"](1073742336,Dl.CommonModule,Dl.CommonModule,[]),e["ɵmpd"](1073742336,te.a,te.a,[]),e["ɵmpd"](1073742336,o.C,o.C,[]),e["ɵmpd"](1073742336,o.n,o.n,[]),e["ɵmpd"](1073742336,o.y,o.y,[]),e["ɵmpd"](1073742336,Ju.c,Ju.c,[]),e["ɵmpd"](1073742336,Xu.d,Xu.d,[]),e["ɵmpd"](1073742336,le.d,le.d,[]),e["ɵmpd"](1073742336,ne.d,ne.d,[]),e["ɵmpd"](1073742336,ae.b,ae.b,[]),e["ɵmpd"](1073742336,sn.e,sn.e,[]),e["ɵmpd"](1073742336,ie.a,ie.a,[]),e["ɵmpd"](1073742336,un.e,un.e,[]),e["ɵmpd"](1073742336,An.f,An.f,[]),e["ɵmpd"](1073742336,oe.ClickOutsideModule,oe.ClickOutsideModule,[]),e["ɵmpd"](1073742336,se.b,se.b,[]),e["ɵmpd"](1073742336,ee.q,ee.q,[[2,ee.v],[2,ee.m]]),e["ɵmpd"](1073742336,de.a,de.a,[]),e["ɵmpd"](1073742336,ue.u,ue.u,[]),e["ɵmpd"](1073742336,re.a,re.a,[]),e["ɵmpd"](1073742336,g.a,g.a,[]),e["ɵmpd"](1073742336,ce.a,ce.a,[]),e["ɵmpd"](1073742336,me.a,me.a,[]),e["ɵmpd"](1073742336,_l.d,_l.d,[]),e["ɵmpd"](1073742336,ll,ll,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,un.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])})),wa=e["ɵcmf"](dl,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[rl.a,cl.a,ml.a,fl.a,fl.b,gl.a,pl.a,vl.a,bl.a,hl.a,Cl.a,Ol,ln,Fn,Yn,fu,Iu,ju,he,qe,kt,Bt,ba,Ia]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,Dl.NgLocalization,Dl.NgLocaleLocalization,[e.LOCALE_ID,[2,Dl["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,Bu.a,Bu.a,[]),e["ɵmpd"](4608,Pu.a,Pu.a,[]),e["ɵmpd"](4608,Ul.a,Ul.a,[El.a]),e["ɵmpd"](4608,Dl.DatePipe,Dl.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,Au.a,Au.a,[]),e["ɵmpd"](4608,L.a,L.a,[]),e["ɵmpd"](4608,S.a,S.a,[L.a]),e["ɵmpd"](4608,Mu.a,Mu.a,[L.a]),e["ɵmpd"](4608,D.a,D.a,[L.a]),e["ɵmpd"](4608,Ou.a,Ou.a,[]),e["ɵmpd"](4608,Uu.a,Uu.a,[]),e["ɵmpd"](4608,Lu.a,Lu.a,[]),e["ɵmpd"](4608,zu.a,zu.a,[]),e["ɵmpd"](4608,Tl.a,Tl.a,[Dl.DatePipe]),e["ɵmpd"](4608,Gu.a,Gu.a,[]),e["ɵmpd"](4608,Ku.a,Ku.a,[]),e["ɵmpd"](4608,$u.a,$u.a,[]),e["ɵmpd"](4608,Zu.a,Zu.a,[]),e["ɵmpd"](4608,Qu.a,Qu.a,[]),e["ɵmpd"](4608,Yu.a,Yu.a,[El.a]),e["ɵmpd"](4608,jn.a,jn.a,[]),e["ɵmpd"](4608,an.a,an.a,[]),e["ɵmpd"](4608,Wu.a,Wu.a,[]),e["ɵmpd"](4608,o.D,o.D,[]),e["ɵmpd"](4608,o.h,o.h,[]),e["ɵmpd"](4608,Ju.b,Ju.b,[]),e["ɵmpd"](4608,Xu.a,Xu.a,[]),e["ɵmpd"](4608,Hu.a,Hu.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,en.a,en.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,Hu.a,e.ApplicationRef]),e["ɵmpd"](4608,le.c,le.c,[]),e["ɵmpd"](4608,ne.a,ne.a,[]),e["ɵmpd"](4608,sn.b,sn.b,[e.RendererFactory2,en.a]),e["ɵmpd"](4608,ue.y,ue.y,[Dl.DOCUMENT]),e["ɵmpd"](4608,ue.r,ue.r,[]),e["ɵmpd"](4608,ue.a,ue.a,[]),e["ɵmpd"](4608,un.f,un.f,[]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,a.a,a.a,[ee.m,F.a]),e["ɵmpd"](4608,_l.f,_l.f,[]),e["ɵmpd"](1073742336,Dl.CommonModule,Dl.CommonModule,[]),e["ɵmpd"](1073742336,te.a,te.a,[]),e["ɵmpd"](1073742336,o.C,o.C,[]),e["ɵmpd"](1073742336,o.n,o.n,[]),e["ɵmpd"](1073742336,o.y,o.y,[]),e["ɵmpd"](1073742336,Ju.c,Ju.c,[]),e["ɵmpd"](1073742336,Xu.d,Xu.d,[]),e["ɵmpd"](1073742336,le.d,le.d,[]),e["ɵmpd"](1073742336,ne.d,ne.d,[]),e["ɵmpd"](1073742336,ae.b,ae.b,[]),e["ɵmpd"](1073742336,sn.e,sn.e,[]),e["ɵmpd"](1073742336,ie.a,ie.a,[]),e["ɵmpd"](1073742336,un.e,un.e,[]),e["ɵmpd"](1073742336,An.f,An.f,[]),e["ɵmpd"](1073742336,oe.ClickOutsideModule,oe.ClickOutsideModule,[]),e["ɵmpd"](1073742336,se.b,se.b,[]),e["ɵmpd"](1073742336,ee.q,ee.q,[[2,ee.v],[2,ee.m]]),e["ɵmpd"](1073742336,de.a,de.a,[]),e["ɵmpd"](1073742336,ue.u,ue.u,[]),e["ɵmpd"](1073742336,re.a,re.a,[]),e["ɵmpd"](1073742336,g.a,g.a,[]),e["ɵmpd"](1073742336,ce.a,ce.a,[]),e["ɵmpd"](1073742336,me.a,me.a,[]),e["ɵmpd"](1073742336,_l.d,_l.d,[]),e["ɵmpd"](1073742336,ll,ll,[]),e["ɵmpd"](1073742336,dl,dl,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,un.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](1024,ee.k,(function(){return[[{path:"",redirectTo:"daemon",pathMatch:"full"},{path:"daemon",component:O,data:nl},{path:"user",data:ul,children:[{path:"",component:H},{path:"create",component:W,data:el},{path:"edit/:uid",component:W,data:tl}]},{path:"bucket",data:al,children:[{path:"",component:P},{path:"create",component:E,data:il},{path:"edit/:bid",component:E,data:ol}]},{path:"501/:message",component:i,canActivate:[a.a],data:sl}]]}),[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/7.7ae591a28c2c89c12020.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/7.7ae591a28c2c89c12020.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/7.7ae591a28c2c89c12020.js 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/7.7ae591a28c2c89c12020.js 2021-04-19 13:53:42.000000000 +0000 @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{Znkk:function(l,n,u){"use strict";u.r(n);var e=u("8Y7J"),t=u("sne2"),a=u("Avrn");class i{constructor(l){this.route=l,this.message="The Object Gateway service is not configured."}ngOnInit(){this.routeParamsSubscribe=this.route.params.subscribe(l=>{this.message=l.message})}ngOnDestroy(){this.routeParamsSubscribe.unsubscribe()}}var o=u("s7LF"),s=u("LvDl"),d=u("mrSG"),r=u("IheW"),c=u("LRne"),m=u("5+tZ"),f=u("xTzq"),g=u("pL04");let p=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/bucket"}list(){let l=new r.h;return l=l.append("stats","true"),this.http.get(this.url,{params:l})}enumerate(){return this.http.get(this.url)}get(l){return this.http.get(`${this.url}/${l}`)}create(l,n,u,e,t,a,i,o){return this.http.post(this.url,null,{params:new r.h({fromObject:{bucket:l,uid:n,zonegroup:u,placement_target:e,lock_enabled:String(t),lock_mode:a,lock_retention_period_days:i,lock_retention_period_years:o}})})}update(l,n,u,e,t,a,i,o,s,d){let c=new r.h;return c=c.append("bucket_id",n),c=c.append("uid",u),c=c.append("versioning_state",e),c=c.append("mfa_delete",t),c=c.append("mfa_token_serial",a),c=c.append("mfa_token_pin",i),c=c.append("lock_mode",o),c=c.append("lock_retention_period_days",s),c=c.append("lock_retention_period_years",d),this.http.put(`${this.url}/${l}`,null,{params:c})}delete(l,n=!0){let u=new r.h;return u=u.append("purge_objects",n?"true":"false"),this.http.delete(`${this.url}/${l}`,{params:u})}exists(l){return this.enumerate().pipe(Object(m.a)(n=>{const u=s.indexOf(n,l);return Object(c.a)(-1!==u)}))}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})(),v=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/site"}get(l){let n=new r.h;return l&&(n=n.append("query",l)),this.http.get(this.url,{params:n})}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})();var b=u("P8lu"),h=u("oxzT"),C=u("mtw6"),_=u("2EZI"),R=u("1Ni5"),y=u("9nlD"),k=function(l){return l.ENABLED="Enabled",l.DISABLED="Disabled",l}({}),I=function(l){return l.ENABLED="Enabled",l.SUSPENDED="Suspended",l}({});class E{constructor(l,n,u,e,a,i,o,s,d){this.route=l,this.router=n,this.formBuilder=u,this.rgwBucketService=e,this.rgwSiteService=a,this.rgwUserService=i,this.notificationService=o,this.i18n=s,this.actionLabels=d,this.editing=!1,this.error=!1,this.loading=!1,this.owners=null,this.placementTargets=[],this.isVersioningEnabled=!1,this.isVersioningAlreadyEnabled=!1,this.isMfaDeleteEnabled=!1,this.isMfaDeleteAlreadyEnabled=!1,this.icons=h.a,this.editing=this.router.url.startsWith("/rgw/bucket/"+t.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.resource=this.i18n("bucket"),this.createForm()}createForm(){const l=this,n=R.a.custom("eitherDaysOrYears",()=>{if(!l.bucketForm||!s.get(l.bucketForm.getRawValue(),"lock_enabled"))return!1;const n=l.bucketForm.getValue("lock_retention_period_years"),u=l.bucketForm.getValue("lock_retention_period_days");return u>0&&n>0||0===u&&0===n}),u=[0,[R.a.number(!1),n]];this.bucketForm=this.formBuilder.group({id:[null],bid:[null,[o.B.required],this.editing?[]:[this.bucketNameValidator()]],owner:[null,[o.B.required]],"placement-target":[null,this.editing?[]:[o.B.required]],versioning:[null],"mfa-delete":[null],"mfa-token-serial":[""],"mfa-token-pin":[""],lock_enabled:[{value:!1,disabled:this.editing}],lock_mode:["COMPLIANCE"],lock_retention_period_days:u,lock_retention_period_years:u})}ngOnInit(){this.rgwUserService.enumerate().subscribe(l=>{this.owners=l.sort()}),this.editing||this.rgwSiteService.get("placement-targets").subscribe(l=>{this.zonegroup=l.zonegroup,s.forEach(l.placement_targets,l=>{l.description=`${l.name} (${this.i18n("pool")}: ${l.data_pool})`,this.placementTargets.push(l)}),1===this.placementTargets.length&&this.bucketForm.get("placement-target").setValue(this.placementTargets[0].name)}),this.route.params.subscribe(l=>{if(!l.hasOwnProperty("bid"))return;const n=decodeURIComponent(l.bid);this.loading=!0,this.rgwBucketService.get(n).subscribe(l=>{this.loading=!1;const n=s.clone(this.bucketForm.getRawValue());let u=s.pick(l,s.keys(n));u["placement-target"]=l.placement_rule,u=s.merge(n,u),this.bucketForm.setValue(u),this.editing&&(this.setVersioningStatus(l.versioning),this.isVersioningAlreadyEnabled=this.isVersioningEnabled,this.setMfaDeleteStatus(l.mfa_delete),this.isMfaDeleteAlreadyEnabled=this.isMfaDeleteEnabled,this.setMfaDeleteValidators())})})}goToListView(){this.router.navigate(["/rgw/bucket"])}submit(){if(this.bucketForm.pristine)return void this.goToListView();const l=this.bucketForm.value;if(this.editing){const n=this.getVersioningStatus(),u=this.getMfaDeleteStatus();this.rgwBucketService.update(l.bid,l.id,l.owner,n,u,l["mfa-token-serial"],l["mfa-token-pin"],l.lock_mode,l.lock_retention_period_days,l.lock_retention_period_years).subscribe(()=>{this.notificationService.show(C.a.success,this.i18n('Updated Object Gateway bucket "{{bid}}".',l)),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}else this.rgwBucketService.create(l.bid,l.owner,this.zonegroup,l["placement-target"],l.lock_enabled,l.lock_mode,l.lock_retention_period_days,l.lock_retention_period_years).subscribe(()=>{this.notificationService.show(C.a.success,this.i18n('Created Object Gateway bucket "{{bid}}"',l)),this.goToListView()},()=>{this.bucketForm.setErrors({cdSubmitButton:!0})})}bucketNameValidator(){const l=this.rgwBucketService;return n=>new Promise(u=>{if(n.pristine||""===n.value)return void u(null);const e=[];e.push(l=>!R.a.ip()(l)),e.push(l=>s.inRange(l.length,3,64)),e.push(l=>{const n=s.split(l,".");return s.every(n,l=>l===s.toLower(l)&&!l.includes("_")&&!!/[0-9a-z-]/.test(l)&&s.every([0,l.length],n=>/[a-z]/.test(l[n])||s.isInteger(s.parseInt(l[n]))))}),s.every(e,l=>l(n.value))?l.exists(n.value).subscribe(l=>{u(l?{bucketNameExists:!0}:null)}):u({bucketNameInvalid:!0})})}areMfaCredentialsRequired(){return this.isMfaDeleteEnabled!==this.isMfaDeleteAlreadyEnabled||this.isMfaDeleteAlreadyEnabled&&this.isVersioningEnabled!==this.isVersioningAlreadyEnabled}setMfaDeleteValidators(){const l=this.bucketForm.get("mfa-token-serial"),n=this.bucketForm.get("mfa-token-pin");this.areMfaCredentialsRequired()?(l.setValidators(o.B.required),n.setValidators(o.B.required)):(l.setValidators(null),n.setValidators(null)),l.updateValueAndValidity(),n.updateValueAndValidity()}getVersioningStatus(){return this.isVersioningEnabled?I.ENABLED:I.SUSPENDED}setVersioningStatus(l){this.isVersioningEnabled=l===I.ENABLED}updateVersioning(){this.isVersioningEnabled=!this.isVersioningEnabled,this.setMfaDeleteValidators()}getMfaDeleteStatus(){return this.isMfaDeleteEnabled?k.ENABLED:k.DISABLED}setMfaDeleteStatus(l){this.isMfaDeleteEnabled=l===k.ENABLED}updateMfaDelete(){this.isMfaDeleteEnabled=!this.isMfaDeleteEnabled,this.setMfaDeleteValidators()}}var w=u("HDdC"),q=u("cp0P"),N=u("+fVR"),T=u("0+/T"),x=u("uIqm"),V=u("vCyI"),S=u("Fgil"),D=u("o4+5"),F=u("aexS"),j=u("EgGo");const B=new j.a("rgw/bucket");class P extends N.a{constructor(l,n,u,e,t,a,i,o,s,d){super(),this.authStorageService=l,this.dimlessBinaryPipe=n,this.dimlessPipe=u,this.rgwBucketService=e,this.bsModalService=t,this.i18n=a,this.urlBuilder=i,this.actionLabels=o,this.ngZone=s,this.changeDetectorRef=d,this.columns=[],this.buckets=[],this.selection=new V.a,this.isStale=!1,this.permission=this.authStorageService.getPermissions().rgw;const r=()=>this.selection.first()&&""+encodeURIComponent(this.selection.first().bid);this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:l=>!l.hasSelection},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(r()),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:l=>l.hasMultiSelection}],this.timeConditionReached()}ngOnInit(){this.columns=[{name:this.i18n("Name"),prop:"bid",flexGrow:2},{name:this.i18n("Owner"),prop:"owner",flexGrow:3},{name:this.i18n("Used Capacity"),prop:"bucket_size",flexGrow:.5,pipe:this.dimlessBinaryPipe},{name:this.i18n("Capacity Limit %"),prop:"size_usage",cellTemplate:this.bucketSizeTpl,flexGrow:1},{name:this.i18n("Objects"),prop:"num_objects",flexGrow:.5,pipe:this.dimlessPipe},{name:this.i18n("Object Limit %"),prop:"object_usage",cellTemplate:this.bucketObjectTpl,flexGrow:1}]}transformBucketData(){s.forEach(this.buckets,l=>{const n=l.bucket_quota.max_size,u=l.bucket_quota.max_objects;let e=0,t=0;s.forEach(l.usage,l=>{e+=l.size_actual,t+=l.num_objects}),l.bucket_size=e,l.num_objects=t,l.size_usage=n>0?e/n:void 0,l.object_usage=u>0?t/u:void 0})}timeConditionReached(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.isStale=!0})},1e4)})}getBucketList(l){this.isStale=!1,this.timeConditionReached(),this.rgwBucketService.list().subscribe(l=>{this.buckets=l,this.transformBucketData(),this.changeDetectorRef.detectChanges()},()=>{l.error()})}updateSelection(l){this.selection=l}deleteAction(){this.bsModalService.show(T.a,{initialState:{itemDescription:this.i18n(this.selection.hasSingleSelection?"bucket":"buckets"),itemNames:this.selection.selected.map(l=>l.bid),submitActionObservable:()=>new w.a(l=>{Object(q.a)(this.selection.selected.map(l=>this.rgwBucketService.delete(l.bid))).subscribe(null,n=>{l.error(n),this.table.refreshBtn()},()=>{l.complete(),this.table.refreshBtn()})})}})}}let A=(()=>{let l=class{constructor(l){this.http=l,this.url="api/rgw/daemon"}list(){return this.http.get(this.url)}get(l){return this.http.get(`${this.url}/${l}`)}};return l.ngInjectableDef=e["ɵɵdefineInjectable"]({factory:function(){return new l(e["ɵɵinject"](r.c))},token:l,providedIn:g.a}),l=d.__decorate([f.a,d.__metadata("design:paramtypes",[r.c])],l),l})();var M=u("85J/");class O extends N.a{constructor(l,n,u,e,t){super(),this.rgwDaemonService=l,this.authStorageService=n,this.cephShortVersionPipe=u,this.i18n=e,this.rgwSiteService=t,this.columns=[],this.daemons=[]}ngOnInit(){this.grafanaPermission=this.authStorageService.getPermissions().grafana,this.columns=[{name:this.i18n("ID"),prop:"id",flexGrow:2},{name:this.i18n("Hostname"),prop:"server_hostname",flexGrow:2},{name:this.i18n("Version"),prop:"version",flexGrow:1,pipe:this.cephShortVersionPipe}],this.rgwSiteService.get("realms").subscribe(l=>this.isMultiSite=l.length>0)}getDaemonList(l){this.rgwDaemonService.list().subscribe(l=>{this.daemons=l},()=>{l.error()})}}var U=u("GyhO"),L=u("aXbf"),z=function(l){return l.USERS="users",l.BUCKETS="buckets",l.METADATA="metadata",l.USAGE="usage",l.ZONE="zone",l}({});let G=(()=>{class l{static getAll(){return Object.values(l.capabilities)}}return l.capabilities=z,l})();class K{constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.editing=!0,this.types=[],this.resource=this.i18n("capability"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({type:[null,[o.B.required]],perm:[null,[o.B.required]]})}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.ADD}setValues(l,n){this.formGroup.setValue({type:l,perm:n})}setCapabilities(l){const n=[];l.forEach(l=>{n.push(l.type)}),this.types=[],G.getAll().forEach(l=>{-1===s.indexOf(n,l)&&this.types.push(l)})}onSubmit(){this.submitAction.emit(this.formGroup.value),this.bsModalRef.hide()}}class ${constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.viewing=!0,this.userCandidates=[],this.resource=this.i18n("S3 Key"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({user:[null,[o.B.required]],generate_key:[!0],access_key:[null,[R.a.requiredIf({generate_key:!1})]],secret_key:[null,[R.a.requiredIf({generate_key:!1})]]})}setViewing(l=!0){this.viewing=l,this.action=this.viewing?this.actionLabels.SHOW:this.actionLabels.CREATE}setValues(l,n,u){this.formGroup.setValue({user:l,generate_key:s.isEmpty(n),access_key:n,secret_key:u})}setUserCandidates(l){this.userCandidates=l}onSubmit(){this.submitAction.emit(this.formGroup.value),this.bsModalRef.hide()}}class Z{}class Q{constructor(l,n,u,t){this.formBuilder=l,this.bsModalRef=n,this.i18n=u,this.actionLabels=t,this.submitAction=new e.EventEmitter,this.editing=!0,this.subusers=[],this.resource=this.i18n("Subuser"),this.createForm()}createForm(){this.formGroup=this.formBuilder.group({uid:[null],subuid:[null,[o.B.required,this.subuserValidator()]],perm:[null,[o.B.required]],generate_secret:[!0],secret_key:[null,[R.a.requiredIf({generate_secret:!1})]]})}subuserValidator(){const l=this;return n=>l.editing||Object(R.b)(n.value)?null:l.subusers.some(u=>s.isEqual(l.getSubuserName(u.id),n.value))?{subuserIdExists:!0}:null}getSubuserName(l){if(s.isEmpty(l))return l;const n=l.match(/([^:]+)(:(.+))?/);return s.isUndefined(n[3])?n[1]:n[3]}setEditing(l=!0){this.editing=l,this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE}setValues(l,n="",u=""){this.formGroup.setValue({uid:l,subuid:this.getSubuserName(n),perm:u,generate_secret:!0,secret_key:null})}setSubusers(l){this.subusers=l}onSubmit(){const l=this.formGroup.value,n=new Z;n.id=`${l.uid}:${l.subuid}`,n.permissions=l.perm,n.generate_secret=l.generate_secret,n.secret_key=l.secret_key,this.submitAction.emit(n),this.bsModalRef.hide()}}class Y{constructor(l,n,u){this.bsModalRef=l,this.i18n=n,this.actionLabels=u,this.resource=this.i18n("Swift Key"),this.action=this.actionLabels.SHOW}setValues(l,n){this.user=l,this.secret_key=n}}class W{constructor(l,n,u,e,a,i,o,s){this.formBuilder=l,this.route=n,this.router=u,this.rgwUserService=e,this.bsModalService=a,this.notificationService=i,this.i18n=o,this.actionLabels=s,this.editing=!1,this.error=!1,this.loading=!1,this.submitObservables=[],this.icons=h.a,this.subusers=[],this.s3Keys=[],this.swiftKeys=[],this.capabilities=[],this.resource=this.i18n("user"),this.subuserLabel=this.i18n("subuser"),this.s3keyLabel=this.i18n("S3 Key"),this.capabilityLabel=this.i18n("capability"),this.editing=this.router.url.startsWith("/rgw/user/"+t.e.EDIT),this.action=this.editing?this.actionLabels.EDIT:this.actionLabels.CREATE,this.createForm()}createForm(){this.userForm=this.formBuilder.group({uid:[null,[o.B.required],this.editing?[]:[R.a.unique(this.rgwUserService.exists,this.rgwUserService)]],display_name:[null,[o.B.required]],email:[null,[R.a.email],[R.a.unique(this.rgwUserService.emailExists,this.rgwUserService)]],max_buckets_mode:[1],max_buckets:[1e3,[R.a.requiredIf({max_buckets_mode:"1"}),R.a.number(!1),o.B.min(1)]],suspended:[!1],generate_key:[!0],access_key:[null,[R.a.requiredIf({generate_key:!1})]],secret_key:[null,[R.a.requiredIf({generate_key:!1})]],user_quota_enabled:[!1],user_quota_max_size_unlimited:[!0],user_quota_max_size:[null,[R.a.composeIf({user_quota_enabled:!0,user_quota_max_size_unlimited:!1},[o.B.required,this.quotaMaxSizeValidator])]],user_quota_max_objects_unlimited:[!0],user_quota_max_objects:[null,[o.B.min(0),R.a.requiredIf({user_quota_enabled:!0,user_quota_max_objects_unlimited:!1})]],bucket_quota_enabled:[!1],bucket_quota_max_size_unlimited:[!0],bucket_quota_max_size:[null,[R.a.composeIf({bucket_quota_enabled:!0,bucket_quota_max_size_unlimited:!1},[o.B.required,this.quotaMaxSizeValidator])]],bucket_quota_max_objects_unlimited:[!0],bucket_quota_max_objects:[null,[o.B.min(0),R.a.requiredIf({bucket_quota_enabled:!0,bucket_quota_max_objects_unlimited:!1})]]})}ngOnInit(){this.route.params.subscribe(l=>{if(!l.hasOwnProperty("uid"))return;const n=decodeURIComponent(l.uid);this.loading=!0;const u=[];u.push(this.rgwUserService.get(n)),u.push(this.rgwUserService.getQuota(n)),Object(q.a)(u).subscribe(l=>{this.loading=!1;const n=s.clone(this.userForm.value);let u=s.pick(l[0],s.keys(this.userForm.value));switch(u.max_buckets){case-1:u.max_buckets_mode=-1,u.max_buckets="";break;case 0:u.max_buckets_mode=0,u.max_buckets="";break;default:u.max_buckets_mode=1}["user","bucket"].forEach(n=>{const e=l[1][n+"_quota"];u[n+"_quota_enabled"]=e.enabled,e.max_size<0?(u[n+"_quota_max_size_unlimited"]=!0,u[n+"_quota_max_size"]=null):(u[n+"_quota_max_size_unlimited"]=!1,u[n+"_quota_max_size"]=e.max_size+" B"),e.max_objects<0?(u[n+"_quota_max_objects_unlimited"]=!0,u[n+"_quota_max_objects"]=null):(u[n+"_quota_max_objects_unlimited"]=!1,u[n+"_quota_max_objects"]=e.max_objects)}),u=s.merge(n,u),this.userForm.setValue(u),this.subusers=l[0].subusers,this.s3Keys=l[0].keys,this.swiftKeys=l[0].swift_keys;const e={"read, write":"*"};l[0].caps.forEach(l=>{l.perm in e&&(l.perm=e[l.perm])}),this.capabilities=l[0].caps},l=>{this.error=l})})}goToListView(){this.router.navigate(["/rgw/user"])}onSubmit(){let l;if(this.userForm.pristine)return void this.goToListView();const n=this.userForm.getValue("uid");if(this.editing){if(this._isGeneralDirty()){const l=this._getUpdateArgs();this.submitObservables.push(this.rgwUserService.update(n,l))}l=this.i18n('Updated Object Gateway user "{{uid}}"',{uid:n})}else{const u=this._getCreateArgs();this.submitObservables.push(this.rgwUserService.create(u)),l=this.i18n('Created Object Gateway user "{{uid}}"',{uid:n})}if(this._isUserQuotaDirty()){const l=this._getUserQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,l))}if(this._isBucketQuotaDirty()){const l=this._getBucketQuotaArgs();this.submitObservables.push(this.rgwUserService.updateQuota(n,l))}Object(U.a)(...this.submitObservables).subscribe({error:()=>{this.userForm.setErrors({cdSubmitButton:!0})},complete:()=>{this.notificationService.show(C.a.success,l),this.goToListView()}})}quotaMaxSizeValidator(l){return Object(R.b)(l.value)?null:null===RegExp("^(\\d+(\\.\\d+)?)\\s*(B|K(B|iB)?|M(B|iB)?|G(B|iB)?|T(B|iB)?)?$","i").exec(l.value)||(new L.a).toBytes(l.value)<1024?{quotaMaxSize:!0}:null}setSubuser(l,n){const u={"full-control":"full","read-write":"readwrite"},e=this.userForm.getValue("uid");this.submitObservables.push(this.rgwUserService.createSubuser(e,{subuser:l.id,access:l.permissions in u?u[l.permissions]:l.permissions,key_type:"swift",secret_key:l.secret_key,generate_secret:l.generate_secret?"true":"false"})),s.isNumber(n)?this.subusers[n]=l:(this.subusers.push(l),this.swiftKeys.push({user:l.id,secret_key:l.generate_secret?"Apply your changes first...":l.secret_key})),this.userForm.markAsDirty()}deleteSubuser(l){const n=this.subusers[l];this.submitObservables.push(this.rgwUserService.deleteSubuser(this.userForm.getValue("uid"),n.id)),this.s3Keys=this.s3Keys.filter(l=>l.user!==n.id),this.swiftKeys=this.swiftKeys.filter(l=>l.user!==n.id),this.subusers.splice(l,1),this.userForm.markAsDirty()}setCapability(l,n){const u=this.userForm.getValue("uid");if(s.isNumber(n)){const e=this.capabilities[n];this.submitObservables.push(this.rgwUserService.deleteCapability(u,e.type,e.perm)),this.submitObservables.push(this.rgwUserService.addCapability(u,l.type,l.perm)),this.capabilities[n]=l}else this.submitObservables.push(this.rgwUserService.addCapability(u,l.type,l.perm)),this.capabilities.push(l);this.userForm.markAsDirty()}deleteCapability(l){const n=this.capabilities[l];this.submitObservables.push(this.rgwUserService.deleteCapability(this.userForm.getValue("uid"),n.type,n.perm)),this.capabilities.splice(l,1),this.userForm.markAsDirty()}hasAllCapabilities(){return!s.difference(G.getAll(),s.map(this.capabilities,"type")).length}setS3Key(l,n){if(s.isNumber(n));else{const n=l.user.match(/([^:]+)(:(.+))?/),u=n[1],e={subuser:n[2]?n[3]:"",generate_key:l.generate_key?"true":"false"};"false"===e.generate_key&&(s.isNil(l.access_key)||(e.access_key=l.access_key),s.isNil(l.secret_key)||(e.secret_key=l.secret_key)),this.submitObservables.push(this.rgwUserService.addS3Key(u,e)),this.s3Keys.push({user:l.user,access_key:l.generate_key?"Apply your changes first...":l.access_key,secret_key:l.generate_key?"Apply your changes first...":l.secret_key})}this.userForm.markAsDirty()}deleteS3Key(l){const n=this.s3Keys[l];this.submitObservables.push(this.rgwUserService.deleteS3Key(this.userForm.getValue("uid"),n.access_key)),this.s3Keys.splice(l,1),this.userForm.markAsDirty()}showSubuserModal(l){const n=this.userForm.getValue("uid"),u=this.bsModalService.show(Q);if(s.isNumber(l)){const e=this.subusers[l];u.content.setEditing(),u.content.setValues(n,e.id,e.permissions)}else u.content.setEditing(!1),u.content.setValues(n),u.content.setSubusers(this.subusers);u.content.submitAction.subscribe(n=>{this.setSubuser(n,l)})}showS3KeyModal(l){const n=this.bsModalService.show($);if(s.isNumber(l)){const u=this.s3Keys[l];n.content.setViewing(),n.content.setValues(u.user,u.access_key,u.secret_key)}else{const l=this._getS3KeyUserCandidates();n.content.setViewing(!1),n.content.setUserCandidates(l),n.content.submitAction.subscribe(l=>{this.setS3Key(l)})}}showSwiftKeyModal(l){const n=this.bsModalService.show(Y),u=this.swiftKeys[l];n.content.setValues(u.user,u.secret_key)}showCapabilityModal(l){const n=this.bsModalService.show(K);if(s.isNumber(l)){const u=this.capabilities[l];n.content.setEditing(),n.content.setValues(u.type,u.perm)}else n.content.setEditing(!1),n.content.setCapabilities(this.capabilities);n.content.submitAction.subscribe(n=>{this.setCapability(n,l)})}_isGeneralDirty(){return["display_name","email","max_buckets_mode","max_buckets","suspended"].some(l=>this.userForm.get(l).dirty)}_isUserQuotaDirty(){return["user_quota_enabled","user_quota_max_size_unlimited","user_quota_max_size","user_quota_max_objects_unlimited","user_quota_max_objects"].some(l=>this.userForm.get(l).dirty)}_isBucketQuotaDirty(){return["bucket_quota_enabled","bucket_quota_max_size_unlimited","bucket_quota_max_size","bucket_quota_max_objects_unlimited","bucket_quota_max_objects"].some(l=>this.userForm.get(l).dirty)}_getCreateArgs(){const l={uid:this.userForm.getValue("uid"),display_name:this.userForm.getValue("display_name"),suspended:this.userForm.getValue("suspended"),email:"",max_buckets:this.userForm.getValue("max_buckets"),generate_key:this.userForm.getValue("generate_key"),access_key:"",secret_key:""},n=this.userForm.getValue("email");s.isString(n)&&n.length>0&&s.merge(l,{email:n}),this.userForm.getValue("generate_key")||s.merge(l,{generate_key:!1,access_key:this.userForm.getValue("access_key"),secret_key:this.userForm.getValue("secret_key")});const u=parseInt(this.userForm.getValue("max_buckets_mode"),10);return s.includes([-1,0],u)&&s.merge(l,{max_buckets:u}),l}_getUpdateArgs(){const l={},n=["display_name","email","max_buckets","suspended"];for(const e of n)l[e]=this.userForm.getValue(e);const u=parseInt(this.userForm.getValue("max_buckets_mode"),10);return s.includes([-1,0],u)&&(l.max_buckets=u),l}_getUserQuotaArgs(){const l={quota_type:"user",enabled:this.userForm.getValue("user_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("user_quota_max_size_unlimited")){const n=(new L.a).toBytes(this.userForm.getValue("user_quota_max_size"));l.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("user_quota_max_objects_unlimited")||(l.max_objects=this.userForm.getValue("user_quota_max_objects")),l}_getBucketQuotaArgs(){const l={quota_type:"bucket",enabled:this.userForm.getValue("bucket_quota_enabled"),max_size_kb:-1,max_objects:-1};if(!this.userForm.getValue("bucket_quota_max_size_unlimited")){const n=(new L.a).toBytes(this.userForm.getValue("bucket_quota_max_size"));l.max_size_kb=(n/1024).toFixed(0)}return this.userForm.getValue("bucket_quota_max_objects_unlimited")||(l.max_objects=this.userForm.getValue("bucket_quota_max_objects")),l}_getS3KeyUserCandidates(){let l=[];const n=this.userForm.getValue("uid");return s.isString(n)&&!s.isEmpty(n)&&l.push(n),this.subusers.forEach(n=>{l.push(n.id)}),this.s3Keys.forEach(n=>{l.push(n.user)}),l=s.uniq(l),l}onMaxBucketsModeChange(l){"1"===l&&(this.userForm.get("max_buckets").valid||this.userForm.patchValue({max_buckets:1e3}))}}var J=u("x38r");const X=new j.a("rgw/user");class H extends N.a{constructor(l,n,u,e,t,a,i){super(),this.authStorageService=l,this.rgwUserService=n,this.bsModalService=u,this.i18n=e,this.urlBuilder=t,this.actionLabels=a,this.ngZone=i,this.columns=[],this.users=[],this.selection=new V.a,this.isStale=!1,this.permission=this.authStorageService.getPermissions().rgw,this.columns=[{name:this.i18n("Username"),prop:"uid",flexGrow:1},{name:this.i18n("Full name"),prop:"display_name",flexGrow:1},{name:this.i18n("Email address"),prop:"email",flexGrow:1},{name:this.i18n("Suspended"),prop:"suspended",flexGrow:1,cellClass:"text-center",cellTransformation:J.a.checkIcon},{name:this.i18n("Max. buckets"),prop:"max_buckets",flexGrow:1,cellTransformation:J.a.map,customTemplateConfig:{"-1":this.i18n("Disabled"),0:this.i18n("Unlimited")}}];const o=()=>this.selection.first()&&""+encodeURIComponent(this.selection.first().uid);this.tableActions=[{permission:"create",icon:h.a.add,routerLink:()=>this.urlBuilder.getCreate(),name:this.actionLabels.CREATE,canBePrimary:l=>!l.hasSelection},{permission:"update",icon:h.a.edit,routerLink:()=>this.urlBuilder.getEdit(o()),name:this.actionLabels.EDIT},{permission:"delete",icon:h.a.destroy,click:()=>this.deleteAction(),disable:()=>!this.selection.hasSelection,name:this.actionLabels.DELETE,canBePrimary:l=>l.hasMultiSelection}],this.timeConditionReached()}timeConditionReached(){clearTimeout(this.staleTimeout),this.ngZone.runOutsideAngular(()=>{this.staleTimeout=window.setTimeout(()=>{this.ngZone.run(()=>{this.isStale=!0})},1e4)})}getUserList(l){this.isStale=!1,this.timeConditionReached(),this.rgwUserService.list().subscribe(l=>{this.users=l},()=>{l.error()})}updateSelection(l){this.selection=l}deleteAction(){this.bsModalService.show(T.a,{initialState:{itemDescription:this.i18n(this.selection.hasSingleSelection?"user":"users"),itemNames:this.selection.selected.map(l=>l.uid),submitActionObservable:()=>new w.a(l=>{Object(q.a)(this.selection.selected.map(l=>this.rgwUserService.delete(l.uid))).subscribe(null,n=>{l.error(n),this.table.refreshBtn()},()=>{l.complete(),this.table.refreshBtn()})})}})}}class ll{}const nl={breadcrumbs:"Daemons"},ul={breadcrumbs:"Users"},el={breadcrumbs:t.a.CREATE},tl={breadcrumbs:t.a.EDIT},al={breadcrumbs:"Buckets"},il={breadcrumbs:t.a.CREATE},ol={breadcrumbs:t.a.EDIT},sl={breadcrumbs:"Object Gateway"};class dl{}var rl=u("MdoF"),cl=u("ES0t"),ml=u("Xg1U"),fl=u("z5nN"),gl=u("iutN"),pl=u("pMnS"),vl=u("EEJc"),bl=u("PEr+"),hl=u("a40w"),Cl=u("hfeG"),_l=u("2ZVE"),Rl=u("a278"),yl=u("insk"),kl=u("cUpR"),Il=u("20UP"),El=u("GiVz"),wl=u("pKUh"),ql=u("sLuX"),Nl=u("FSuO"),Tl=u("a0VL"),xl=u("j8L6"),Vl=u("b5OY"),Sl=u("pxLl"),Dl=u("SVse");class Fl{constructor(l,n){this.rgwDaemonService=l,this.authStorageService=n,this.serviceId="",this.grafanaPermission=this.authStorageService.getPermissions().grafana}ngOnChanges(){this.selection&&(this.serviceId=this.selection.id)}getMetaData(){s.isEmpty(this.serviceId)||this.rgwDaemonService.get(this.serviceId).subscribe(l=>{this.metadata=l.rgw_metadata})}}var jl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Bl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Performance Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","one"],["uid","x5ARzZtmk"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){var u=n.component;l(n,1,0,"Performance Details"),l(n,3,0,"rgw-instance-detail?var-rgw_servers=rgw."+u.serviceId,"one","x5ARzZtmk")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function Pl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,1,"cd-table-key-value",[],null,[[null,"fetchData"]],(function(l,n,u){var e=!0;return"fetchData"===n&&(e=!1!==l.component.getMetaData()&&e),e}),ql.b,ql.a)),e["ɵdid"](5,638976,null,0,Nl.a,[Tl.a],{data:[0,"data"]},{fetchData:"fetchData"}),(l()(),e["ɵeld"](6,0,null,0,3,"tab",[["heading","Performance Counters"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](7,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](8,0,null,null,1,"cd-table-performance-counter",[["serviceType","rgw"]],null,null,null,xl.b,xl.a)),e["ɵdid"](9,114688,null,0,Vl.a,[Sl.a,El.a],{serviceType:[0,"serviceType"],serviceId:[1,"serviceId"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,Bl)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.metadata),l(n,7,0,"Performance Counters"),l(n,9,0,"rgw",u.serviceId),l(n,11,0,u.grafanaPermission.read)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby),l(n,6,0,e["ɵnov"](n,7).id,e["ɵnov"](n,7).active,e["ɵnov"](n,7).addClass,e["ɵnov"](n,7).role,e["ɵnov"](n,7).ariaLabelledby)}))}function Al(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Pl)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,1,0,n.component.selection)}),null)}function Ml(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-daemon-details",[],null,null,null,Al,jl)),e["ɵdid"](1,573440,null,0,Fl,[A,F.a],null,null)],null,null)}var Ol=e["ɵccf"]("cd-rgw-daemon-details",Fl,Ml,{selection:"selection"},{},[]),Ul=u("iExv");class Ll{constructor(l){this.rgwBucketService=l}ngOnChanges(){this.selection&&this.rgwBucketService.get(this.selection.bid).subscribe(l=>{this.selection=l})}}var zl=e["ɵcrt"]({encapsulation:0,styles:[["table[_ngcontent-%COMP%]{table-layout:fixed}table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{word-wrap:break-word}"]],data:{}});function Gl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function Kl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.selection.bucket_quota.max_size));l(n,1,0,t)}))}function $l(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function Zl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.selection.bucket_quota.max_objects)}))}function Ql(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,24,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](3,0,null,null,21,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,20,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,6,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,Gl)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Kl)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](18,0,null,null,6,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](19,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,$l)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Zl)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,u.selection.bucket_quota.max_size<=-1),l(n,17,0,u.selection.bucket_quota.max_size>-1),l(n,22,0,u.selection.bucket_quota.max_objects<=-1),l(n,24,0,u.selection.bucket_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,1),u.selection.bucket_quota.enabled));l(n,9,0,t)}))}function Yl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Mode"])),(l()(),e["ɵeld"](4,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](5,null,["",""])),(l()(),e["ɵeld"](6,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Days"])),(l()(),e["ɵeld"](9,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](10,null,["",""])),(l()(),e["ɵeld"](11,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Years"])),(l()(),e["ɵeld"](14,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](15,null,["",""]))],null,(function(l,n){var u=n.component;l(n,5,0,u.selection.lock_mode),l(n,10,0,u.selection.lock_retention_period_days),l(n,15,0,u.selection.lock_retention_period_years)}))}function Wl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,82,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,67,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,66,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](7,null,["",""])),(l()(),e["ɵeld"](8,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["ID"])),(l()(),e["ɵeld"](11,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](12,null,["",""])),(l()(),e["ɵeld"](13,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](14,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Owner"])),(l()(),e["ɵeld"](16,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](17,null,["",""])),(l()(),e["ɵeld"](18,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](19,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Index type"])),(l()(),e["ɵeld"](21,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](22,null,["",""])),(l()(),e["ɵeld"](23,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](24,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Placement rule"])),(l()(),e["ɵeld"](26,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](27,null,["",""])),(l()(),e["ɵeld"](28,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](29,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Marker"])),(l()(),e["ɵeld"](31,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](32,null,["",""])),(l()(),e["ɵeld"](33,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](34,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum marker"])),(l()(),e["ɵeld"](36,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](37,null,["",""])),(l()(),e["ɵeld"](38,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](39,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Version"])),(l()(),e["ɵeld"](41,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](42,null,["",""])),(l()(),e["ɵeld"](43,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](44,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Master version"])),(l()(),e["ɵeld"](46,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](47,null,["",""])),(l()(),e["ɵeld"](48,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](49,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Modification time"])),(l()(),e["ɵeld"](51,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](52,null,["",""])),e["ɵppd"](53,1),(l()(),e["ɵeld"](54,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](55,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Zonegroup"])),(l()(),e["ɵeld"](57,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](58,null,["",""])),(l()(),e["ɵeld"](59,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](60,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Versioning"])),(l()(),e["ɵeld"](62,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](63,null,["",""])),(l()(),e["ɵeld"](64,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](65,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["MFA Delete"])),(l()(),e["ɵeld"](67,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](68,null,["",""])),(l()(),e["ɵand"](16777216,null,null,1,null,Ql)),e["ɵdid"](70,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](71,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Locking"])),(l()(),e["ɵeld"](73,0,null,null,9,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](74,0,null,null,8,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](75,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](76,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](78,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](79,null,["",""])),e["ɵppd"](80,1),(l()(),e["ɵand"](16777216,null,null,1,null,Yl)),e["ɵdid"](82,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,70,0,u.selection.bucket_quota),l(n,82,0,u.selection.lock_enabled)}),(function(l,n){var u=n.component;l(n,7,0,u.selection.bid),l(n,12,0,u.selection.id),l(n,17,0,u.selection.owner),l(n,22,0,u.selection.index_type),l(n,27,0,u.selection.placement_rule),l(n,32,0,u.selection.marker),l(n,37,0,u.selection.max_marker),l(n,42,0,u.selection.ver),l(n,47,0,u.selection.master_ver);var t=e["ɵunv"](n,52,0,l(n,53,0,e["ɵnov"](n.parent.parent,0),u.selection.mtime));l(n,52,0,t),l(n,58,0,u.selection.zonegroup),l(n,63,0,u.selection.versioning),l(n,68,0,u.selection.mfa_delete);var a=e["ɵunv"](n,79,0,l(n,80,0,e["ɵnov"](n.parent.parent,1),u.selection.lock_enabled));l(n,79,0,a)}))}function Jl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Wl)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.selection)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function Xl(l){return e["ɵvid"](0,[e["ɵpid"](0,Tl.a,[Dl.DatePipe]),e["ɵpid"](0,Ul.a,[El.a]),e["ɵpid"](0,D.a,[L.a]),(l()(),e["ɵand"](16777216,null,null,1,null,Jl)),e["ɵdid"](4,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,4,0,n.component.selection)}),null)}function Hl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-bucket-details",[],null,null,null,Xl,zl)),e["ɵdid"](1,573440,null,0,Ll,[p],null,null)],null,null)}var ln=e["ɵccf"]("cd-rgw-bucket-details",Ll,Hl,{selection:"selection"},{},[]),nn=u("25BL"),un=u("FE24"),en=u("z/SZ"),tn=u("GS7A"),an=u("TJUb");class on{constructor(l,n,u){this.rgwUserService=l,this.bsModalService=n,this.i18n=u,this.keys=[],this.keysColumns=[],this.keysSelection=new V.a,this.icons=h.a}ngOnInit(){this.keysColumns=[{name:this.i18n("Username"),prop:"username",flexGrow:1},{name:this.i18n("Type"),prop:"type",flexGrow:1}],this.maxBucketsMap={"-1":this.i18n("Disabled"),0:this.i18n("Unlimited")}}ngOnChanges(){this.selection&&(this.user=this.selection,this.user.subusers=s.sortBy(this.user.subusers,"id"),this.user.caps=s.sortBy(this.user.caps,"type"),this.rgwUserService.getQuota(this.user.uid).subscribe(l=>{s.extend(this.user,l)}),this.keys=[],this.user.keys&&this.user.keys.forEach(l=>{this.keys.push({id:this.keys.length+1,type:"S3",username:l.user,ref:l})}),this.user.swift_keys&&this.user.swift_keys.forEach(l=>{this.keys.push({id:this.keys.length+1,type:"Swift",username:l.user,ref:l})}),this.keys=s.sortBy(this.keys,"user"))}updateKeysSelection(l){this.keysSelection=l}showKeyModal(){const l=this.keysSelection.first(),n=this.bsModalService.show("S3"===l.type?$:Y);switch(l.type){case"S3":n.content.setViewing(),n.content.setValues(l.ref.user,l.ref.access_key,l.ref.secret_key);break;case"Swift":n.content.setValues(l.ref.user,l.ref.secret_key)}}}var sn=u("LqlI"),dn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email address"])),(l()(),e["ɵeld"](3,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](4,null,["",""]))],null,(function(l,n){l(n,4,0,n.component.user.email)}))}function cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"div",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," (",") "]))],null,(function(l,n){l(n,1,0,n.context.$implicit.id,n.context.$implicit.permissions)}))}function mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Subusers"])),(l()(),e["ɵeld"](3,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,cn)),e["ɵdid"](5,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,5,0,n.component.user.subusers)}),null)}function fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"div",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," (",") "]))],null,(function(l,n){l(n,1,0,n.context.$implicit.type,n.context.$implicit.perm)}))}function gn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Capabilities"])),(l()(),e["ɵeld"](3,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,fn)),e["ɵdid"](5,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){l(n,5,0,n.component.user.caps)}),null)}function pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function bn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.user.user_quota.max_size));l(n,1,0,t)}))}function hn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function Cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function _n(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.user.user_quota.max_objects)}))}function Rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,28,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User quota"])),(l()(),e["ɵeld"](3,0,null,null,25,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,24,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,pn)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vn)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bn)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](20,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](21,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,hn)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Cn)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,_n)),e["ɵdid"](28,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,!u.user.user_quota.enabled),l(n,17,0,u.user.user_quota.enabled&&u.user.user_quota.max_size<=-1),l(n,19,0,u.user.user_quota.enabled&&u.user.user_quota.max_size>-1),l(n,24,0,!u.user.user_quota.enabled),l(n,26,0,u.user.user_quota.enabled&&u.user.user_quota.max_objects<=-1),l(n,28,0,u.user.user_quota.enabled&&u.user.user_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,0),u.user.user_quota.enabled));l(n,9,0,t)}))}function yn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function kn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function In(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "])),e["ɵppd"](2,1)],null,(function(l,n){var u=n.component,t=e["ɵunv"](n,1,0,l(n,2,0,e["ɵnov"](n.parent.parent.parent.parent,2),u.user.bucket_quota.max_size));l(n,1,0,t)}))}function En(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["-"]))],null,null)}function wn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited"]))],null,null)}function qn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.user.bucket_quota.max_objects)}))}function Nn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,28,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](3,0,null,null,25,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,24,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](8,0,null,null,2,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,["",""])),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum size"])),(l()(),e["ɵand"](16777216,null,null,1,null,yn)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,kn)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,In)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](20,0,null,null,8,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](21,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum objects"])),(l()(),e["ɵand"](16777216,null,null,1,null,En)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,wn)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,qn)),e["ɵdid"](28,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,15,0,!u.user.bucket_quota.enabled),l(n,17,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_size<=-1),l(n,19,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_size>-1),l(n,24,0,!u.user.bucket_quota.enabled),l(n,26,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_objects<=-1),l(n,28,0,u.user.bucket_quota.enabled&&u.user.bucket_quota.max_objects>-1)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent.parent.parent,0),u.user.bucket_quota.enabled));l(n,9,0,t)}))}function Tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,40,"div",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,35,"table",[["class","table table-striped table-bordered"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,34,"tbody",[],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"td",[["class","bold w-25"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](6,0,null,null,1,"td",[["class","w-75"]],null,null,null,null,null)),(l()(),e["ɵted"](7,null,["",""])),(l()(),e["ɵeld"](8,0,null,null,4,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](11,0,null,null,1,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](12,null,["",""])),(l()(),e["ɵand"](16777216,null,null,1,null,rn)),e["ɵdid"](14,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](15,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Suspended"])),(l()(),e["ɵeld"](18,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](19,null,["",""])),e["ɵppd"](20,1),(l()(),e["ɵeld"](21,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["System"])),(l()(),e["ɵeld"](24,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](25,null,["",""])),e["ɵppd"](26,1),(l()(),e["ɵeld"](27,0,null,null,5,"tr",[],null,null,null,null,null)),(l()(),e["ɵeld"](28,0,null,null,1,"td",[["class","bold"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Maximum buckets"])),(l()(),e["ɵeld"](30,0,null,null,2,"td",[],null,null,null,null,null)),(l()(),e["ɵted"](31,null,["",""])),e["ɵppd"](32,2),(l()(),e["ɵand"](16777216,null,null,1,null,mn)),e["ɵdid"](34,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gn)),e["ɵdid"](36,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Rn)),e["ɵdid"](38,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Nn)),e["ɵdid"](40,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,14,0,null==u.user.email?null:u.user.email.length),l(n,34,0,u.user.subusers&&u.user.subusers.length),l(n,36,0,u.user.caps&&u.user.caps.length),l(n,38,0,u.user.user_quota),l(n,40,0,u.user.bucket_quota)}),(function(l,n){var u=n.component;l(n,7,0,u.user.uid),l(n,12,0,u.user.display_name);var t=e["ɵunv"](n,19,0,l(n,20,0,e["ɵnov"](n.parent.parent,0),u.user.suspended));l(n,19,0,t);var a=e["ɵunv"](n,25,0,l(n,26,0,e["ɵnov"](n.parent.parent,0),"true"===u.user.system));l(n,25,0,a);var i=e["ɵunv"](n,31,0,l(n,32,0,e["ɵnov"](n.parent.parent,1),u.user.max_buckets,u.maxBucketsMap));l(n,31,0,i)}))}function xn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"tab",[["heading","Keys"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,12,"cd-table",[["columnMode","flex"],["forceIdentifier","true"],["selectionType","multi"]],null,[[null,"updateSelection"]],(function(l,n,u){var e=!0;return"updateSelection"===n&&(e=!1!==l.component.updateKeysSelection(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](3,2867200,null,0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],forceIdentifier:[3,"forceIdentifier"],selectionType:[4,"selectionType"]},{updateSelection:"updateSelection"}),(l()(),e["ɵeld"](4,0,null,1,10,"div",[["class","table-actions"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,16777216,null,null,9,"div",[["class","btn-group"],["dropdown",""]],[[2,"dropup",null],[2,"open",null],[2,"show",null]],null,null,null,null)),e["ɵprd"](512,null,un.f,un.f,[]),e["ɵdid"](7,212992,null,0,un.c,[e.ElementRef,e.Renderer2,e.ViewContainerRef,en.a,un.f,un.a,tn.b],null,null),(l()(),e["ɵeld"](8,0,null,null,6,"button",[["class","btn btn-secondary"],["type","button"]],[[8,"disabled",0]],[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showKeyModal()&&e),e}),null,null)),(l()(),e["ɵeld"](9,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](11,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](12,1),(l()(),e["ɵeld"](13,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Show"]))],(function(l,n){var u=n.component;l(n,1,0,"Keys"),l(n,3,0,u.keys,u.keysColumns,"flex","true","multi"),l(n,7,0);var e=l(n,12,0,u.icons.show);l(n,11,0,e)}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby),l(n,5,0,e["ɵnov"](n,7).dropup,e["ɵnov"](n,7).isOpen,e["ɵnov"](n,7).isOpen&&e["ɵnov"](n,7).isBs4),l(n,8,0,!u.keysSelection.hasSingleSelection)}))}function Vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Tn)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,xn)),e["ɵdid"](7,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.user),l(n,7,0,u.keys.length)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function Sn(l){return e["ɵvid"](0,[e["ɵpid"](0,Ul.a,[El.a]),e["ɵpid"](0,an.a,[]),e["ɵpid"](0,S.a,[L.a]),e["ɵqud"](671088640,1,{accessKeyTpl:0}),e["ɵqud"](671088640,2,{secretKeyTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,Vn)),e["ɵdid"](6,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,6,0,n.component.selection)}),null)}function Dn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-details",[],null,null,null,Sn,dn)),e["ɵdid"](1,638976,null,0,on,[b.a,sn.b,El.a],null,null)],(function(l,n){l(n,1,0)}),null)}var Fn=e["ɵccf"]("cd-rgw-user-details",on,Dn,{selection:"selection"},{},[]),jn=u("8xTl"),Bn=u("ajRT"),Pn=u("mXUL"),An=u("+gVj"),Mn=u("ANnk"),On=u("f/UV"),Un=u("D4zM"),Ln=u("OcYo"),zn=u("EApP"),Gn=u("KVJa"),Kn=u("Z21x"),$n=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Zn(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,51,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," "," "])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,45,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,41,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,40,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,12).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,12).onReset()&&t),t}),null,null)),e["ɵdid"](11,16384,null,0,o.G,[],null,null),e["ɵdid"](12,4210688,null,0,o.t,[[8,null],[8,null]],null,null),e["ɵprd"](2048,null,o.d,null,[o.t]),e["ɵdid"](14,16384,null,0,o.s,[[4,o.d]],null,null),(l()(),e["ɵeld"](15,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](16,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](19,0,null,0,1,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](21,0,null,0,8,"div",[["class","cd-col-form-inpu"]],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,7,"input",[["class","form-control"],["id","user"],["name","user"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0,a=l.component;return"input"===n&&(t=!1!==e["ɵnov"](l,24)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,24).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,24)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,24)._compositionEnd(u.target.value)&&t),"ngModelChange"===n&&(t=!1!==(a.user=u)&&t),t}),null,null)),e["ɵdid"](23,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](24,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](26,671744,null,0,o.u,[[2,o.d],[8,null],[8,null],[6,o.p]],{name:[0,"name"],model:[1,"model"]},{update:"ngModelChange"}),e["ɵprd"](2048,null,o.q,null,[o.u]),e["ɵdid"](28,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](29,16384,null,0,An.h,[[3,o.d],An.a],null,null),(l()(),e["ɵeld"](30,0,null,null,20,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](31,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](34,0,null,0,1,"label",[["class","cd-col-form-label"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](36,0,null,0,14,"div",[["class","cd-col-form-inpu"]],null,null,null,null,null)),(l()(),e["ɵeld"](37,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](38,0,null,null,7,"input",[["class","form-control"],["id","secret_key"],["name","secret_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0,a=l.component;return"input"===n&&(t=!1!==e["ɵnov"](l,40)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,40).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,40)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,40)._compositionEnd(u.target.value)&&t),"ngModelChange"===n&&(t=!1!==(a.secret_key=u)&&t),t}),null,null)),e["ɵdid"](39,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](40,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](42,671744,null,0,o.u,[[2,o.d],[8,null],[8,null],[6,o.p]],{name:[0,"name"],model:[1,"model"]},{update:"ngModelChange"}),e["ɵprd"](2048,null,o.q,null,[o.u]),e["ɵdid"](44,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](45,16384,null,0,An.h,[[3,o.d],An.a],null,null),(l()(),e["ɵeld"](46,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](47,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,48).onClick()&&t),t}),null,null)),e["ɵdid"](48,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](49,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,50).onClick()&&t),t}),null,null)),e["ɵdid"](50,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵeld"](51,0,null,null,2,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](52,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](53,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,16,0),l(n,26,0,"user",u.user),l(n,31,0),l(n,42,0,"secret_key",u.secret_key),l(n,48,0,"secret_key"),l(n,50,0,"secret_key"),l(n,53,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,10,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending),l(n,15,0,e["ɵnov"](n,16).hasErrors,e["ɵnov"](n,16).hasSuccess),l(n,22,0,!0,e["ɵnov"](n,28).ngClassUntouched,e["ɵnov"](n,28).ngClassTouched,e["ɵnov"](n,28).ngClassPristine,e["ɵnov"](n,28).ngClassDirty,e["ɵnov"](n,28).ngClassValid,e["ɵnov"](n,28).ngClassInvalid,e["ɵnov"](n,28).ngClassPending,e["ɵnov"](n,29).validClass,e["ɵnov"](n,29).invalidClass),l(n,30,0,e["ɵnov"](n,31).hasErrors,e["ɵnov"](n,31).hasSuccess),l(n,38,0,!0,e["ɵnov"](n,44).ngClassUntouched,e["ɵnov"](n,44).ngClassTouched,e["ɵnov"](n,44).ngClassPristine,e["ɵnov"](n,44).ngClassDirty,e["ɵnov"](n,44).ngClassValid,e["ɵnov"](n,44).ngClassInvalid,e["ɵnov"](n,44).ngClassPending,e["ɵnov"](n,45).validClass,e["ɵnov"](n,45).invalidClass)}))}function Qn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-swift-key-modal",[],null,null,null,Zn,$n)),e["ɵdid"](1,49152,null,0,Y,[sn.a,El.a,t.b],null,null)],null,null)}var Yn=e["ɵccf"]("cd-rgw-user-swift-key-modal",Y,Qn,{},{},[]),Wn=u("IZUe"),Jn=u("gp3X"),Xn=u("sb0X"),Hn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function lu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","user"],["id","user"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,2)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,2)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,2)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](4,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,4,0,"user"),l(n,7,0,"user")}),(function(l,n){l(n,0,0,!0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function nu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a username --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function uu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function eu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"select",[["autofocus",""],["class","form-control custom-select"],["formControlName","user"],["id","user"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,3).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](5,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,nu)),e["ɵdid"](10,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,uu)),e["ɵdid"](12,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,1,0,""),l(n,5,0,"user"),l(n,8,0,"user"),l(n,10,0,null!==u.userCandidates),l(n,12,0,u.userCandidates)}),(function(l,n){l(n,0,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function tu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function au(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_key"],["id","generate_key"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate key"]))],(function(l,n){l(n,1,0),l(n,10,0,"generate_key"),l(n,13,0,"generate_key")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function iu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ou(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","access_key"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵted"](-1,null,["Access key"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["class","form-control"],["formControlName","access_key"],["id","access_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](15,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](17,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](18,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,21).onClick()&&t),t}),null,null)),e["ɵdid"](21,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"button",[["cdCopy2ClipboardButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,23).onClick()&&t),t}),null,null)),e["ɵdid"](23,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,iu)),e["ɵdid"](25,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var t=l(n,7,0,!u.viewing);l(n,6,0,"cd-col-form-label",t),l(n,15,0,"access_key"),l(n,18,0,"access_key"),l(n,21,0,"access_key"),l(n,23,0,"access_key"),l(n,25,0,u.formGroup.showError("access_key",e["ɵnov"](n.parent,11),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,u.viewing,e["ɵnov"](n,17).ngClassUntouched,e["ɵnov"](n,17).ngClassTouched,e["ɵnov"](n,17).ngClassPristine,e["ɵnov"](n,17).ngClassDirty,e["ɵnov"](n,17).ngClassValid,e["ɵnov"](n,17).ngClassInvalid,e["ɵnov"](n,17).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass)}))}function su(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function du(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","secret_key"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](15,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](17,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](18,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,21).onClick()&&t),t}),null,null)),e["ɵdid"](21,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,23).onClick()&&t),t}),null,null)),e["ɵdid"](23,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,su)),e["ɵdid"](25,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var t=l(n,7,0,!u.viewing);l(n,6,0,"cd-col-form-label",t),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,21,0,"secret_key"),l(n,23,0,"secret_key"),l(n,25,0,u.formGroup.showError("secret_key",e["ɵnov"](n.parent,11),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,u.viewing,e["ɵnov"](n,17).ngClassUntouched,e["ɵnov"](n,17).ngClassTouched,e["ɵnov"](n,17).ngClassPristine,e["ɵnov"](n,17).ngClassDirty,e["ɵnov"](n,17).ngClassValid,e["ɵnov"](n,17).ngClassInvalid,e["ɵnov"](n,17).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass)}))}function ru(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](1,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](2,0,[""," ",""])),e["ɵppd"](3,1),e["ɵppd"](4,1)],(function(l,n){l(n,1,0,n.component.formGroup)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,2,0,l(n,3,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,2,1,l(n,4,0,e["ɵnov"](n.parent,1),u.resource));l(n,2,0,t,a)}))}function cu(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,40,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,34,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,33,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,22,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,4,"label",[["class","cd-col-form-label"],["for","user"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](22,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](23,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](25,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,lu)),e["ɵdid"](27,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,eu)),e["ɵdid"](29,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,tu)),e["ɵdid"](31,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,au)),e["ɵdid"](33,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ou)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,du)),e["ɵdid"](37,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](38,0,null,null,4,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,ru)),e["ɵdid"](40,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](42,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0);var t=l(n,23,0,!u.viewing);l(n,22,0,"cd-col-form-label",t),l(n,27,0,u.viewing),l(n,29,0,!u.viewing),l(n,31,0,u.formGroup.showError("user",e["ɵnov"](n,11),"required")),l(n,33,0,!u.viewing),l(n,35,0,!u.formGroup.getValue("generate_key")),l(n,37,0,!u.formGroup.getValue("generate_key")),l(n,40,0,!u.viewing),l(n,42,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess)}))}function mu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-s3-key-modal",[],null,null,null,cu,Hn)),e["ɵdid"](1,49152,null,0,$,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var fu=e["ɵccf"]("cd-rgw-user-s3-key-modal",$,mu,{},{submitAction:"submitAction"},[]),gu=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function pu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,7,"input",[["class","form-control"],["formControlName","type"],["id","type"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,2)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,2)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,2)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](4,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,4,0,"type"),l(n,7,0,"type")}),(function(l,n){l(n,0,0,!0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function vu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a type --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function bu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function hu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"select",[["autofocus",""],["class","form-control custom-select"],["formControlName","type"],["id","type"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,3).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](5,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vu)),e["ɵdid"](10,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bu)),e["ɵdid"](12,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,1,0,""),l(n,5,0,"type"),l(n,8,0,"type"),l(n,10,0,null!==u.types),l(n,12,0,u.types)}),(function(l,n){l(n,0,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function Cu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function _u(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Ru(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function yu(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,61,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,55,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,54,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,40,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,4,"label",[["class","cd-col-form-label"],["for","type"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](22,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](23,{required:0}),(l()(),e["ɵted"](-1,null,["Type"])),(l()(),e["ɵeld"](25,0,null,0,6,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,pu)),e["ɵdid"](27,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,hu)),e["ɵdid"](29,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Cu)),e["ɵdid"](31,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](32,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](33,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](36,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","perm"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permission"])),(l()(),e["ɵeld"](38,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](39,0,null,null,14,"select",[["class","form-control custom-select"],["formControlName","perm"],["id","perm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,41).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,41).onTouched()&&t),t}),null,null)),e["ɵdid"](40,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](41,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](43,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](45,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](46,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](47,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](48,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](49,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a permission --"])),(l()(),e["ɵand"](16777216,null,null,2,null,_u)),e["ɵdid"](52,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),e["ɵpad"](53,3),(l()(),e["ɵand"](16777216,null,null,1,null,Ru)),e["ɵdid"](55,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](56,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](57,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](58,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](59,0,[""," ",""])),e["ɵppd"](60,1),e["ɵppd"](61,1),(l()(),e["ɵeld"](62,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](63,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0);var t=l(n,23,0,!u.editing);l(n,22,0,"cd-col-form-label",t),l(n,27,0,u.editing),l(n,29,0,!u.editing),l(n,31,0,u.formGroup.showError("type",e["ɵnov"](n,11),"required")),l(n,33,0),l(n,43,0,"perm"),l(n,46,0,"perm"),l(n,48,0,null),l(n,49,0,null);var a=l(n,53,0,"read","write","*");l(n,52,0,a),l(n,55,0,u.formGroup.showError("perm",e["ɵnov"](n,11),"required")),l(n,58,0,u.formGroup),l(n,63,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess),l(n,32,0,e["ɵnov"](n,33).hasErrors,e["ɵnov"](n,33).hasSuccess),l(n,39,0,e["ɵnov"](n,45).ngClassUntouched,e["ɵnov"](n,45).ngClassTouched,e["ɵnov"](n,45).ngClassPristine,e["ɵnov"](n,45).ngClassDirty,e["ɵnov"](n,45).ngClassValid,e["ɵnov"](n,45).ngClassInvalid,e["ɵnov"](n,45).ngClassPending,e["ɵnov"](n,46).validClass,e["ɵnov"](n,46).invalidClass);var i=e["ɵunv"](n,59,0,l(n,60,0,e["ɵnov"](n,0),u.action)),o=e["ɵunv"](n,59,1,l(n,61,0,e["ɵnov"](n,1),u.resource));l(n,59,0,i,o)}))}function ku(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-capability-modal",[],null,null,null,yu,gu)),e["ɵdid"](1,49152,null,0,K,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var Iu=e["ɵccf"]("cd-rgw-user-capability-modal",K,ku,{},{submitAction:"submitAction"},[]),Eu=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function wu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function qu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen subuser ID is already in use."]))],null,null)}function Nu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,[" "," "]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Tu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function xu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Vu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,xu)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"secret_key"),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,20,0,"secret_key"),l(n,22,0,u.formGroup.showError("secret_key",e["ɵnov"](n.parent.parent,11),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function Su(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Swift key"])),(l()(),e["ɵeld"](3,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_secret"],["id","generate_secret"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_secret"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate secret"])),(l()(),e["ɵand"](16777216,null,null,1,null,Vu)),e["ɵdid"](20,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"generate_secret"),l(n,16,0,"generate_secret"),l(n,20,0,!u.editing&&!u.formGroup.getValue("generate_secret"))}),(function(l,n){l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function Du(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵeld"](2,0,null,null,93,"cd-modal",[],null,null,null,vl.c,vl.b)),e["ɵdid"](3,49152,null,0,Bn.a,[],{modalRef:[0,"modalRef"]},null),(l()(),e["ɵeld"](4,0,null,0,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](5,null,[""," ",""])),e["ɵppd"](6,1),e["ɵppd"](7,1),(l()(),e["ɵeld"](8,0,null,1,87,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,86,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,11).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,11).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,14).onSubmit()&&t),t}),null,null)),e["ɵdid"](10,16384,null,0,o.G,[],null,null),e["ɵdid"](11,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](13,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](14,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](15,0,null,null,72,"div",[["class","modal-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](17,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](20,0,null,0,1,"label",[["class","cd-col-form-label"],["for","uid"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](22,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,7,"input",[["class","form-control"],["formControlName","uid"],["id","uid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,25)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,25).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,25)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,25)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](24,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](25,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](27,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](29,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](30,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](31,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](32,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](35,0,null,0,4,"label",[["class","cd-col-form-label"],["for","subuid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](37,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](38,{required:0}),(l()(),e["ɵted"](-1,null,["Subuser"])),(l()(),e["ɵeld"](40,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](41,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","subuid"],["id","subuid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,44)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,44).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,44)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,44)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](42,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](43,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](44,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](46,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](48,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](49,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,wu)),e["ɵdid"](51,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,qu)),e["ɵdid"](53,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](54,0,null,null,31,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](55,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](58,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","perm"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permission"])),(l()(),e["ɵeld"](60,0,null,0,25,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](61,0,null,null,22,"select",[["class","form-control custom-select"],["formControlName","perm"],["id","perm"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,63).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,63).onTouched()&&t),t}),null,null)),e["ɵdid"](62,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](63,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](65,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](67,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](68,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](69,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](70,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](71,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a permission --"])),(l()(),e["ɵand"](16777216,null,null,2,null,Nu)),e["ɵdid"](74,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),e["ɵpad"](75,2),(l()(),e["ɵeld"](76,0,null,null,3,"option",[["value","read-write"]],null,null,null,null,null)),e["ɵdid"](77,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](78,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["read, write"])),(l()(),e["ɵeld"](80,0,null,null,3,"option",[["value","full-control"]],null,null,null,null,null)),e["ɵdid"](81,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](82,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["full"])),(l()(),e["ɵand"](16777216,null,null,1,null,Tu)),e["ɵdid"](85,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Su)),e["ɵdid"](87,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](88,0,null,null,7,"div",[["class","modal-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](89,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](90,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](91,0,[""," ",""])),e["ɵppd"](92,1),e["ɵppd"](93,1),(l()(),e["ɵeld"](94,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](95,49152,null,0,Kn.a,[Dl.Location,t.b],{back:[0,"back"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.bsModalRef),l(n,11,0,u.formGroup),l(n,14,0,u.formGroup),l(n,17,0),l(n,27,0,"uid"),l(n,30,0,"uid"),l(n,32,0);var t=l(n,38,0,!u.editing);l(n,37,0,"cd-col-form-label",t),l(n,42,0,""),l(n,46,0,"subuid"),l(n,49,0,"subuid"),l(n,51,0,u.formGroup.showError("subuid",e["ɵnov"](n,11),"required")),l(n,53,0,u.formGroup.showError("subuid",e["ɵnov"](n,11),"subuserIdExists")),l(n,55,0),l(n,65,0,"perm"),l(n,68,0,"perm"),l(n,70,0,null),l(n,71,0,null);var a=l(n,75,0,"read","write");l(n,74,0,a),l(n,77,0,"read-write"),l(n,78,0,"read-write"),l(n,81,0,"full-control"),l(n,82,0,"full-control"),l(n,85,0,u.formGroup.showError("perm",e["ɵnov"](n,11),"required")),l(n,87,0,!u.editing),l(n,90,0,u.formGroup),l(n,95,0,u.bsModalRef.hide)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,5,0,l(n,6,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,5,1,l(n,7,0,e["ɵnov"](n,1),u.resource));l(n,5,0,t,a),l(n,9,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending),l(n,16,0,e["ɵnov"](n,17).hasErrors,e["ɵnov"](n,17).hasSuccess),l(n,23,0,!0,e["ɵnov"](n,29).ngClassUntouched,e["ɵnov"](n,29).ngClassTouched,e["ɵnov"](n,29).ngClassPristine,e["ɵnov"](n,29).ngClassDirty,e["ɵnov"](n,29).ngClassValid,e["ɵnov"](n,29).ngClassInvalid,e["ɵnov"](n,29).ngClassPending,e["ɵnov"](n,30).validClass,e["ɵnov"](n,30).invalidClass),l(n,31,0,e["ɵnov"](n,32).hasErrors,e["ɵnov"](n,32).hasSuccess),l(n,41,0,u.editing,e["ɵnov"](n,48).ngClassUntouched,e["ɵnov"](n,48).ngClassTouched,e["ɵnov"](n,48).ngClassPristine,e["ɵnov"](n,48).ngClassDirty,e["ɵnov"](n,48).ngClassValid,e["ɵnov"](n,48).ngClassInvalid,e["ɵnov"](n,48).ngClassPending,e["ɵnov"](n,49).validClass,e["ɵnov"](n,49).invalidClass),l(n,54,0,e["ɵnov"](n,55).hasErrors,e["ɵnov"](n,55).hasSuccess),l(n,61,0,e["ɵnov"](n,67).ngClassUntouched,e["ɵnov"](n,67).ngClassTouched,e["ɵnov"](n,67).ngClassPristine,e["ɵnov"](n,67).ngClassDirty,e["ɵnov"](n,67).ngClassValid,e["ɵnov"](n,67).ngClassInvalid,e["ɵnov"](n,67).ngClassPending,e["ɵnov"](n,68).validClass,e["ɵnov"](n,68).invalidClass);var i=e["ɵunv"](n,91,0,l(n,92,0,e["ɵnov"](n,0),u.action)),o=e["ɵunv"](n,91,1,l(n,93,0,e["ɵnov"](n,1),u.resource));l(n,91,0,i,o)}))}function Fu(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-subuser-modal",[],null,null,null,Du,Eu)),e["ɵdid"](1,49152,null,0,Q,[_.a,sn.a,El.a,t.b],null,null)],null,null)}var ju=e["ɵccf"]("cd-rgw-user-subuser-modal",Q,Fu,{},{submitAction:"submitAction"},[]),Bu=u("yT6U"),Pu=u("4DD9"),Au=u("+0ag"),Mu=u("IzCI"),Ou=u("Dwqy"),Uu=u("uYzU"),Lu=u("FFMq"),zu=u("E2fk"),Gu=u("nSDx"),Ku=u("SB+Q"),$u=u("TYzs"),Zu=u("BQkM"),Qu=u("dEH0"),Yu=u("G1/K"),Wu=u("efK2"),Ju=u("CNMR"),Xu=u("KOzp"),Hu=u("2uy1"),le=u("38Bd"),ne=u("978R"),ue=u("w9WL"),ee=u("iInd"),te=u("9Xeq"),ae=u("hrfs"),ie=u("yGOH"),oe=u("bxSN"),se=u("WF9J"),de=u("V/fk"),re=u("ChqD"),ce=u("PCNd"),me=u("G6Q+"),fe=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ge(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Overall Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","WAkugZpiz"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Overall Performance"),l(n,3,0,"rgw-overview?","two","WAkugZpiz")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function pe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"tab",[["heading","Sync Performance"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](1,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](2,0,null,null,1,"cd-grafana",[["grafanaStyle","two"],["uid","rgw-sync-overview"]],null,null,null,Rl.b,Rl.a)),e["ɵdid"](3,638976,null,0,yl.a,[kl.b,Il.a,El.a],{grafanaPath:[0,"grafanaPath"],grafanaStyle:[1,"grafanaStyle"],uid:[2,"uid"]},null)],(function(l,n){l(n,1,0,"Sync Performance"),l(n,3,0,"radosgw-sync-overview?","two","rgw-sync-overview")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).id,e["ɵnov"](n,1).active,e["ɵnov"](n,1).addClass,e["ɵnov"](n,1).role,e["ɵnov"](n,1).ariaLabelledby)}))}function ve(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,11,"tabset",[],[[2,"tab-container",null]],null,null,wl.b,wl.a)),e["ɵdid"](1,180224,null,0,_l.e,[_l.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,5,"tab",[["heading","Daemons List"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,_l.b,[_l.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,3,"cd-table",[["columnMode","flex"]],null,[[null,"setExpandedRow"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"fetchData"===n&&(e=!1!==t.getDaemonList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](5,2867200,null,0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"]},{fetchData:"fetchData",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](6,0,null,3,1,"cd-rgw-daemon-details",[["cdTableDetail",""]],null,null,null,Al,jl)),e["ɵdid"](7,573440,null,0,Fl,[A,F.a],{selection:[0,"selection"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,ge)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,0,1,null,pe)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Daemons List"),l(n,5,0,u.daemons,u.columns,"flex",!0),l(n,7,0,u.expandedRow),l(n,9,0,u.grafanaPermission.read),l(n,11,0,u.grafanaPermission.read&&u.isMultiSite)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function be(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-daemon-list",[],null,null,null,ve,fe)),e["ɵdid"](1,114688,null,0,O,[A,F.a,M.a,El.a,v],null,null)],(function(l,n){l(n,1,0)}),null)}var he=e["ɵccf"]("cd-rgw-daemon-list",O,be,{},{},[]),Ce=u("DqMs"),_e=u("/NlG"),Re=u("NUGo"),ye=u("S7zO"),ke=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ie(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["size","slim"],["type","warning"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"],size:[1,"size"]},null),(l()(),e["ɵted"](-1,0,["The user list data might be stale. If needed, you can manually reload it."]))],(function(l,n){l(n,1,0,"warning","slim")}),null)}function Ee(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{table:0}),(l()(),e["ɵand"](16777216,null,null,1,null,Ie)),e["ɵdid"](2,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](3,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","uid"],["selectionType","multiClick"]],null,[[null,"setExpandedRow"],[null,"updateSelection"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"updateSelection"===n&&(e=!1!==t.updateSelection(u)&&e),"fetchData"===n&&(e=!1!==t.getUserList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](4,2867200,[[1,4],["table",4]],0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],autoReload:[4,"autoReload"],identifier:[5,"identifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](5,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Re.b,Re.a)),e["ɵdid"](6,114688,null,0,ye.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](7,0,null,3,1,"cd-rgw-user-details",[["cdTableDetail",""]],null,null,null,Sn,dn)),e["ɵdid"](8,638976,null,0,on,[b.a,sn.b,El.a],{selection:[0,"selection"]},null)],(function(l,n){var u=n.component;l(n,2,0,u.isStale),l(n,4,0,u.users,u.columns,"flex",!0,!1,"uid","multiClick"),l(n,6,0,u.permission,u.selection,u.tableActions),l(n,8,0,u.expandedRow)}),null)}function we(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-rgw-user-list",[],null,null,null,Ee,ke)),e["ɵprd"](256,null,j.a,X,[]),e["ɵdid"](2,49152,null,0,H,[F.a,b.a,sn.b,El.a,j.a,t.b,e.NgZone],null,null)],null,null)}var qe=e["ɵccf"]("cd-rgw-user-list",H,we,{},{},[]),Ne=u("QC43"),Te=u("XFyV"),xe=u("EmSq"),Ve=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Se(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Ne.b,Ne.a)),e["ɵdid"](1,49152,null,0,Te.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading user data..."]))],null,null)}function De(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["type","error"]],null,[[null,"backAction"]],(function(l,n,u){var e=!0;return"backAction"===n&&(e=!1!==l.component.goToListView()&&e),e}),Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"]},{backAction:"backAction"}),(l()(),e["ɵted"](-1,0,["The user data could not be loaded."]))],(function(l,n){l(n,1,0,"error")}),null)}function Fe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function je(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen user ID is already in use."]))],null,null)}function Be(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Pe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This is not a valid email address."]))],null,null)}function Ae(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen email address is already in use."]))],null,null)}function Me(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Oe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 1."]))],null,null)}function Ue(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,0,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,8,"input",[["class","form-control"],["formControlName","max_buckets"],["id","max_buckets"],["min","1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](9,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](11,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Me)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Oe)),e["ɵdid"](18,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"max_buckets"),l(n,14,0,"max_buckets"),l(n,16,0,u.userForm.showError("max_buckets",e["ɵnov"](n.parent,3),"required")),l(n,18,0,u.userForm.showError("max_buckets",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function Le(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ze(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,15,{FormControlNames:1}),e["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","access_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Access key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","access_key"],["id","access_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[15,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","access_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Le)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"access_key"),l(n,15,0,"access_key"),l(n,18,0,"access_key"),l(n,20,0,"access_key"),l(n,22,0,u.userForm.showError("access_key",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function Ge(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ke(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,17,{FormControlNames:1}),e["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","secret_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Secret key"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["class","form-control"],["formControlName","secret_key"],["id","secret_key"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,10)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,10)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,10)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](9,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](10,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](12,671744,[[17,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,4,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,18).onClick()&&t),t}),null,null)),e["ɵdid"](18,81920,null,0,Un.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](19,0,null,null,1,"button",[["cdCopy2ClipboardButton","secret_key"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var t=!0;return"click"===n&&(t=!1!==e["ɵnov"](l,20).onClick()&&t),t}),null,null)),e["ɵdid"](20,81920,null,0,Ln.a,[e.ElementRef,e.Renderer2,zn.j,El.a],{cdCopy2ClipboardButton:[0,"cdCopy2ClipboardButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ge)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"secret_key"),l(n,15,0,"secret_key"),l(n,18,0,"secret_key"),l(n,20,0,"secret_key"),l(n,22,0,u.userForm.showError("secret_key",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function $e(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["S3 key"])),(l()(),e["ɵeld"](3,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,13,{FormControlNames:1}),e["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","generate_key"],["id","generate_key"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[13,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","generate_key"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Auto-generate key"])),(l()(),e["ɵand"](16777216,null,null,1,null,ze)),e["ɵdid"](20,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ke)),e["ɵdid"](22,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"generate_key"),l(n,16,0,"generate_key"),l(n,20,0,!u.editing&&!u.userForm.getValue("generate_key")),l(n,22,0,!u.editing&&!u.userForm.getValue("generate_key"))}),(function(l,n){l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function Ze(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no subusers."]))],null,null)}function Qe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,25,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,23,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,2,"div",[["class","input-group-prepend border-left-0 border-right-0"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](11,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](12,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,16777216,null,null,5,"button",[["class","btn btn-light tc_showSubuserButton"],["tooltip","Edit"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSubuserModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](14,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](15,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](17,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](18,1),(l()(),e["ɵeld"](19,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteSubuserButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteSubuser(l.context.index)&&e),e}),null,null)),e["ɵdid"](20,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](21,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](23,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](24,1),(l()(),e["ɵeld"](25,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,14,0,"Edit");var e=l(n,18,0,u.icons.edit);l(n,17,0,e),l(n,20,0,"Delete");var t=l(n,24,0,u.icons.destroy);l(n,23,0,t)}),(function(l,n){var u=n.component;l(n,4,0,e["ɵinlineInterpolate"](1,"",u.icons.user,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.id,"")),l(n,9,0,e["ɵinlineInterpolate"](1,"",u.icons.share,"")),l(n,10,0,e["ɵinlineInterpolate"](1,"","full-control"===n.context.$implicit.permissions?"full":n.context.$implicit.permissions,""))}))}function Ye(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Subusers"])),(l()(),e["ɵeld"](3,0,null,null,17,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,16,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Ze)),e["ɵdid"](6,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Qe)),e["ɵdid"](8,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](9,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"button",[["class","btn btn-light float-right tc_addSubuserButton"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSubuserModal()&&e),e}),null,null)),(l()(),e["ɵeld"](12,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](14,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](15,1),(l()(),e["ɵeld"](16,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](17,null,[""," ",""])),e["ɵppd"](18,1),e["ɵppd"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,6,0,0===u.subusers.length),l(n,8,0,u.subusers);var e=l(n,15,0,u.icons.add);l(n,14,0,e)}),(function(l,n){var u=n.component,t=e["ɵunv"](n,17,0,l(n,18,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.CREATE)),a=e["ɵunv"](n,17,1,l(n,19,0,e["ɵnov"](n.parent.parent,1),u.subuserLabel));l(n,17,0,t,a)}))}function We(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no keys."]))],null,null)}function Je(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,18,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"div",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_showS3KeyButton"],["tooltip","Show"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showS3KeyModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteS3KeyButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteS3Key(l.context.index)&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Show");var e=l(n,13,0,u.icons.show);l(n,12,0,e),l(n,15,0,"Delete");var t=l(n,19,0,u.icons.destroy);l(n,18,0,t)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.key,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.user,""))}))}function Xe(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no keys."]))],null,null)}function He(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,12,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"div",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"span",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,6,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_showSwiftKeyButton"],["tooltip","Show"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showSwiftKeyModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Show");var e=l(n,13,0,u.icons.show);l(n,12,0,e)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.key,"")),l(n,5,0,e["ɵinlineInterpolate"](1,"",n.context.$implicit.user,""))}))}function lt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,37,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Keys"])),(l()(),e["ɵeld"](3,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,19,{FormControlNames:1}),e["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["S3"])),(l()(),e["ɵeld"](9,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,We)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Je)),e["ɵdid"](13,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](14,0,null,null,10,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](15,0,null,null,9,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](16,0,null,null,8,"button",[["class","btn btn-light float-right tc_addS3KeyButton"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showS3KeyModal()&&e),e}),null,null)),(l()(),e["ɵeld"](17,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](19,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](20,1),(l()(),e["ɵeld"](21,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](22,null,[""," ",""])),e["ɵppd"](23,1),e["ɵppd"](24,1),(l()(),e["ɵeld"](25,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null)),(l()(),e["ɵeld"](26,0,null,0,0,"hr",[],null,null,null,null,null)),(l()(),e["ɵeld"](27,0,null,null,10,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](28,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,21,{FormControlNames:1}),e["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),e["ɵeld"](31,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Swift"])),(l()(),e["ɵeld"](33,0,null,0,4,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Xe)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,He)),e["ɵdid"](37,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,11,0,0===u.s3Keys.length),l(n,13,0,u.s3Keys);var e=l(n,20,0,u.icons.add);l(n,19,0,e),l(n,28,0),l(n,35,0,0===u.swiftKeys.length),l(n,37,0,u.swiftKeys)}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess);var t=e["ɵunv"](n,22,0,l(n,23,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.CREATE)),a=e["ɵunv"](n,22,1,l(n,24,0,e["ɵnov"](n.parent.parent,1),u.s3keyLabel));l(n,22,0,t,a),l(n,27,0,e["ɵnov"](n,28).hasErrors,e["ɵnov"](n,28).hasSuccess)}))}function nt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"span",[["class","form-text text-muted"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["There are no capabilities."]))],null,null)}function ut(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,20,"span",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,18,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](2,0,null,null,2,"span",[["class","input-group-prepend"]],null,null,null,null,null)),(l()(),e["ɵeld"](3,0,null,null,1,"div",[["class","input-group-text"]],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,"input",[["class","cd-form-control"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),e["ɵdid"](6,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),(l()(),e["ɵeld"](7,0,null,null,12,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,16777216,null,null,5,"button",[["class","btn btn-light tc_editCapButton"],["tooltip","Edit"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showCapabilityModal(l.context.index)&&e),e}),null,null)),e["ɵdid"](9,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](10,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](12,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](13,1),(l()(),e["ɵeld"](14,16777216,null,null,5,"button",[["class","btn btn-light tc_deleteCapButton"],["tooltip","Delete"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.deleteCapability(l.context.index)&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,0,"span",[["class","form-text text-muted"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,9,0,"Edit");var e=l(n,13,0,u.icons.edit);l(n,12,0,e),l(n,15,0,"Delete");var t=l(n,19,0,u.icons.destroy);l(n,18,0,t)}),(function(l,n){l(n,4,0,e["ɵinlineInterpolate"](1,"",n.component.icons.share,"")),l(n,5,0,e["ɵinlineInterpolate"](2,"",n.context.$implicit.type,":",n.context.$implicit.perm,""))}))}function et(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,24,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Capabilities"])),(l()(),e["ɵeld"](3,0,null,null,21,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,23,{FormControlNames:1}),e["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,17,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,nt)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ut)),e["ɵdid"](11,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵeld"](12,0,null,null,11,"div",[["class","row"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,10,"div",[["class","col-12"]],null,null,null,null,null)),(l()(),e["ɵeld"](14,16777216,null,null,9,"button",[["class","btn btn-light float-right tc_addCapButton"],["tooltip","All capabilities are already added."],["triggers","pointerenter pointerleave"],["type","button"]],[[8,"disabled",0]],[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.showCapabilityModal()&&e),e}),null,null)),e["ɵdid"](15,212992,null,0,ne.c,[e.ViewContainerRef,en.a,ne.a,e.ElementRef,e.Renderer2,Hu.a],{tooltip:[0,"tooltip"],triggers:[1,"triggers"],isDisabled:[2,"isDisabled"]},null),(l()(),e["ɵeld"](16,0,null,null,3,"i",[],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{ngClass:[0,"ngClass"]},null),e["ɵpad"](19,1),(l()(),e["ɵeld"](20,0,null,null,3,null,null,null,null,null,null,null)),(l()(),e["ɵted"](21,null,[""," ",""])),e["ɵppd"](22,1),e["ɵppd"](23,1),(l()(),e["ɵeld"](24,0,null,null,0,"span",[["class","help-block"]],null,null,null,null,null))],(function(l,n){var u=n.component;l(n,4,0),l(n,9,0,0===u.capabilities.length),l(n,11,0,u.capabilities),l(n,15,0,"All capabilities are already added.","pointerenter pointerleave",!u.hasAllCapabilities());var e=l(n,19,0,u.icons.add);l(n,18,0,e)}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,14,0,u.hasAllCapabilities());var t=e["ɵunv"](n,21,0,l(n,22,0,e["ɵnov"](n.parent.parent,0),u.actionLabels.ADD)),a=e["ɵunv"](n,21,1,l(n,23,0,e["ɵnov"](n.parent.parent,1),u.capabilityLabel));l(n,21,0,t,a)}))}function tt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,27,{FormControlNames:1}),e["ɵqud"](603979776,28,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_max_size_unlimited"],["id","user_quota_max_size_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[27,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_max_size_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited size"]))],(function(l,n){l(n,1,0),l(n,10,0,"user_quota_max_size_unlimited"),l(n,13,0,"user_quota_max_size_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function at(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function it(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function ot(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,29,{FormControlNames:1}),e["ɵqud"](603979776,30,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","user_quota_max_size"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. size"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["formControlName","user_quota_max_size"],["id","user_quota_max_size"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,12).onBlur(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](10,671744,[[29,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,81920,null,0,xe.a,[e.ElementRef,o.q,S.a,L.a],null,null),e["ɵdid"](13,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,at)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,it)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,10,0,"user_quota_max_size"),l(n,12,0),l(n,15,0,"user_quota_max_size"),l(n,17,0,u.userForm.showError("user_quota_max_size",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("user_quota_max_size",e["ɵnov"](n.parent,3),"quotaMaxSize"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function st(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,31,{FormControlNames:1}),e["ɵqud"](603979776,32,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_max_objects_unlimited"],["id","user_quota_max_objects_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[31,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_max_objects_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited objects"]))],(function(l,n){l(n,1,0),l(n,10,0,"user_quota_max_objects_unlimited"),l(n,13,0,"user_quota_max_objects_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function dt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function rt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 0."]))],null,null)}function ct(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,33,{FormControlNames:1}),e["ɵqud"](603979776,34,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","user_quota_max_objects"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. objects"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","user_quota_max_objects"],["id","user_quota_max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](10,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](12,671744,[[33,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,dt)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,rt)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"user_quota_max_objects"),l(n,15,0,"user_quota_max_objects"),l(n,17,0,u.userForm.showError("user_quota_max_objects",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("user_quota_max_objects",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function mt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,37,{FormControlNames:1}),e["ɵqud"](603979776,38,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_max_size_unlimited"],["id","bucket_quota_max_size_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[37,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_max_size_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited size"]))],(function(l,n){l(n,1,0),l(n,10,0,"bucket_quota_max_size_unlimited"),l(n,13,0,"bucket_quota_max_size_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function ft(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function gt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function pt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,39,{FormControlNames:1}),e["ɵqud"](603979776,40,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","bucket_quota_max_size"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. size"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["cdDimlessBinary",""],["class","form-control"],["formControlName","bucket_quota_max_size"],["id","bucket_quota_max_size"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,8)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,8)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,8)._compositionEnd(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,12).onBlur(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](10,671744,[[39,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,81920,null,0,xe.a,[e.ElementRef,o.q,S.a,L.a],null,null),e["ɵdid"](13,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ft)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gt)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,10,0,"bucket_quota_max_size"),l(n,12,0),l(n,15,0,"bucket_quota_max_size"),l(n,17,0,u.userForm.showError("bucket_quota_max_size",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("bucket_quota_max_size",e["ɵnov"](n.parent,3),"quotaMaxSize"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function vt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,41,{FormControlNames:1}),e["ɵqud"](603979776,42,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_max_objects_unlimited"],["id","bucket_quota_max_objects_unlimited"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,8).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,8).onTouched()&&t),t}),null,null)),e["ɵdid"](7,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](8,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](10,671744,[[41,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](12,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](13,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_max_objects_unlimited"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Unlimited objects"]))],(function(l,n){l(n,1,0),l(n,10,0,"bucket_quota_max_objects_unlimited"),l(n,13,0,"bucket_quota_max_objects_unlimited")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,12).ngClassUntouched,e["ɵnov"](n,12).ngClassTouched,e["ɵnov"](n,12).ngClassPristine,e["ɵnov"](n,12).ngClassDirty,e["ɵnov"](n,12).ngClassValid,e["ɵnov"](n,12).ngClassInvalid,e["ɵnov"](n,12).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function bt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ht(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be >= 0."]))],null,null)}function Ct(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,43,{FormControlNames:1}),e["ɵqud"](603979776,44,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","bucket_quota_max_objects"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. objects"])),(l()(),e["ɵeld"](6,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,8,"input",[["class","form-control"],["formControlName","bucket_quota_max_objects"],["id","bucket_quota_max_objects"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,10).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,10).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](10,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](12,671744,[[43,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](14,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](15,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,bt)),e["ɵdid"](17,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ht)),e["ɵdid"](19,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,12,0,"bucket_quota_max_objects"),l(n,15,0,"bucket_quota_max_objects"),l(n,17,0,u.userForm.showError("bucket_quota_max_objects",e["ɵnov"](n.parent,3),"required")),l(n,19,0,u.userForm.showError("bucket_quota_max_objects",e["ɵnov"](n.parent,3),"min"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,14).ngClassUntouched,e["ɵnov"](n,14).ngClassTouched,e["ɵnov"](n,14).ngClassPristine,e["ɵnov"](n,14).ngClassDirty,e["ɵnov"](n,14).ngClassValid,e["ɵnov"](n,14).ngClassInvalid,e["ɵnov"](n,14).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function _t(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,190,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,189,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,3).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,3).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,6).onSubmit()&&t),t}),null,null)),e["ɵdid"](2,16384,null,0,o.G,[],null,null),e["ɵdid"](3,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](5,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](6,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](7,0,null,null,183,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,[""," ",""])),e["ɵppd"](10,1),e["ɵppd"](11,1),(l()(),e["ɵeld"](12,0,null,null,169,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](14,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](17,0,null,0,4,"label",[["class","cd-col-form-label"],["for","uid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](19,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](20,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](22,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","uid"],["id","uid"],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,26)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,26).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,26)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,26)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](24,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](25,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](26,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](28,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](30,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](31,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Fe)),e["ɵdid"](33,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,je)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](36,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](37,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](40,0,null,0,4,"label",[["class","cd-col-form-label"],["for","display_name"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](42,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](43,{required:0}),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](45,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](46,0,null,null,7,"input",[["class","form-control"],["formControlName","display_name"],["id","display_name"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,48)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,48).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,48)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,48)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](47,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](48,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](50,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](52,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](53,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Be)),e["ɵdid"](55,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](56,0,null,null,18,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](57,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"],["for","email"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email address"])),(l()(),e["ɵeld"](62,0,null,0,12,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,7,"input",[["class","form-control"],["formControlName","email"],["id","email"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,65)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,65).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,65)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,65)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](64,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](65,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](67,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](69,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](70,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Pe)),e["ɵdid"](72,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ae)),e["ɵdid"](74,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](75,0,null,null,26,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](76,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](79,0,null,0,1,"label",[["class","cd-col-form-label"],["for","max_buckets_mode"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Max. buckets"])),(l()(),e["ɵeld"](81,0,null,0,20,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](82,0,null,null,19,"select",[["class","form-control custom-select"],["formControlName","max_buckets_mode"],["id","max_buckets_mode"],["name","max_buckets_mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,84).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,84).onTouched()&&t),"change"===n&&(t=!1!==a.onMaxBucketsModeChange(u.target.value)&&t),t}),null,null)),e["ɵdid"](83,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](84,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](86,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](88,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](89,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](90,0,null,null,3,"option",[["value","-1"]],null,null,null,null,null)),e["ɵdid"](91,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](92,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Disabled"])),(l()(),e["ɵeld"](94,0,null,null,3,"option",[["value","0"]],null,null,null,null,null)),e["ɵdid"](95,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](96,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Unlimited"])),(l()(),e["ɵeld"](98,0,null,null,3,"option",[["value","1"]],null,null,null,null,null)),e["ɵdid"](99,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](100,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Custom"])),(l()(),e["ɵand"](16777216,null,null,1,null,Ue)),e["ɵdid"](103,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](104,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](105,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,11,{FormControlNames:1}),e["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),e["ɵeld"](108,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](109,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](110,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","suspended"],["id","suspended"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,112).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,112).onTouched()&&t),t}),null,null)),e["ɵdid"](111,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](112,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](114,671744,[[11,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](116,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](117,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](118,0,null,null,1,"label",[["class","custom-control-label"],["for","suspended"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Suspended"])),(l()(),e["ɵand"](16777216,null,null,1,null,$e)),e["ɵdid"](121,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ye)),e["ɵdid"](123,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,lt)),e["ɵdid"](125,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,et)),e["ɵdid"](127,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](128,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](129,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User quota"])),(l()(),e["ɵeld"](131,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](132,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,25,{FormControlNames:1}),e["ɵqud"](603979776,26,{messagesBlock:0}),(l()(),e["ɵeld"](135,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](136,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](137,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","user_quota_enabled"],["id","user_quota_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,139).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,139).onTouched()&&t),t}),null,null)),e["ɵdid"](138,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](139,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](141,671744,[[25,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](143,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](144,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](145,0,null,null,1,"label",[["class","custom-control-label"],["for","user_quota_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵand"](16777216,null,null,1,null,tt)),e["ɵdid"](148,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ot)),e["ɵdid"](150,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,st)),e["ɵdid"](152,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ct)),e["ɵdid"](154,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](155,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](156,0,null,null,1,"legend",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Bucket quota"])),(l()(),e["ɵeld"](158,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](159,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,35,{FormControlNames:1}),e["ɵqud"](603979776,36,{messagesBlock:0}),(l()(),e["ɵeld"](162,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](163,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](164,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","bucket_quota_enabled"],["id","bucket_quota_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,166).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,166).onTouched()&&t),t}),null,null)),e["ɵdid"](165,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](166,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](168,671744,[[35,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](170,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](171,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](172,0,null,null,1,"label",[["class","custom-control-label"],["for","bucket_quota_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵand"](16777216,null,null,1,null,mt)),e["ɵdid"](175,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,pt)),e["ɵdid"](177,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,vt)),e["ɵdid"](179,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ct)),e["ɵdid"](181,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](182,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](183,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](184,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.onSubmit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](185,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](186,0,[""," ",""])),e["ɵppd"](187,1),e["ɵppd"](188,1),(l()(),e["ɵeld"](189,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](190,49152,null,0,Kn.a,[Dl.Location,t.b],null,null)],(function(l,n){var u=n.component;l(n,3,0,u.userForm),l(n,6,0,u.userForm),l(n,14,0);var t=l(n,20,0,!u.editing);l(n,19,0,"cd-col-form-label",t),l(n,24,0,""),l(n,28,0,"uid"),l(n,31,0,"uid"),l(n,33,0,u.userForm.showError("uid",e["ɵnov"](n,3),"required")),l(n,35,0,u.userForm.showError("uid",e["ɵnov"](n,3),"notUnique")),l(n,37,0);var a=l(n,43,0,!u.editing);l(n,42,0,"cd-col-form-label",a),l(n,50,0,"display_name"),l(n,53,0,"display_name"),l(n,55,0,u.userForm.showError("display_name",e["ɵnov"](n,3),"required")),l(n,57,0),l(n,67,0,"email"),l(n,70,0,"email"),l(n,72,0,u.userForm.showError("email",e["ɵnov"](n,3),"email")),l(n,74,0,u.userForm.showError("email",e["ɵnov"](n,3),"notUnique")),l(n,76,0),l(n,86,0,"max_buckets_mode"),l(n,89,0,"max_buckets_mode"),l(n,91,0,"-1"),l(n,92,0,"-1"),l(n,95,0,"0"),l(n,96,0,"0"),l(n,99,0,"1"),l(n,100,0,"1"),l(n,103,0,1==u.userForm.get("max_buckets_mode").value),l(n,105,0),l(n,114,0,"suspended"),l(n,117,0,"suspended"),l(n,121,0,!u.editing),l(n,123,0,u.editing),l(n,125,0,u.editing),l(n,127,0,u.editing),l(n,132,0),l(n,141,0,"user_quota_enabled"),l(n,144,0,"user_quota_enabled"),l(n,148,0,u.userForm.controls.user_quota_enabled.value),l(n,150,0,u.userForm.controls.user_quota_enabled.value&&!u.userForm.getValue("user_quota_max_size_unlimited")),l(n,152,0,u.userForm.controls.user_quota_enabled.value),l(n,154,0,u.userForm.controls.user_quota_enabled.value&&!u.userForm.getValue("user_quota_max_objects_unlimited")),l(n,159,0),l(n,168,0,"bucket_quota_enabled"),l(n,171,0,"bucket_quota_enabled"),l(n,175,0,u.userForm.controls.bucket_quota_enabled.value),l(n,177,0,u.userForm.controls.bucket_quota_enabled.value&&!u.userForm.getValue("bucket_quota_max_size_unlimited")),l(n,179,0,u.userForm.controls.bucket_quota_enabled.value),l(n,181,0,u.userForm.controls.bucket_quota_enabled.value&&!u.userForm.getValue("bucket_quota_max_objects_unlimited")),l(n,185,0,u.userForm)}),(function(l,n){var u=n.component;l(n,1,0,e["ɵnov"](n,5).ngClassUntouched,e["ɵnov"](n,5).ngClassTouched,e["ɵnov"](n,5).ngClassPristine,e["ɵnov"](n,5).ngClassDirty,e["ɵnov"](n,5).ngClassValid,e["ɵnov"](n,5).ngClassInvalid,e["ɵnov"](n,5).ngClassPending);var t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,9,1,l(n,11,0,e["ɵnov"](n.parent,1),u.resource));l(n,9,0,t,a),l(n,13,0,e["ɵnov"](n,14).hasErrors,e["ɵnov"](n,14).hasSuccess),l(n,23,0,u.editing,e["ɵnov"](n,30).ngClassUntouched,e["ɵnov"](n,30).ngClassTouched,e["ɵnov"](n,30).ngClassPristine,e["ɵnov"](n,30).ngClassDirty,e["ɵnov"](n,30).ngClassValid,e["ɵnov"](n,30).ngClassInvalid,e["ɵnov"](n,30).ngClassPending,e["ɵnov"](n,31).validClass,e["ɵnov"](n,31).invalidClass),l(n,36,0,e["ɵnov"](n,37).hasErrors,e["ɵnov"](n,37).hasSuccess),l(n,46,0,e["ɵnov"](n,52).ngClassUntouched,e["ɵnov"](n,52).ngClassTouched,e["ɵnov"](n,52).ngClassPristine,e["ɵnov"](n,52).ngClassDirty,e["ɵnov"](n,52).ngClassValid,e["ɵnov"](n,52).ngClassInvalid,e["ɵnov"](n,52).ngClassPending,e["ɵnov"](n,53).validClass,e["ɵnov"](n,53).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess),l(n,63,0,e["ɵnov"](n,69).ngClassUntouched,e["ɵnov"](n,69).ngClassTouched,e["ɵnov"](n,69).ngClassPristine,e["ɵnov"](n,69).ngClassDirty,e["ɵnov"](n,69).ngClassValid,e["ɵnov"](n,69).ngClassInvalid,e["ɵnov"](n,69).ngClassPending,e["ɵnov"](n,70).validClass,e["ɵnov"](n,70).invalidClass),l(n,75,0,e["ɵnov"](n,76).hasErrors,e["ɵnov"](n,76).hasSuccess),l(n,82,0,e["ɵnov"](n,88).ngClassUntouched,e["ɵnov"](n,88).ngClassTouched,e["ɵnov"](n,88).ngClassPristine,e["ɵnov"](n,88).ngClassDirty,e["ɵnov"](n,88).ngClassValid,e["ɵnov"](n,88).ngClassInvalid,e["ɵnov"](n,88).ngClassPending,e["ɵnov"](n,89).validClass,e["ɵnov"](n,89).invalidClass),l(n,104,0,e["ɵnov"](n,105).hasErrors,e["ɵnov"](n,105).hasSuccess),l(n,110,0,e["ɵnov"](n,116).ngClassUntouched,e["ɵnov"](n,116).ngClassTouched,e["ɵnov"](n,116).ngClassPristine,e["ɵnov"](n,116).ngClassDirty,e["ɵnov"](n,116).ngClassValid,e["ɵnov"](n,116).ngClassInvalid,e["ɵnov"](n,116).ngClassPending,e["ɵnov"](n,117).validClass,e["ɵnov"](n,117).invalidClass),l(n,131,0,e["ɵnov"](n,132).hasErrors,e["ɵnov"](n,132).hasSuccess),l(n,137,0,e["ɵnov"](n,143).ngClassUntouched,e["ɵnov"](n,143).ngClassTouched,e["ɵnov"](n,143).ngClassPristine,e["ɵnov"](n,143).ngClassDirty,e["ɵnov"](n,143).ngClassValid,e["ɵnov"](n,143).ngClassInvalid,e["ɵnov"](n,143).ngClassPending,e["ɵnov"](n,144).validClass,e["ɵnov"](n,144).invalidClass),l(n,158,0,e["ɵnov"](n,159).hasErrors,e["ɵnov"](n,159).hasSuccess),l(n,164,0,e["ɵnov"](n,170).ngClassUntouched,e["ɵnov"](n,170).ngClassTouched,e["ɵnov"](n,170).ngClassPristine,e["ɵnov"](n,170).ngClassDirty,e["ɵnov"](n,170).ngClassValid,e["ɵnov"](n,170).ngClassInvalid,e["ɵnov"](n,170).ngClassPending,e["ɵnov"](n,171).validClass,e["ɵnov"](n,171).invalidClass);var i=e["ɵunv"](n,186,0,l(n,187,0,e["ɵnov"](n.parent,0),u.action)),o=e["ɵunv"](n,186,1,l(n,188,0,e["ɵnov"](n.parent,1),u.resource));l(n,186,0,i,o)}))}function Rt(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵand"](16777216,null,null,1,null,Se)),e["ɵdid"](3,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,De)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,_t)),e["ɵdid"](7,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.editing&&u.loading&&!u.error),l(n,5,0,u.editing&&u.error),l(n,7,0,!u.loading&&!u.error)}),null)}function yt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-user-form",[],null,null,null,Rt,Ve)),e["ɵdid"](1,114688,null,0,W,[_.a,ee.a,ee.m,b.a,sn.b,y.a,El.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var kt=e["ɵccf"]("cd-rgw-user-form",W,yt,{},{},[]),It=u("xSw7"),Et=u("GgAd"),wt=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function qt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-alert-panel",[["size","slim"],["type","warning"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"],size:[1,"size"]},null),(l()(),e["ɵted"](-1,0,["The bucket list data might be stale. If needed, you can manually reload it."]))],(function(l,n){l(n,1,0,"warning","slim")}),null)}function Nt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-usage-bar",[],null,null,null,It.b,It.a)),e["ɵdid"](1,573440,null,0,Et.a,[],{total:[0,"total"],used:[1,"used"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.bucket_quota.max_size,n.parent.context.row.bucket_size)}),null)}function Tt(l){return e["ɵvid"](0,[(l()(),e["ɵted"](-1,null,["No Limit"]))],null,null)}function xt(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Nt)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](0,[["noSizeQuota",2]],null,0,null,Tt))],(function(l,n){l(n,1,0,n.context.row.bucket_quota.max_size>0&&n.context.row.bucket_quota.enabled,e["ɵnov"](n,2))}),null)}function Vt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-usage-bar",[],null,null,null,It.b,It.a)),e["ɵdid"](1,573440,null,0,Et.a,[],{total:[0,"total"],used:[1,"used"],isBinary:[2,"isBinary"]},null)],(function(l,n){l(n,1,0,n.parent.context.row.bucket_quota.max_objects,n.parent.context.row.num_objects,!1)}),null)}function St(l){return e["ɵvid"](0,[(l()(),e["ɵted"](-1,null,["No Limit"]))],null,null)}function Dt(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Vt)),e["ɵdid"](1,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](0,[["noObjectQuota",2]],null,0,null,St))],(function(l,n){l(n,1,0,n.context.row.bucket_quota.max_objects>0&&n.context.row.bucket_quota.enabled,e["ɵnov"](n,2))}),null)}function Ft(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{table:0}),e["ɵqud"](402653184,2,{bucketSizeTpl:0}),e["ɵqud"](402653184,3,{bucketObjectTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,qt)),e["ɵdid"](4,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](5,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","bid"],["selectionType","multiClick"]],null,[[null,"setExpandedRow"],[null,"updateSelection"],[null,"fetchData"]],(function(l,n,u){var e=!0,t=l.component;return"setExpandedRow"===n&&(e=!1!==t.setExpandedRow(u)&&e),"updateSelection"===n&&(e=!1!==t.updateSelection(u)&&e),"fetchData"===n&&(e=!1!==t.getBucketList(u)&&e),e}),nn.b,nn.a)),e["ɵdid"](6,2867200,[[1,4],["table",4]],0,x.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],autoReload:[4,"autoReload"],identifier:[5,"identifier"],selectionType:[6,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](7,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Re.b,Re.a)),e["ɵdid"](8,114688,null,0,ye.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](9,0,null,3,1,"cd-rgw-bucket-details",[["cdTableDetail",""]],null,null,null,Xl,zl)),e["ɵdid"](10,573440,null,0,Ll,[p],{selection:[0,"selection"]},null),(l()(),e["ɵand"](0,[[2,2],["bucketSizeTpl",2]],null,0,null,xt)),(l()(),e["ɵand"](0,[[3,2],["bucketObjectTpl",2]],null,0,null,Dt))],(function(l,n){var u=n.component;l(n,4,0,u.isStale),l(n,6,0,u.buckets,u.columns,"flex",!0,!1,"bid","multiClick"),l(n,8,0,u.permission,u.selection,u.tableActions),l(n,10,0,u.expandedRow)}),null)}function jt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-rgw-bucket-list",[],null,null,null,Ft,wt)),e["ɵprd"](256,null,j.a,B,[]),e["ɵdid"](2,114688,null,0,P,[F.a,S.a,D.a,p,sn.b,El.a,j.a,t.b,e.NgZone,e.ChangeDetectorRef],null,null)],(function(l,n){l(n,2,0)}),null)}var Bt=e["ɵccf"]("cd-rgw-bucket-list",P,jt,{},{},[]),Pt=u("4HWh"),At=u("p4Cf"),Mt=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Ot(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Ne.b,Ne.a)),e["ɵdid"](1,49152,null,0,Te.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading bucket data..."]))],null,null)}function Ut(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,1,{FormControlNames:1}),e["ɵqud"](603979776,2,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","id"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Id"])),(l()(),e["ɵeld"](6,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","id"],["id","id"],["name","id"],["readonly",""],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[1,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,1,0),l(n,11,0,"id"),l(n,14,0,"id")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function Lt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function zt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The value is not valid."]))],null,null)}function Gt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen name is already in use."]))],null,null)}function Kt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function $t(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a user --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Zt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit),l(n,2,0,n.context.$implicit)}),(function(l,n){l(n,3,0,n.context.$implicit)}))}function Qt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Yt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["Loading..."]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Wt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{ngValue:[0,"ngValue"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{ngValue:[0,"ngValue"]},null),(l()(),e["ɵted"](-1,null,["-- Select a placement target --"]))],(function(l,n){l(n,1,0,null),l(n,2,0,null)}),null)}function Jt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,3,"option",[],null,null,null,null,null)),e["ɵdid"](1,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](2,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](3,null,["",""]))],(function(l,n){l(n,1,0,n.context.$implicit.name),l(n,2,0,n.context.$implicit.name)}),(function(l,n){l(n,3,0,n.context.$implicit.description)}))}function Xt(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ht(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,13,"select",[["class","form-control custom-select"],["formControlName","placement-target"],["id","placement-target"],["name","placement-target"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,2).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,2).onTouched()&&t),t}),null,null)),e["ɵdid"](1,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](2,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](4,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](6,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](7,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Yt)),e["ɵdid"](9,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Wt)),e["ɵdid"](11,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Jt)),e["ɵdid"](13,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Xt)),e["ɵdid"](15,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](0,null,null,0))],(function(l,n){var u=n.component;l(n,4,0,"placement-target"),l(n,7,0,"placement-target"),l(n,9,0,null===u.placementTargets),l(n,11,0,null!==u.placementTargets),l(n,13,0,u.placementTargets),l(n,15,0,u.bucketForm.showError("placement-target",e["ɵnov"](n.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,6).ngClassUntouched,e["ɵnov"](n,6).ngClassTouched,e["ɵnov"](n,6).ngClassPristine,e["ɵnov"](n,6).ngClassDirty,e["ɵnov"](n,6).ngClassValid,e["ɵnov"](n,6).ngClassInvalid,e["ɵnov"](n,6).ngClassPending,e["ɵnov"](n,7).validClass,e["ɵnov"](n,7).invalidClass)}))}function la(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,8,null,null,null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,7,"input",[["class","form-control"],["formControlName","placement-target"],["id","placement-target"],["name","placement-target"],["readonly",""],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,3)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,3).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,3)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,3)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](2,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](5,671744,[[7,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](7,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](8,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null)],(function(l,n){l(n,5,0,"placement-target"),l(n,8,0,"placement-target")}),(function(l,n){l(n,1,0,e["ɵnov"](n,7).ngClassUntouched,e["ɵnov"](n,7).ngClassTouched,e["ɵnov"](n,7).ngClassPristine,e["ɵnov"](n,7).ngClassDirty,e["ɵnov"](n,7).ngClassValid,e["ɵnov"](n,7).ngClassInvalid,e["ɵnov"](n,7).ngClassPending,e["ɵnov"](n,8).validClass,e["ɵnov"](n,8).invalidClass)}))}function na(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Versioning"])),(l()(),e["ɵeld"](3,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,9,{FormControlNames:1}),e["ɵqud"](603979776,10,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","versioning"],["id","versioning"],["name","versioning"],["type","checkbox"]],[[8,"checked",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),"change"===n&&(t=!1!==a.updateVersioning()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[9,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","versioning"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](19,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](20,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](21,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables versioning for the objects in the bucket."]))],(function(l,n){l(n,4,0),l(n,13,0,"versioning"),l(n,16,0,"versioning")}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,u.isVersioningEnabled,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function ua(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function ea(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,13,{FormControlNames:1}),e["ɵqud"](603979776,14,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mfa-token-serial"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Token Serial Number"])),(l()(),e["ɵeld"](6,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","mfa-token-serial"],["id","mfa-token-serial"],["name","mfa-token-serial"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[13,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ua)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"mfa-token-serial"),l(n,14,0,"mfa-token-serial"),l(n,16,0,u.bucketForm.showError("mfa-token-serial",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function ta(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function aa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,15,{FormControlNames:1}),e["ɵqud"](603979776,16,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","mfa-token-pin"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Token PIN"])),(l()(),e["ɵeld"](6,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,7,"input",[["class","form-control"],["formControlName","mfa-token-pin"],["id","mfa-token-pin"],["name","mfa-token-pin"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,9)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](11,671744,[[15,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ta)),e["ɵdid"](16,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"mfa-token-pin"),l(n,14,0,"mfa-token-pin"),l(n,16,0,u.bucketForm.showError("mfa-token-pin",e["ɵnov"](n.parent.parent,3),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function ia(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,26,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Multi-Factor Authentication"])),(l()(),e["ɵeld"](3,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](4,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,11,{FormControlNames:1}),e["ɵqud"](603979776,12,{messagesBlock:0}),(l()(),e["ɵeld"](7,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](9,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","mfa-delete"],["id","mfa-delete"],["name","mfa-delete"],["type","checkbox"]],[[8,"checked",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0,a=l.component;return"change"===n&&(t=!1!==e["ɵnov"](l,11).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,11).onTouched()&&t),"change"===n&&(t=!1!==a.updateMfaDelete()&&t),t}),null,null)),e["ɵdid"](10,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](11,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](13,671744,[[11,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](15,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](16,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](17,0,null,null,1,"label",[["class","custom-control-label"],["for","mfa-delete"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Delete enabled"])),(l()(),e["ɵeld"](19,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](20,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](21,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables MFA (multi-factor authentication) Delete, which requires additional authentication for changing the bucket versioning state."])),(l()(),e["ɵand"](16777216,null,null,1,null,ea)),e["ɵdid"](24,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,aa)),e["ɵdid"](26,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,4,0),l(n,13,0,"mfa-delete"),l(n,16,0,"mfa-delete"),l(n,24,0,u.areMfaCredentialsRequired()),l(n,26,0,u.areMfaCredentialsRequired())}),(function(l,n){var u=n.component;l(n,3,0,e["ɵnov"](n,4).hasErrors,e["ɵnov"](n,4).hasSuccess),l(n,9,0,u.isMfaDeleteEnabled,e["ɵnov"](n,15).ngClassUntouched,e["ɵnov"](n,15).ngClassTouched,e["ɵnov"](n,15).ngClassPristine,e["ɵnov"](n,15).ngClassDirty,e["ɵnov"](n,15).ngClassValid,e["ɵnov"](n,15).ngClassInvalid,e["ɵnov"](n,15).ngClassPending,e["ɵnov"](n,16).validClass,e["ɵnov"](n,16).invalidClass)}))}function oa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,19,{FormControlNames:1}),e["ɵqud"](603979776,20,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","lock_mode"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Mode"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,15,"select",[["class","form-control custom-select"],["formControlName","lock_mode"],["id","lock_mode"],["name","lock_mode"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,9).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,9).onTouched()&&t),t}),null,null)),e["ɵdid"](8,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](9,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](11,671744,[[19,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](13,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](14,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](15,0,null,null,3,"option",[["value","COMPLIANCE"]],null,null,null,null,null)),e["ɵdid"](16,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](17,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Compliance"])),(l()(),e["ɵeld"](19,0,null,null,3,"option",[["value","GOVERNANCE"]],null,null,null,null,null)),e["ɵdid"](20,147456,null,0,o.v,[e.ElementRef,e.Renderer2,[2,o.A]],{value:[0,"value"]},null),e["ɵdid"](21,147456,null,0,o.F,[e.ElementRef,e.Renderer2,[8,null]],{value:[0,"value"]},null),(l()(),e["ɵted"](-1,null,["Governance"]))],(function(l,n){l(n,1,0),l(n,11,0,"lock_mode"),l(n,14,0,"lock_mode"),l(n,16,0,"COMPLIANCE"),l(n,17,0,"COMPLIANCE"),l(n,20,0,"GOVERNANCE"),l(n,21,0,"GOVERNANCE")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,7,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,14).validClass,e["ɵnov"](n,14).invalidClass)}))}function sa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be a positive integer."]))],null,null)}function da(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Retention period requires either Days or Years."]))],null,null)}function ra(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,21,{FormControlNames:1}),e["ɵqud"](603979776,22,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,5,"label",[["class","cd-col-form-label"],["for","lock_retention_period_days"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Days"])),(l()(),e["ɵeld"](7,0,null,null,2,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](8,49152,null,0,At.a,[],null,null),(l()(),e["ɵted"](-1,0,["The number of days that you want to specify for the default retention period that will be applied to new objects placed in this bucket."])),(l()(),e["ɵeld"](10,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"input",[["class","form-control"],["formControlName","lock_retention_period_days"],["id","lock_retention_period_days"],["min","0"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,14).onTouched()&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](14,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](16,671744,[[21,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](18,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](19,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,sa)),e["ɵdid"](21,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,da)),e["ɵdid"](23,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,16,0,"lock_retention_period_days"),l(n,19,0,"lock_retention_period_days"),l(n,21,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"pattern")),l(n,23,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"eitherDaysOrYears"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,18).ngClassUntouched,e["ɵnov"](n,18).ngClassTouched,e["ɵnov"](n,18).ngClassPristine,e["ɵnov"](n,18).ngClassDirty,e["ɵnov"](n,18).ngClassValid,e["ɵnov"](n,18).ngClassInvalid,e["ɵnov"](n,18).ngClassPending,e["ɵnov"](n,19).validClass,e["ɵnov"](n,19).invalidClass)}))}function ca(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The entered value must be a positive integer."]))],null,null)}function ma(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Retention period requires either Days or Years."]))],null,null)}function fa(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](1,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,23,{FormControlNames:1}),e["ɵqud"](603979776,24,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,5,"label",[["class","cd-col-form-label"],["for","lock_retention_period_years"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Years"])),(l()(),e["ɵeld"](7,0,null,null,2,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](8,49152,null,0,At.a,[],null,null),(l()(),e["ɵted"](-1,0,["The number of years that you want to specify for the default retention period that will be applied to new objects placed in this bucket."])),(l()(),e["ɵeld"](10,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,8,"input",[["class","form-control"],["formControlName","lock_retention_period_years"],["id","lock_retention_period_years"],["min","0"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,13)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,13).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,13)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,13)._compositionEnd(u.target.value)&&t),"change"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"input"===n&&(t=!1!==e["ɵnov"](l,14).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,14).onTouched()&&t),t}),null,null)),e["ɵdid"](12,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵdid"](14,16384,null,0,o.w,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l,n){return[l,n]}),[o.e,o.w]),e["ɵdid"](16,671744,[[23,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](18,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](19,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ca)),e["ɵdid"](21,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ma)),e["ɵdid"](23,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,16,0,"lock_retention_period_years"),l(n,19,0,"lock_retention_period_years"),l(n,21,0,u.bucketForm.showError("lock_retention_period_days",e["ɵnov"](n.parent,3),"pattern")),l(n,23,0,u.bucketForm.showError("lock_retention_period_years",e["ɵnov"](n.parent,3),"eitherDaysOrYears"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,18).ngClassUntouched,e["ɵnov"](n,18).ngClassTouched,e["ɵnov"](n,18).ngClassPristine,e["ɵnov"](n,18).ngClassDirty,e["ɵnov"](n,18).ngClassValid,e["ɵnov"](n,18).ngClassInvalid,e["ɵnov"](n,18).ngClassPending,e["ɵnov"](n,19).validClass,e["ɵnov"](n,19).invalidClass)}))}function ga(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,118,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,117,"form",[["name","bucketForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var t=!0;return"submit"===n&&(t=!1!==e["ɵnov"](l,3).onSubmit(u)&&t),"reset"===n&&(t=!1!==e["ɵnov"](l,3).onReset()&&t),"submit"===n&&(t=!1!==e["ɵnov"](l,6).onSubmit()&&t),t}),null,null)),e["ɵdid"](2,16384,null,0,o.G,[],null,null),e["ɵdid"](3,540672,[["frm",4]],0,o.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,o.d,null,[o.l]),e["ɵdid"](5,16384,null,0,o.s,[[4,o.d]],null,null),e["ɵdid"](6,16384,null,0,An.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](7,0,null,null,111,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](9,null,[""," ",""])),e["ɵppd"](10,1),e["ɵppd"](11,1),(l()(),e["ɵeld"](12,0,null,null,97,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,Ut)),e["ɵdid"](14,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](15,0,null,null,24,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](16,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,3,{FormControlNames:1}),e["ɵqud"](603979776,4,{messagesBlock:0}),(l()(),e["ɵeld"](19,0,null,0,4,"label",[["class","cd-col-form-label"],["for","bid"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](21,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](22,{required:0}),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](24,0,null,0,15,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](25,0,null,null,8,"input",[["class","form-control"],["formControlName","bid"],["id","bid"],["name","bid"],["placeholder","Name..."],["type","text"]],[[8,"readOnly",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var t=!0;return"input"===n&&(t=!1!==e["ɵnov"](l,28)._handleInput(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,28).onTouched()&&t),"compositionstart"===n&&(t=!1!==e["ɵnov"](l,28)._compositionStart()&&t),"compositionend"===n&&(t=!1!==e["ɵnov"](l,28)._compositionEnd(u.target.value)&&t),t}),null,null)),e["ɵdid"](26,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](27,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](28,16384,null,0,o.e,[e.Renderer2,e.ElementRef,[2,o.b]],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.e]),e["ɵdid"](30,671744,[[3,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](32,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](33,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Lt)),e["ɵdid"](35,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,zt)),e["ɵdid"](37,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Gt)),e["ɵdid"](39,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](40,0,null,null,23,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](41,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,5,{FormControlNames:1}),e["ɵqud"](603979776,6,{messagesBlock:0}),(l()(),e["ɵeld"](44,0,null,0,1,"label",[["class","cd-col-form-label required"],["for","owner"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Owner"])),(l()(),e["ɵeld"](46,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](47,0,null,null,14,"select",[["class","form-control custom-select"],["formControlName","owner"],["id","owner"],["name","owner"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,50).onChange(u.target.value)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,50).onTouched()&&t),t}),null,null)),e["ɵdid"](48,4210688,null,0,Wn.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](49,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](50,16384,null,0,o.A,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.A]),e["ɵdid"](52,671744,[[5,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](54,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](55,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Kt)),e["ɵdid"](57,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,$t)),e["ɵdid"](59,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Zt)),e["ɵdid"](61,278528,null,0,Dl.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Qt)),e["ɵdid"](63,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](64,0,null,null,12,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](65,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,7,{FormControlNames:1}),e["ɵqud"](603979776,8,{messagesBlock:0}),(l()(),e["ɵeld"](68,0,null,0,4,"label",[["class","cd-col-form-label"],["for","placement-target"]],null,null,null,null,null)),e["ɵprd"](512,null,Dl["ɵNgClassImpl"],Dl["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](70,278528,null,0,Dl.NgClass,[Dl["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](71,{required:0}),(l()(),e["ɵted"](-1,null,["Placement target"])),(l()(),e["ɵeld"](73,0,null,0,3,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](0,[["placementTargetSelect",2]],null,0,null,Ht)),(l()(),e["ɵand"](16777216,null,null,1,null,la)),e["ɵdid"](76,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"],ngIfElse:[1,"ngIfElse"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,na)),e["ɵdid"](78,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ia)),e["ɵdid"](80,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](81,0,null,null,28,"fieldset",[],null,null,null,null,null)),(l()(),e["ɵeld"](82,0,null,null,1,"legend",[["class","cd-header"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Locking"])),(l()(),e["ɵeld"](84,0,null,null,19,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Pn.b,Pn.a)),e["ɵdid"](85,1163264,null,2,An.c,[e.ElementRef,An.g],null,null),e["ɵqud"](603979776,17,{FormControlNames:1}),e["ɵqud"](603979776,18,{messagesBlock:0}),(l()(),e["ɵeld"](88,0,null,0,15,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](89,0,null,null,14,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](90,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","lock_enabled"],["id","lock_enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var t=!0;return"change"===n&&(t=!1!==e["ɵnov"](l,92).onChange(u.target.checked)&&t),"blur"===n&&(t=!1!==e["ɵnov"](l,92).onTouched()&&t),t}),null,null)),e["ɵdid"](91,4210688,null,0,Mn.a,[[2,On.a],F.a,e.ElementRef],null,null),e["ɵdid"](92,16384,null,0,o.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,o.p,(function(l){return[l]}),[o.c]),e["ɵdid"](94,671744,[[17,4]],0,o.j,[[3,o.d],[8,null],[8,null],[6,o.p],[2,o.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,o.q,null,[o.j]),e["ɵdid"](96,16384,null,0,o.r,[[4,o.q]],null,null),e["ɵdid"](97,16384,null,0,An.h,[[3,o.d],An.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](98,0,null,null,1,"label",[["class","custom-control-label"],["for","lock_enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"])),(l()(),e["ɵeld"](100,0,null,null,3,"cd-helper",[],null,null,null,Pt.b,Pt.a)),e["ɵdid"](101,49152,null,0,At.a,[],null,null),(l()(),e["ɵeld"](102,0,null,0,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enables locking for the objects in the bucket. Locking can only be enabled while creating a bucket."])),(l()(),e["ɵand"](16777216,null,null,1,null,oa)),e["ɵdid"](105,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ra)),e["ɵdid"](107,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,fa)),e["ɵdid"](109,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](110,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](111,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](112,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),Jn.b,Jn.a)),e["ɵdid"](113,114688,null,0,Xn.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](114,0,[""," ",""])),e["ɵppd"](115,1),e["ɵppd"](116,1),(l()(),e["ɵeld"](117,0,null,null,1,"cd-back-button",[],null,null,null,Gn.b,Gn.a)),e["ɵdid"](118,49152,null,0,Kn.a,[Dl.Location,t.b],null,null)],(function(l,n){var u=n.component;l(n,3,0,u.bucketForm),l(n,6,0,u.bucketForm),l(n,14,0,u.editing),l(n,16,0);var t=l(n,22,0,!u.editing);l(n,21,0,"cd-col-form-label",t),l(n,26,0,!u.editing),l(n,30,0,"bid"),l(n,33,0,"bid"),l(n,35,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"required")),l(n,37,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"bucketNameInvalid")),l(n,39,0,u.bucketForm.showError("bid",e["ɵnov"](n,3),"bucketNameExists")),l(n,41,0),l(n,48,0,u.editing),l(n,52,0,"owner"),l(n,55,0,"owner"),l(n,57,0,null===u.owners),l(n,59,0,null!==u.owners),l(n,61,0,u.owners),l(n,63,0,u.bucketForm.showError("owner",e["ɵnov"](n,3),"required")),l(n,65,0);var a=l(n,71,0,!u.editing);l(n,70,0,"cd-col-form-label",a),l(n,76,0,u.editing,e["ɵnov"](n,74)),l(n,78,0,u.editing),l(n,80,0,u.editing),l(n,85,0),l(n,94,0,"lock_enabled"),l(n,97,0,"lock_enabled"),l(n,105,0,u.bucketForm.getValue("lock_enabled")),l(n,107,0,u.bucketForm.getValue("lock_enabled")),l(n,109,0,u.bucketForm.getValue("lock_enabled")),l(n,113,0,u.bucketForm)}),(function(l,n){var u=n.component;l(n,1,0,e["ɵnov"](n,5).ngClassUntouched,e["ɵnov"](n,5).ngClassTouched,e["ɵnov"](n,5).ngClassPristine,e["ɵnov"](n,5).ngClassDirty,e["ɵnov"](n,5).ngClassValid,e["ɵnov"](n,5).ngClassInvalid,e["ɵnov"](n,5).ngClassPending);var t=e["ɵunv"](n,9,0,l(n,10,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,9,1,l(n,11,0,e["ɵnov"](n.parent,1),u.resource));l(n,9,0,t,a),l(n,15,0,e["ɵnov"](n,16).hasErrors,e["ɵnov"](n,16).hasSuccess),l(n,25,0,u.editing,e["ɵnov"](n,32).ngClassUntouched,e["ɵnov"](n,32).ngClassTouched,e["ɵnov"](n,32).ngClassPristine,e["ɵnov"](n,32).ngClassDirty,e["ɵnov"](n,32).ngClassValid,e["ɵnov"](n,32).ngClassInvalid,e["ɵnov"](n,32).ngClassPending,e["ɵnov"](n,33).validClass,e["ɵnov"](n,33).invalidClass),l(n,40,0,e["ɵnov"](n,41).hasErrors,e["ɵnov"](n,41).hasSuccess),l(n,47,0,e["ɵnov"](n,54).ngClassUntouched,e["ɵnov"](n,54).ngClassTouched,e["ɵnov"](n,54).ngClassPristine,e["ɵnov"](n,54).ngClassDirty,e["ɵnov"](n,54).ngClassValid,e["ɵnov"](n,54).ngClassInvalid,e["ɵnov"](n,54).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,64,0,e["ɵnov"](n,65).hasErrors,e["ɵnov"](n,65).hasSuccess),l(n,84,0,e["ɵnov"](n,85).hasErrors,e["ɵnov"](n,85).hasSuccess),l(n,90,0,e["ɵnov"](n,96).ngClassUntouched,e["ɵnov"](n,96).ngClassTouched,e["ɵnov"](n,96).ngClassPristine,e["ɵnov"](n,96).ngClassDirty,e["ɵnov"](n,96).ngClassValid,e["ɵnov"](n,96).ngClassInvalid,e["ɵnov"](n,96).ngClassPending,e["ɵnov"](n,97).validClass,e["ɵnov"](n,97).invalidClass);var i=e["ɵunv"](n,114,0,l(n,115,0,e["ɵnov"](n.parent,0),u.action)),o=e["ɵunv"](n,114,1,l(n,116,0,e["ɵnov"](n.parent,1),u.resource));l(n,114,0,i,o)}))}function pa(l){return e["ɵvid"](0,[e["ɵpid"](0,Dl.TitleCasePipe,[]),e["ɵpid"](0,jn.a,[]),(l()(),e["ɵand"](16777216,null,null,1,null,Ot)),e["ɵdid"](3,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,ga)),e["ɵdid"](5,16384,null,0,Dl.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,3,0,u.editing&&u.loading&&!u.error),l(n,5,0,!u.loading&&!u.error)}),null)}function va(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-bucket-form",[],null,null,null,pa,Mt)),e["ɵdid"](1,114688,null,0,E,[ee.a,ee.m,_.a,p,v,b.a,y.a,El.a,t.b],null,null)],(function(l,n){l(n,1,0)}),null)}var ba=e["ɵccf"]("cd-rgw-bucket-form",E,va,{},{},[]),ha=u("i4WA"),Ca=u("6qls"),_a=u("tz6c"),Ra=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ya(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,8,"cd-alert-panel",[["type","info"]],null,null,null,Ce.b,Ce.a)),e["ɵdid"](1,114688,null,0,_e.a,[El.a],{type:[0,"type"]},null),(l()(),e["ɵted"](2,0,[" ",""])),(l()(),e["ɵeld"](3,0,null,0,0,"br",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,0,4,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Please consult the "])),(l()(),e["ɵeld"](6,0,null,null,1,"cd-doc",[["section","rgw"]],null,null,null,ha.b,ha.a)),e["ɵdid"](7,114688,null,0,Ca.a,[_a.a,El.a],{section:[0,"section"]},null),(l()(),e["ɵted"](-1,null,[" on how to configure and enable the Object Gateway management functionality."]))],(function(l,n){l(n,1,0,"info"),l(n,7,0,"rgw")}),(function(l,n){l(n,2,0,n.component.message)}))}function ka(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-rgw-501",[],null,null,null,ya,Ra)),e["ɵdid"](1,245760,null,0,i,[ee.a],null,null)],(function(l,n){l(n,1,0)}),null)}var Ia=e["ɵccf"]("cd-rgw-501",i,ka,{},{},[]);u.d(n,"RgwModuleNgFactory",(function(){return Ea})),u.d(n,"RoutedRgwModuleNgFactory",(function(){return wa}));var Ea=e["ɵcmf"](ll,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[rl.a,cl.a,ml.a,fl.a,fl.b,gl.a,pl.a,vl.a,bl.a,hl.a,Cl.a,Ol,ln,Fn,Yn,fu,Iu,ju]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,Dl.NgLocalization,Dl.NgLocaleLocalization,[e.LOCALE_ID,[2,Dl["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,Bu.a,Bu.a,[]),e["ɵmpd"](4608,Pu.a,Pu.a,[]),e["ɵmpd"](4608,Ul.a,Ul.a,[El.a]),e["ɵmpd"](4608,Dl.DatePipe,Dl.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,Au.a,Au.a,[]),e["ɵmpd"](4608,L.a,L.a,[]),e["ɵmpd"](4608,S.a,S.a,[L.a]),e["ɵmpd"](4608,Mu.a,Mu.a,[L.a]),e["ɵmpd"](4608,D.a,D.a,[L.a]),e["ɵmpd"](4608,Ou.a,Ou.a,[]),e["ɵmpd"](4608,Uu.a,Uu.a,[]),e["ɵmpd"](4608,Lu.a,Lu.a,[]),e["ɵmpd"](4608,zu.a,zu.a,[]),e["ɵmpd"](4608,Tl.a,Tl.a,[Dl.DatePipe]),e["ɵmpd"](4608,Gu.a,Gu.a,[]),e["ɵmpd"](4608,Ku.a,Ku.a,[]),e["ɵmpd"](4608,$u.a,$u.a,[]),e["ɵmpd"](4608,Zu.a,Zu.a,[]),e["ɵmpd"](4608,Qu.a,Qu.a,[]),e["ɵmpd"](4608,Yu.a,Yu.a,[El.a]),e["ɵmpd"](4608,jn.a,jn.a,[]),e["ɵmpd"](4608,an.a,an.a,[]),e["ɵmpd"](4608,Wu.a,Wu.a,[]),e["ɵmpd"](4608,o.D,o.D,[]),e["ɵmpd"](4608,o.h,o.h,[]),e["ɵmpd"](4608,Ju.b,Ju.b,[]),e["ɵmpd"](4608,Xu.a,Xu.a,[]),e["ɵmpd"](4608,Hu.a,Hu.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,en.a,en.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,Hu.a,e.ApplicationRef]),e["ɵmpd"](4608,le.c,le.c,[]),e["ɵmpd"](4608,ne.a,ne.a,[]),e["ɵmpd"](4608,sn.b,sn.b,[e.RendererFactory2,en.a]),e["ɵmpd"](4608,ue.y,ue.y,[Dl.DOCUMENT]),e["ɵmpd"](4608,ue.r,ue.r,[]),e["ɵmpd"](4608,ue.a,ue.a,[]),e["ɵmpd"](4608,un.f,un.f,[]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,a.a,a.a,[ee.m,F.a]),e["ɵmpd"](4608,_l.f,_l.f,[]),e["ɵmpd"](1073742336,Dl.CommonModule,Dl.CommonModule,[]),e["ɵmpd"](1073742336,te.a,te.a,[]),e["ɵmpd"](1073742336,o.C,o.C,[]),e["ɵmpd"](1073742336,o.n,o.n,[]),e["ɵmpd"](1073742336,o.y,o.y,[]),e["ɵmpd"](1073742336,Ju.c,Ju.c,[]),e["ɵmpd"](1073742336,Xu.d,Xu.d,[]),e["ɵmpd"](1073742336,le.d,le.d,[]),e["ɵmpd"](1073742336,ne.d,ne.d,[]),e["ɵmpd"](1073742336,ae.b,ae.b,[]),e["ɵmpd"](1073742336,sn.e,sn.e,[]),e["ɵmpd"](1073742336,ie.a,ie.a,[]),e["ɵmpd"](1073742336,un.e,un.e,[]),e["ɵmpd"](1073742336,An.f,An.f,[]),e["ɵmpd"](1073742336,oe.ClickOutsideModule,oe.ClickOutsideModule,[]),e["ɵmpd"](1073742336,se.b,se.b,[]),e["ɵmpd"](1073742336,ee.q,ee.q,[[2,ee.v],[2,ee.m]]),e["ɵmpd"](1073742336,de.a,de.a,[]),e["ɵmpd"](1073742336,ue.u,ue.u,[]),e["ɵmpd"](1073742336,re.a,re.a,[]),e["ɵmpd"](1073742336,g.a,g.a,[]),e["ɵmpd"](1073742336,ce.a,ce.a,[]),e["ɵmpd"](1073742336,me.a,me.a,[]),e["ɵmpd"](1073742336,_l.d,_l.d,[]),e["ɵmpd"](1073742336,ll,ll,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,un.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])})),wa=e["ɵcmf"](dl,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[rl.a,cl.a,ml.a,fl.a,fl.b,gl.a,pl.a,vl.a,bl.a,hl.a,Cl.a,Ol,ln,Fn,Yn,fu,Iu,ju,he,qe,kt,Bt,ba,Ia]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,Dl.NgLocalization,Dl.NgLocaleLocalization,[e.LOCALE_ID,[2,Dl["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,Bu.a,Bu.a,[]),e["ɵmpd"](4608,Pu.a,Pu.a,[]),e["ɵmpd"](4608,Ul.a,Ul.a,[El.a]),e["ɵmpd"](4608,Dl.DatePipe,Dl.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,Au.a,Au.a,[]),e["ɵmpd"](4608,L.a,L.a,[]),e["ɵmpd"](4608,S.a,S.a,[L.a]),e["ɵmpd"](4608,Mu.a,Mu.a,[L.a]),e["ɵmpd"](4608,D.a,D.a,[L.a]),e["ɵmpd"](4608,Ou.a,Ou.a,[]),e["ɵmpd"](4608,Uu.a,Uu.a,[]),e["ɵmpd"](4608,Lu.a,Lu.a,[]),e["ɵmpd"](4608,zu.a,zu.a,[]),e["ɵmpd"](4608,Tl.a,Tl.a,[Dl.DatePipe]),e["ɵmpd"](4608,Gu.a,Gu.a,[]),e["ɵmpd"](4608,Ku.a,Ku.a,[]),e["ɵmpd"](4608,$u.a,$u.a,[]),e["ɵmpd"](4608,Zu.a,Zu.a,[]),e["ɵmpd"](4608,Qu.a,Qu.a,[]),e["ɵmpd"](4608,Yu.a,Yu.a,[El.a]),e["ɵmpd"](4608,jn.a,jn.a,[]),e["ɵmpd"](4608,an.a,an.a,[]),e["ɵmpd"](4608,Wu.a,Wu.a,[]),e["ɵmpd"](4608,o.D,o.D,[]),e["ɵmpd"](4608,o.h,o.h,[]),e["ɵmpd"](4608,Ju.b,Ju.b,[]),e["ɵmpd"](4608,Xu.a,Xu.a,[]),e["ɵmpd"](4608,Hu.a,Hu.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,en.a,en.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,Hu.a,e.ApplicationRef]),e["ɵmpd"](4608,le.c,le.c,[]),e["ɵmpd"](4608,ne.a,ne.a,[]),e["ɵmpd"](4608,sn.b,sn.b,[e.RendererFactory2,en.a]),e["ɵmpd"](4608,ue.y,ue.y,[Dl.DOCUMENT]),e["ɵmpd"](4608,ue.r,ue.r,[]),e["ɵmpd"](4608,ue.a,ue.a,[]),e["ɵmpd"](4608,un.f,un.f,[]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,a.a,a.a,[ee.m,F.a]),e["ɵmpd"](4608,_l.f,_l.f,[]),e["ɵmpd"](1073742336,Dl.CommonModule,Dl.CommonModule,[]),e["ɵmpd"](1073742336,te.a,te.a,[]),e["ɵmpd"](1073742336,o.C,o.C,[]),e["ɵmpd"](1073742336,o.n,o.n,[]),e["ɵmpd"](1073742336,o.y,o.y,[]),e["ɵmpd"](1073742336,Ju.c,Ju.c,[]),e["ɵmpd"](1073742336,Xu.d,Xu.d,[]),e["ɵmpd"](1073742336,le.d,le.d,[]),e["ɵmpd"](1073742336,ne.d,ne.d,[]),e["ɵmpd"](1073742336,ae.b,ae.b,[]),e["ɵmpd"](1073742336,sn.e,sn.e,[]),e["ɵmpd"](1073742336,ie.a,ie.a,[]),e["ɵmpd"](1073742336,un.e,un.e,[]),e["ɵmpd"](1073742336,An.f,An.f,[]),e["ɵmpd"](1073742336,oe.ClickOutsideModule,oe.ClickOutsideModule,[]),e["ɵmpd"](1073742336,se.b,se.b,[]),e["ɵmpd"](1073742336,ee.q,ee.q,[[2,ee.v],[2,ee.m]]),e["ɵmpd"](1073742336,de.a,de.a,[]),e["ɵmpd"](1073742336,ue.u,ue.u,[]),e["ɵmpd"](1073742336,re.a,re.a,[]),e["ɵmpd"](1073742336,g.a,g.a,[]),e["ɵmpd"](1073742336,ce.a,ce.a,[]),e["ɵmpd"](1073742336,me.a,me.a,[]),e["ɵmpd"](1073742336,_l.d,_l.d,[]),e["ɵmpd"](1073742336,ll,ll,[]),e["ɵmpd"](1073742336,dl,dl,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,un.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](1024,ee.k,(function(){return[[{path:"",redirectTo:"daemon",pathMatch:"full"},{path:"daemon",component:O,data:nl},{path:"user",data:ul,children:[{path:"",component:H},{path:"create",component:W,data:el},{path:"edit/:uid",component:W,data:tl}]},{path:"bucket",data:al,children:[{path:"",component:P},{path:"create",component:E,data:il},{path:"edit/:bid",component:E,data:ol}]},{path:"501/:message",component:i,canActivate:[a.a],data:sl}]]}),[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/8.88af57a0fd5b75779391.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/8.88af57a0fd5b75779391.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/8.88af57a0fd5b75779391.js 2020-12-16 17:37:20.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/8.88af57a0fd5b75779391.js 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{DY6s:function(l,n,u){"use strict";u.r(n);var e=u("8Y7J"),o=u("LceX"),a=u("ES0t"),d=u("MdoF"),t=u("Xg1U"),s=u("z5nN"),i=u("iutN"),r=u("pMnS"),c=u("EEJc"),m=u("PEr+"),p=u("a40w"),f=u("hfeG"),v=u("atuK"),g=u("SVse"),h=u("s7LF"),b=u("yT6U"),C=u("4DD9"),R=u("iExv"),w=u("GiVz"),I=u("85J/"),E=u("+0ag"),y=u("aXbf"),N=u("Fgil"),x=u("IzCI"),T=u("o4+5"),k=u("Dwqy"),D=u("uYzU"),S=u("FFMq"),q=u("E2fk"),P=u("a0VL"),F=u("nSDx"),_=u("SB+Q"),V=u("TYzs"),U=u("BQkM"),M=u("dEH0"),L=u("G1/K"),A=u("8xTl"),O=u("TJUb"),j=u("efK2"),B=u("CNMR"),z=u("KOzp"),G=u("2uy1"),Z=u("z/SZ"),K=u("38Bd"),H=u("978R"),X=u("LqlI"),J=u("w9WL"),Y=u("FE24"),Q=u("aexS"),W=u("Avrn"),$=u("iInd"),ll=u("2ZVE"),nl=u("ienR"),ul=u("aHM3"),el=u("9Xeq"),ol=u("hrfs"),al=u("yGOH"),dl=u("+gVj"),tl=u("bxSN"),sl=u("WF9J"),il=u("V/fk"),rl=u("ChqD"),cl=u("pL04"),ml=u("PCNd"),pl=u("pKUh");class fl{constructor(l){this.router=l}ngOnInit(){this.url=this.router.url}navigateTo(l){this.router.navigate([l])}}var vl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function gl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,pl.b,pl.a)),e["ɵdid"](1,180224,null,0,ll.e,[ll.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,1,"tab",[["heading","Users"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],[[null,"selectTab"]],(function(l,n,u){var e=!0;return"selectTab"===n&&(e=!1!==l.component.navigateTo("/user-management/users")&&e),e}),null,null)),e["ɵdid"](3,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"],active:[1,"active"]},{selectTab:"selectTab"}),(l()(),e["ɵeld"](4,0,null,0,1,"tab",[["heading","Roles"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],[[null,"selectTab"]],(function(l,n,u){var e=!0;return"selectTab"===n&&(e=!1!==l.component.navigateTo("/user-management/roles")&&e),e}),null,null)),e["ɵdid"](5,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"],active:[1,"active"]},{selectTab:"selectTab"})],(function(l,n){var u=n.component;l(n,3,0,"Users","/user-management/users"===u.url),l(n,5,0,"Roles","/user-management/roles"===u.url)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby),l(n,4,0,e["ɵnov"](n,5).id,e["ɵnov"](n,5).active,e["ɵnov"](n,5).addClass,e["ɵnov"](n,5).role,e["ɵnov"](n,5).ariaLabelledby)}))}var hl=u("25BL"),bl=u("uIqm"),Cl=u("NUGo"),Rl=u("S7zO"),wl=u("EgGo"),Il=u("ZEkX"),El=u("Mxhz"),yl=u("9nlD"),Nl=u("sne2"),xl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Tl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" ",""," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit,n.context.last?"":", ")}))}function kl(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Tl)),e["ɵdid"](1,278528,null,0,g.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,n.context.value)}),null)}function Dl(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{userRolesTpl:0}),(l()(),e["ɵeld"](1,0,null,null,1,"cd-user-tabs",[],null,null,null,gl,vl)),e["ɵdid"](2,114688,null,0,fl,[$.m],null,null),(l()(),e["ɵeld"](3,0,null,null,3,"cd-table",[["columnMode","flex"],["identifier","username"],["selectionType","single"]],null,[[null,"fetchData"],[null,"updateSelection"]],(function(l,n,u){var e=!0,o=l.component;return"fetchData"===n&&(e=!1!==o.getUsers()&&e),"updateSelection"===n&&(e=!1!==o.updateSelection(u)&&e),e}),hl.b,hl.a)),e["ɵdid"](4,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],identifier:[3,"identifier"],selectionType:[4,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection"}),(l()(),e["ɵeld"](5,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Cl.b,Cl.a)),e["ɵdid"](6,114688,null,0,Rl.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵand"](0,[[1,2],["userRolesTpl",2]],null,0,null,kl))],(function(l,n){var u=n.component;l(n,2,0),l(n,4,0,u.users,u.columns,"flex","username","single"),l(n,6,0,u.permission,u.selection,u.tableActions)}),null)}function Sl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-user-list",[],null,null,null,Dl,xl)),e["ɵprd"](256,null,wl.a,Il.b,[]),e["ɵdid"](2,114688,null,0,Il.a,[El.a,F.a,X.b,yl.a,Q.a,w.a,wl.a,P.a,Nl.b],null,null)],(function(l,n){l(n,2,0)}),null)}var ql=e["ɵccf"]("cd-user-list",Il.a,Sl,{},{},[]),Pl=u("QC43"),Fl=u("XFyV"),_l=u("4HWh"),Vl=u("p4Cf"),Ul=u("mXUL"),Ml=u("ANnk"),Ll=u("f/UV"),Al=u("D4zM"),Ol=u("pYKc"),jl=u("ppaS"),Bl=u("IZUe"),zl=u("gp3X"),Gl=u("sb0X"),Zl=u("KVJa"),Kl=u("Z21x"),Hl=u("V3my"),Xl=u("DSvg"),Jl=u("SgmB"),Yl=u("1nQr"),Ql=u("2EZI"),Wl=u("20UP"),$l=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ln(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Pl.b,Pl.a)),e["ɵdid"](1,49152,null,0,Fl.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading..."]))],null,null)}function nn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function un(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The username already exists."]))],null,null)}function en(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-helper",[["class","text-pre"]],null,null,null,_l.b,_l.a)),e["ɵdid"](1,49152,null,0,Vl.a,[],{class:[0,"class"],html:[1,"html"]},null)],(function(l,n){l(n,1,0,"text-pre",e["ɵinlineInterpolate"](1,"",n.component.passwordPolicyHelpText,""))}),null)}function on(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function an(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.passwordValuation)}))}function dn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,27,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,4,{FormControlNames:1}),e["ɵqud"](603979776,5,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","password"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password"])),(l()(),e["ɵand"](16777216,null,null,1,null,en)),e["ɵdid"](8,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](9,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,11,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","password"],["id","password"],["name","password"],["placeholder","Password..."],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,12)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,12).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,12)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,12)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](12,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](14,671744,[[4,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](16,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](17,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](18,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,21).onClick()&&o),o}),null,null)),e["ɵdid"](21,81920,null,0,Al.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"div",[["class","password-strength-level"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,0,"div",[["data-toggle","tooltip"]],[[8,"className",0],[8,"title",0]],null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,on)),e["ɵdid"](25,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,an)),e["ɵdid"](27,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,8,0,u.passwordPolicyHelpText.length>0),l(n,14,0,"password"),l(n,18,0,"password"),l(n,21,0,"password"),l(n,25,0,u.userForm.showError("password",e["ɵnov"](n.parent,2),"required")),l(n,27,0,u.userForm.showError("password",e["ɵnov"](n.parent,2),"passwordPolicy"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,16).ngClassUntouched,e["ɵnov"](n,16).ngClassTouched,e["ɵnov"](n,16).ngClassPristine,e["ɵnov"](n,16).ngClassDirty,e["ɵnov"](n,16).ngClassValid,e["ɵnov"](n,16).ngClassInvalid,e["ɵnov"](n,16).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass),l(n,23,0,e["ɵinlineInterpolate"](1,"",u.passwordStrengthLevelClass,""),e["ɵinlineInterpolate"](1,"",u.passwordValuation,""))}))}function tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password confirmation doesn't match the password."]))],null,null)}function sn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,6,{FormControlNames:1}),e["ɵqud"](603979776,7,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","confirmpassword"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Confirm password"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","confirmpassword"],["id","confirmpassword"],["name","confirmpassword"],["placeholder","Confirm password..."],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,9).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,9)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](9,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](11,671744,[[6,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](13,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](14,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](15,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","confirmpassword"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,18).onClick()&&o),o}),null,null)),e["ɵdid"](18,81920,null,0,Al.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,tn)),e["ɵdid"](20,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,sn)),e["ɵdid"](22,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"confirmpassword"),l(n,15,0,"confirmpassword"),l(n,18,0,"confirmpassword"),l(n,20,0,u.userForm.showError("confirmpassword",e["ɵnov"](n.parent,2),"match")),l(n,22,0,u.userForm.showError("confirmpassword",e["ɵnov"](n.parent,2),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"cd-helper",[["class","text-pre"]],null,null,null,_l.b,_l.a)),e["ɵdid"](1,49152,null,0,Vl.a,[],{class:[0,"class"]},null),(l()(),e["ɵeld"](2,0,null,0,4,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,[" The Dashboard setting defining the expiration interval of passwords is currently set to "])),(l()(),e["ɵeld"](4,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["0"])),(l()(),e["ɵted"](-1,null,[". This means if a date is set, the user password will only expire once. "])),(l()(),e["ɵeld"](7,0,null,0,5,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,[" Consider configuring the Dashboard setting "])),(l()(),e["ɵeld"](9,0,null,null,2,"a",[["class","alert-link"],["routerLink","/mgr-modules/edit/dashboard"]],[[1,"target",0],[8,"href",4]],[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,10).onClick(u.button,u.ctrlKey,u.metaKey,u.shiftKey)&&o),o}),null,null)),e["ɵdid"](10,671744,null,0,$.p,[$.m,$.a,g.LocationStrategy],{routerLink:[0,"routerLink"]},null),(l()(),e["ɵted"](-1,null,["USER_PWD_EXPIRATION_SPAN"])),(l()(),e["ɵted"](-1,null,[" in order to let passwords expire periodically. "]))],(function(l,n){l(n,1,0,"text-pre"),l(n,10,0,"/mgr-modules/edit/dashboard")}),(function(l,n){l(n,9,0,e["ɵnov"](n,10).target,e["ɵnov"](n,10).href)}))}function mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,29,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,8,{FormControlNames:1}),e["ɵqud"](603979776,9,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,7,"label",[["class","cd-col-form-label"],["for","pwdExpirationDate"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵeld"](8,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password expiration date"])),(l()(),e["ɵand"](16777216,null,null,1,null,cn)),e["ɵdid"](11,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](12,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,16,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](14,16777216,null,null,10,"input",[["bsDatepicker",""],["class","form-control"],["formControlName","pwdExpirationDate"],["id","pwdExpirationDate"],["name","pwdExpirationDate"],["placeholder","Password expiration date..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"],[null,"keyup.esc"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,15)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,15).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,15)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,15)._compositionEnd(u.target.value)&&o),"change"===n&&(o=!1!==e["ɵnov"](l,17).onChange(u)&&o),"keyup.esc"===n&&(o=!1!==e["ɵnov"](l,17).hide()&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,17).onBlur()&&o),o}),null,null)),e["ɵdid"](15,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵdid"](16,737280,null,0,nl.c,[nl.a,e.ElementRef,e.Renderer2,e.ViewContainerRef,Z.a],{bsConfig:[0,"bsConfig"],minDate:[1,"minDate"]},null),e["ɵdid"](17,16384,null,0,nl.f,[nl.c,nl.l,e.Renderer2,e.ElementRef,e.ChangeDetectorRef],null,null),e["ɵprd"](1024,null,h.o,(function(l){return[l]}),[nl.f]),e["ɵprd"](1024,null,h.p,(function(l,n){return[l,n]}),[h.e,nl.f]),e["ɵdid"](20,671744,[[8,4]],0,h.j,[[3,h.d],[6,h.o],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](22,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](23,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](24,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](25,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](26,0,null,null,1,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.clearExpirationDate()&&e),e}),null,null)),(l()(),e["ɵeld"](27,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,mn)),e["ɵdid"](29,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var o=l(n,7,0,u.pwdExpirationSettings.pwdExpirationSpan>0);l(n,6,0,"cd-col-form-label",o),l(n,11,0,0==u.pwdExpirationSettings.pwdExpirationSpan),l(n,16,0,u.bsConfig,u.minDate),l(n,20,0,"pwdExpirationDate"),l(n,24,0,"pwdExpirationDate"),l(n,29,0,u.userForm.showError("pwdExpirationDate",e["ɵnov"](n.parent,2),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,14,0,e["ɵnov"](n,22).ngClassUntouched,e["ɵnov"](n,22).ngClassTouched,e["ɵnov"](n,22).ngClassPristine,e["ɵnov"](n,22).ngClassDirty,e["ɵnov"](n,22).ngClassValid,e["ɵnov"](n,22).ngClassInvalid,e["ɵnov"](n,22).ngClassPending,e["ɵnov"](n,24).validClass,e["ɵnov"](n,24).invalidClass),l(n,27,0,e["ɵinlineInterpolate"](1,"icon-prepend ",u.icons.destroy,""))}))}function fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Invalid email."]))],null,null)}function vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border full-height"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"cd-select-badges",[],null,null,null,Ol.b,Ol.a)),e["ɵdid"](2,49152,null,0,jl.a,[w.a],{data:[0,"data"],options:[1,"options"],messages:[2,"messages"]},null)],(function(l,n){var u=n.component;l(n,2,0,u.userForm.controls.roles.value,u.allRoles,u.messages)}),null)}function gn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,16,{FormControlNames:1}),e["ɵqud"](603979776,17,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","enabled"],["id","enabled"],["name","enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var o=!0;return"change"===n&&(o=!1!==e["ɵnov"](l,7).onChange(u.target.checked)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,7).onTouched()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.c]),e["ɵdid"](9,671744,[[16,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](11,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](12,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"]))],(function(l,n){l(n,1,0),l(n,9,0,"enabled"),l(n,13,0,"enabled")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,11).ngClassUntouched,e["ɵnov"](n,11).ngClassTouched,e["ɵnov"](n,11).ngClassPristine,e["ɵnov"](n,11).ngClassDirty,e["ɵnov"](n,11).ngClassValid,e["ɵnov"](n,11).ngClassInvalid,e["ɵnov"](n,11).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function hn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,18,{FormControlNames:1}),e["ɵqud"](603979776,19,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","pwdUpdateRequired"],["id","pwdUpdateRequired"],["name","pwdUpdateRequired"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var o=!0;return"change"===n&&(o=!1!==e["ɵnov"](l,7).onChange(u.target.checked)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,7).onTouched()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.c]),e["ɵdid"](9,671744,[[18,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](11,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](12,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","pwdUpdateRequired"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User must change password at next logon"]))],(function(l,n){l(n,1,0),l(n,9,0,"pwdUpdateRequired"),l(n,13,0,"pwdUpdateRequired")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,11).ngClassUntouched,e["ɵnov"](n,11).ngClassTouched,e["ɵnov"](n,11).ngClassPristine,e["ɵnov"](n,11).ngClassDirty,e["ɵnov"](n,11).ngClassValid,e["ɵnov"](n,11).ngClassInvalid,e["ɵnov"](n,11).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function bn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,94,"form",[["name","userForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var o=!0;return"submit"===n&&(o=!1!==e["ɵnov"](l,2).onSubmit(u)&&o),"reset"===n&&(o=!1!==e["ɵnov"](l,2).onReset()&&o),"submit"===n&&(o=!1!==e["ɵnov"](l,5).onSubmit()&&o),o}),null,null)),e["ɵdid"](1,16384,null,0,h.G,[],null,null),e["ɵdid"](2,540672,[["formDir",4]],0,h.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,h.d,null,[h.l]),e["ɵdid"](4,16384,null,0,h.s,[[4,h.d]],null,null),e["ɵdid"](5,16384,null,0,dl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](6,0,null,null,88,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](8,null,[""," ",""])),e["ɵppd"](9,1),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,74,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](13,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,2,{FormControlNames:1}),e["ɵqud"](603979776,3,{messagesBlock:0}),(l()(),e["ɵeld"](16,0,null,0,4,"label",[["class","cd-col-form-label"],["for","username"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](19,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](21,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,8,"input",[["autocomplete","off"],["autofocus",""],["class","form-control"],["formControlName","username"],["id","username"],["name","username"],["placeholder","Username..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,23)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,23).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,23)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,23)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](23,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](25,671744,[[2,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](27,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](28,4210688,null,0,Bl.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](29,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](30,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,nn)),e["ɵdid"](32,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,un)),e["ɵdid"](34,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,dn)),e["ɵdid"](36,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,rn)),e["ɵdid"](38,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,pn)),e["ɵdid"](40,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](42,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,10,{FormControlNames:1}),e["ɵqud"](603979776,11,{messagesBlock:0}),(l()(),e["ɵeld"](45,0,null,0,1,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](47,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](48,0,null,null,7,"input",[["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Full name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,49)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,49).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,49)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,49)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](49,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](51,671744,[[10,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](53,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](54,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](55,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](56,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](57,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,12,{FormControlNames:1}),e["ɵqud"](603979776,13,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"],["for","email"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email"])),(l()(),e["ɵeld"](62,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,7,"input",[["class","form-control"],["formControlName","email"],["id","email"],["name","email"],["placeholder","Email..."],["type","email"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,64)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,64).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,64)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,64)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](64,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](66,671744,[[12,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](68,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](69,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](70,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,fn)),e["ɵdid"](72,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](73,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](74,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,14,{FormControlNames:1}),e["ɵqud"](603979776,15,{messagesBlock:0}),(l()(),e["ɵeld"](77,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Roles"])),(l()(),e["ɵeld"](79,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,vn)),e["ɵdid"](81,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gn)),e["ɵdid"](83,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,hn)),e["ɵdid"](85,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](86,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](87,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](88,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),zl.b,zl.a)),e["ɵdid"](89,114688,null,0,Gl.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](90,0,[""," ",""])),e["ɵppd"](91,1),e["ɵppd"](92,1),(l()(),e["ɵeld"](93,0,null,null,1,"cd-back-button",[],null,null,null,Zl.b,Zl.a)),e["ɵdid"](94,49152,null,0,Kl.a,[g.Location,Nl.b],null,null)],(function(l,n){var u=n.component;l(n,2,0,u.userForm),l(n,5,0,u.userForm),l(n,13,0);var o=l(n,19,0,u.mode!==u.userFormMode.editing);l(n,18,0,"cd-col-form-label",o),l(n,25,0,"username"),l(n,28,0,""),l(n,30,0,"username"),l(n,32,0,u.userForm.showError("username",e["ɵnov"](n,2),"required")),l(n,34,0,u.userForm.showError("username",e["ɵnov"](n,2),"notUnique")),l(n,36,0,!u.authStorageService.isSSO()),l(n,38,0,!u.authStorageService.isSSO()),l(n,40,0,!u.authStorageService.isSSO()),l(n,42,0),l(n,51,0,"name"),l(n,55,0,"name"),l(n,57,0),l(n,66,0,"email"),l(n,70,0,"email"),l(n,72,0,u.userForm.showError("email",e["ɵnov"](n,2),"email")),l(n,74,0),l(n,81,0,u.allRoles),l(n,83,0,!u.isCurrentUser()),l(n,85,0,!u.isCurrentUser()&&!u.authStorageService.isSSO()),l(n,89,0,e["ɵnov"](n,2))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,4).ngClassUntouched,e["ɵnov"](n,4).ngClassTouched,e["ɵnov"](n,4).ngClassPristine,e["ɵnov"](n,4).ngClassDirty,e["ɵnov"](n,4).ngClassValid,e["ɵnov"](n,4).ngClassInvalid,e["ɵnov"](n,4).ngClassPending);var o=e["ɵunv"](n,8,0,l(n,9,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,8,1,l(n,10,0,e["ɵnov"](n.parent,1),u.resource));l(n,8,0,o,a),l(n,12,0,e["ɵnov"](n,13).hasErrors,e["ɵnov"](n,13).hasSuccess),l(n,22,0,e["ɵnov"](n,27).ngClassUntouched,e["ɵnov"](n,27).ngClassTouched,e["ɵnov"](n,27).ngClassPristine,e["ɵnov"](n,27).ngClassDirty,e["ɵnov"](n,27).ngClassValid,e["ɵnov"](n,27).ngClassInvalid,e["ɵnov"](n,27).ngClassPending,e["ɵnov"](n,30).validClass,e["ɵnov"](n,30).invalidClass),l(n,41,0,e["ɵnov"](n,42).hasErrors,e["ɵnov"](n,42).hasSuccess),l(n,48,0,e["ɵnov"](n,53).ngClassUntouched,e["ɵnov"](n,53).ngClassTouched,e["ɵnov"](n,53).ngClassPristine,e["ɵnov"](n,53).ngClassDirty,e["ɵnov"](n,53).ngClassValid,e["ɵnov"](n,53).ngClassInvalid,e["ɵnov"](n,53).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess),l(n,63,0,e["ɵnov"](n,68).ngClassUntouched,e["ɵnov"](n,68).ngClassTouched,e["ɵnov"](n,68).ngClassPristine,e["ɵnov"](n,68).ngClassDirty,e["ɵnov"](n,68).ngClassValid,e["ɵnov"](n,68).ngClassInvalid,e["ɵnov"](n,68).ngClassPending,e["ɵnov"](n,70).validClass,e["ɵnov"](n,70).invalidClass),l(n,73,0,e["ɵnov"](n,74).hasErrors,e["ɵnov"](n,74).hasSuccess);var d=e["ɵunv"](n,90,0,l(n,91,0,e["ɵnov"](n.parent,0),u.action)),t=e["ɵunv"](n,90,1,l(n,92,0,e["ɵnov"](n.parent,1),u.resource));l(n,90,0,d,t)}))}function Cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"p",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,['You are about to remove "user read / update" permissions from your own user.'])),(l()(),e["ɵeld"](3,0,null,null,0,"br",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["If you continue, you will no longer be able to add or remove roles from any user."])),(l()(),e["ɵeld"](6,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Are you sure you want to continue?"]))],null,null)}function Rn(l){return e["ɵvid"](0,[e["ɵpid"](0,g.TitleCasePipe,[]),e["ɵpid"](0,A.a,[]),e["ɵqud"](402653184,1,{removeSelfUserReadUpdatePermissionTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,ln)),e["ɵdid"](4,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](5,0,null,null,2,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,bn)),e["ɵdid"](7,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](0,[[1,2],["removeSelfUserReadUpdatePermissionTpl",2]],null,0,null,Cn))],(function(l,n){var u=n.component;l(n,4,0,!u.pwdExpirationSettings),l(n,7,0,u.pwdExpirationSettings)}),null)}function wn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-user-form",[],null,null,null,Rn,$l)),e["ɵdid"](1,114688,null,0,Hl.a,[Xl.a,Q.a,$.a,$.m,X.b,Jl.a,El.a,yl.a,w.a,Nl.b,Yl.a,Ql.a,Wl.a],null,null)],(function(l,n){l(n,1,0)}),null)}var In=e["ɵccf"]("cd-user-form",Hl.a,wn,{},{},[]),En=u("LvDl"),yn=u("x38r");class Nn{constructor(l){this.i18n=l,this.scopes_permissions=[]}ngOnInit(){this.columns=[{prop:"scope",name:this.i18n("Scope"),flexGrow:2},{prop:"read",name:this.i18n("Read"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"create",name:this.i18n("Create"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"update",name:this.i18n("Update"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"delete",name:this.i18n("Delete"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon}]}ngOnChanges(){if(this.selection){this.selectedItem=this.selection;const l=[];En.each(this.scopes,n=>{const u={read:!1,create:!1,update:!1,delete:!1};u.scope=n,n in this.selectedItem.scopes_permissions&&En.each(this.selectedItem.scopes_permissions[n],l=>{u[l]=!0}),l.push(u)}),this.scopes_permissions=l}}}var xn=e["ɵcrt"]({encapsulation:0,styles:[["thead[_ngcontent-%COMP%]{background-color:#f5f5f5}.fa[_ngcontent-%COMP%]{font-size:large}.fa.fa-square-o[_ngcontent-%COMP%]{color:#d1d1d1}"]],data:{}});function Tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,pl.b,pl.a)),e["ɵdid"](1,180224,null,0,ll.e,[ll.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,hl.b,hl.a)),e["ɵdid"](5,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],toolHeader:[3,"toolHeader"],footer:[4,"footer"],limit:[5,"limit"],autoReload:[6,"autoReload"],autoSave:[7,"autoSave"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.scopes_permissions,u.columns,"flex",!1,!1,0,!1,!1)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function kn(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Tn)),e["ɵdid"](1,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,1,0,n.component.selection)}),null)}var Dn=u("n/D3"),Sn=u("ZDA6"),qn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-user-tabs",[],null,null,null,gl,vl)),e["ɵdid"](1,114688,null,0,fl,[$.m],null,null),(l()(),e["ɵeld"](2,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","name"],["selectionType","single"]],null,[[null,"setExpandedRow"],[null,"fetchData"],[null,"updateSelection"]],(function(l,n,u){var e=!0,o=l.component;return"setExpandedRow"===n&&(e=!1!==o.setExpandedRow(u)&&e),"fetchData"===n&&(e=!1!==o.getRoles()&&e),"updateSelection"===n&&(e=!1!==o.updateSelection(u)&&e),e}),hl.b,hl.a)),e["ɵdid"](3,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],identifier:[4,"identifier"],selectionType:[5,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Cl.b,Cl.a)),e["ɵdid"](5,114688,null,0,Rl.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](6,0,null,3,1,"cd-role-details",[["cdTableDetail",""]],null,null,null,kn,xn)),e["ɵdid"](7,638976,null,0,Nn,[w.a],{selection:[0,"selection"],scopes:[1,"scopes"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,3,0,u.roles,u.columns,"flex",!0,"name","single"),l(n,5,0,u.permission,u.selection,u.tableActions),l(n,7,0,u.expandedRow,u.scopes)}),null)}function Fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-role-list",[],null,null,null,Pn,qn)),e["ɵprd"](256,null,wl.a,Dn.b,[]),e["ɵdid"](2,114688,null,0,Dn.a,[Jl.a,Sn.a,F.a,Q.a,X.b,yl.a,w.a,wl.a,Nl.b],null,null)],(function(l,n){l(n,2,0)}),null)}var _n=e["ɵccf"]("cd-role-list",Dn.a,Fn,{},{},[]),Vn=u("eTJe"),Un=e["ɵcrt"]({encapsulation:0,styles:[[".datatable-permissions-header-cell-label[_ngcontent-%COMP%], .datatable-permissions-scope-cell-label[_ngcontent-%COMP%]{font-weight:700}"]],data:{}});function Mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ln(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen name is already in use."]))],null,null)}function An(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"checked",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickCellCheckbox(l.context.row.scope,l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,1,"label",[["class","datatable-permissions-scope-cell-label custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),e["ɵted"](5,null,["",""]))],null,(function(l,n){var u=n.component;l(n,1,0,e["ɵinlineInterpolate"](1,"scope_",n.context.row.scope,""),u.isRowChecked(n.context.row.scope),e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,e["ɵinlineInterpolate"](1,"scope_",n.context.row.scope,"")),l(n,5,0,n.context.value)}))}function On(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"checked",0],[8,"id",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickCellCheckbox(l.context.row.scope,l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,0,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null))],null,(function(l,n){l(n,1,0,n.context.value,n.context.row.scope+"-"+n.context.column.prop,e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,n.context.row.scope+"-"+n.context.column.prop)}))}function jn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"checked",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickHeaderCheckbox(l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,1,"label",[["class","datatable-permissions-header-cell-label custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),e["ɵted"](5,null,["",""]))],null,(function(l,n){var u=n.component;l(n,1,0,e["ɵinlineInterpolate"](1,"header_",n.context.column.prop,""),u.isHeaderChecked(n.context.column.prop),e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,e["ɵinlineInterpolate"](1,"header_",n.context.column.prop,"")),l(n,5,0,n.context.column.name)}))}function Bn(l){return e["ɵvid"](0,[e["ɵpid"](0,g.TitleCasePipe,[]),e["ɵpid"](0,A.a,[]),e["ɵqud"](402653184,1,{headerPermissionCheckboxTpl:0}),e["ɵqud"](402653184,2,{cellScopeCheckboxTpl:0}),e["ɵqud"](402653184,3,{cellPermissionCheckboxTpl:0}),(l()(),e["ɵeld"](5,0,null,null,68,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,67,"form",[["name","roleForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var o=!0;return"submit"===n&&(o=!1!==e["ɵnov"](l,8).onSubmit(u)&&o),"reset"===n&&(o=!1!==e["ɵnov"](l,8).onReset()&&o),"submit"===n&&(o=!1!==e["ɵnov"](l,11).onSubmit()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.G,[],null,null),e["ɵdid"](8,540672,[["formDir",4]],0,h.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,h.d,null,[h.l]),e["ɵdid"](10,16384,null,0,h.s,[[4,h.d]],null,null),e["ɵdid"](11,16384,null,0,dl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](12,0,null,null,61,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](14,null,[""," ",""])),e["ɵppd"](15,1),e["ɵppd"](16,1),(l()(),e["ɵeld"](17,0,null,null,47,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](18,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](19,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,4,{FormControlNames:1}),e["ɵqud"](603979776,5,{messagesBlock:0}),(l()(),e["ɵeld"](22,0,null,0,4,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](24,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](25,{required:0}),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](27,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](28,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,29)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,29).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,29)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,29)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](29,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](31,671744,[[4,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](33,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](34,4210688,null,0,Bl.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](35,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](36,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Mn)),e["ɵdid"](38,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ln)),e["ɵdid"](40,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](42,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,6,{FormControlNames:1}),e["ɵqud"](603979776,7,{messagesBlock:0}),(l()(),e["ɵeld"](45,0,null,0,1,"label",[["class","cd-col-form-label"],["for","description"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Description"])),(l()(),e["ɵeld"](47,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](48,0,null,null,7,"input",[["class","form-control"],["formControlName","description"],["id","description"],["name","description"],["placeholder","Description..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,49)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,49).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,49)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,49)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](49,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](51,671744,[[6,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](53,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](54,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](55,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](56,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](57,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,8,{FormControlNames:1}),e["ɵqud"](603979776,9,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permissions"])),(l()(),e["ɵeld"](62,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,hl.b,hl.a)),e["ɵdid"](64,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],toolHeader:[3,"toolHeader"],footer:[4,"footer"],limit:[5,"limit"],autoReload:[6,"autoReload"],autoSave:[7,"autoSave"]},null),(l()(),e["ɵeld"](65,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](66,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](67,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),zl.b,zl.a)),e["ɵdid"](68,114688,null,0,Gl.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](69,0,[""," ",""])),e["ɵppd"](70,1),e["ɵppd"](71,1),(l()(),e["ɵeld"](72,0,null,null,1,"cd-back-button",[],null,null,null,Zl.b,Zl.a)),e["ɵdid"](73,49152,null,0,Kl.a,[g.Location,Nl.b],null,null),(l()(),e["ɵand"](0,[[2,2],["cellScopeCheckboxTpl",2]],null,0,null,An)),(l()(),e["ɵand"](0,[[3,2],["cellPermissionCheckboxTpl",2]],null,0,null,On)),(l()(),e["ɵand"](0,[[1,2],["headerPermissionCheckboxTpl",2]],null,0,null,jn))],(function(l,n){var u=n.component;l(n,8,0,u.roleForm),l(n,11,0,u.roleForm),l(n,19,0);var o=l(n,25,0,u.mode!==u.roleFormMode.editing);l(n,24,0,"cd-col-form-label",o),l(n,31,0,"name"),l(n,34,0,""),l(n,36,0,"name"),l(n,38,0,u.roleForm.showError("name",e["ɵnov"](n,8),"required")),l(n,40,0,u.roleForm.showError("name",e["ɵnov"](n,8),"notUnique")),l(n,42,0),l(n,51,0,"description"),l(n,55,0,"description"),l(n,57,0),l(n,64,0,u.scopes_permissions,u.columns,"flex",!1,!1,0,!1,!1),l(n,68,0,e["ɵnov"](n,8))}),(function(l,n){var u=n.component;l(n,6,0,e["ɵnov"](n,10).ngClassUntouched,e["ɵnov"](n,10).ngClassTouched,e["ɵnov"](n,10).ngClassPristine,e["ɵnov"](n,10).ngClassDirty,e["ɵnov"](n,10).ngClassValid,e["ɵnov"](n,10).ngClassInvalid,e["ɵnov"](n,10).ngClassPending);var o=e["ɵunv"](n,14,0,l(n,15,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,14,1,l(n,16,0,e["ɵnov"](n,1),u.resource));l(n,14,0,o,a),l(n,18,0,e["ɵnov"](n,19).hasErrors,e["ɵnov"](n,19).hasSuccess),l(n,28,0,e["ɵnov"](n,33).ngClassUntouched,e["ɵnov"](n,33).ngClassTouched,e["ɵnov"](n,33).ngClassPristine,e["ɵnov"](n,33).ngClassDirty,e["ɵnov"](n,33).ngClassValid,e["ɵnov"](n,33).ngClassInvalid,e["ɵnov"](n,33).ngClassPending,e["ɵnov"](n,36).validClass,e["ɵnov"](n,36).invalidClass),l(n,41,0,e["ɵnov"](n,42).hasErrors,e["ɵnov"](n,42).hasSuccess),l(n,48,0,e["ɵnov"](n,53).ngClassUntouched,e["ɵnov"](n,53).ngClassTouched,e["ɵnov"](n,53).ngClassPristine,e["ɵnov"](n,53).ngClassDirty,e["ɵnov"](n,53).ngClassValid,e["ɵnov"](n,53).ngClassInvalid,e["ɵnov"](n,53).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess);var d=e["ɵunv"](n,69,0,l(n,70,0,e["ɵnov"](n,0),u.action)),t=e["ɵunv"](n,69,1,l(n,71,0,e["ɵnov"](n,1),u.resource));l(n,69,0,d,t)}))}function zn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-role-form",[],null,null,null,Bn,Un)),e["ɵdid"](1,114688,null,0,Vn.a,[$.a,$.m,Jl.a,Sn.a,yl.a,w.a,Nl.b],null,null)],(function(l,n){l(n,1,0)}),null)}var Gn=e["ɵccf"]("cd-role-form",Vn.a,zn,{},{},[]);u.d(n,"AuthModuleNgFactory",(function(){return Zn})),u.d(n,"RoutedAuthModuleNgFactory",(function(){return Kn}));var Zn=e["ɵcmf"](o.a,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[a.a,d.a,t.a,s.a,s.b,i.a,r.a,c.a,m.a,p.a,f.a,v.a,v.c,v.b,v.d]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,g.NgLocalization,g.NgLocaleLocalization,[e.LOCALE_ID,[2,g["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,h.D,h.D,[]),e["ɵmpd"](4608,h.h,h.h,[]),e["ɵmpd"](4608,b.a,b.a,[]),e["ɵmpd"](4608,C.a,C.a,[]),e["ɵmpd"](4608,R.a,R.a,[w.a]),e["ɵmpd"](4608,g.DatePipe,g.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,I.a,I.a,[]),e["ɵmpd"](4608,E.a,E.a,[]),e["ɵmpd"](4608,y.a,y.a,[]),e["ɵmpd"](4608,N.a,N.a,[y.a]),e["ɵmpd"](4608,x.a,x.a,[y.a]),e["ɵmpd"](4608,T.a,T.a,[y.a]),e["ɵmpd"](4608,k.a,k.a,[]),e["ɵmpd"](4608,D.a,D.a,[]),e["ɵmpd"](4608,S.a,S.a,[]),e["ɵmpd"](4608,q.a,q.a,[]),e["ɵmpd"](4608,P.a,P.a,[g.DatePipe]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,_.a,_.a,[]),e["ɵmpd"](4608,V.a,V.a,[]),e["ɵmpd"](4608,U.a,U.a,[]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,L.a,L.a,[w.a]),e["ɵmpd"](4608,A.a,A.a,[]),e["ɵmpd"](4608,O.a,O.a,[]),e["ɵmpd"](4608,j.a,j.a,[]),e["ɵmpd"](4608,B.b,B.b,[]),e["ɵmpd"](4608,z.a,z.a,[]),e["ɵmpd"](4608,G.a,G.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,Z.a,Z.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,G.a,e.ApplicationRef]),e["ɵmpd"](4608,K.c,K.c,[]),e["ɵmpd"](4608,H.a,H.a,[]),e["ɵmpd"](4608,X.b,X.b,[e.RendererFactory2,Z.a]),e["ɵmpd"](4608,J.y,J.y,[g.DOCUMENT]),e["ɵmpd"](4608,J.r,J.r,[]),e["ɵmpd"](4608,J.a,J.a,[]),e["ɵmpd"](4608,Y.f,Y.f,[]),e["ɵmpd"](4608,Q.a,Q.a,[]),e["ɵmpd"](4608,W.a,W.a,[$.m,Q.a]),e["ɵmpd"](4608,ll.f,ll.f,[]),e["ɵmpd"](4608,nl.t,nl.t,[]),e["ɵmpd"](4608,nl.v,nl.v,[]),e["ɵmpd"](4608,nl.a,nl.a,[]),e["ɵmpd"](4608,nl.h,nl.h,[]),e["ɵmpd"](4608,nl.d,nl.d,[]),e["ɵmpd"](4608,nl.j,nl.j,[]),e["ɵmpd"](4608,nl.l,nl.l,[]),e["ɵmpd"](4608,nl.u,nl.u,[nl.v,nl.l]),e["ɵmpd"](1073742336,ul.a,ul.a,[]),e["ɵmpd"](1073742336,g.CommonModule,g.CommonModule,[]),e["ɵmpd"](1073742336,h.C,h.C,[]),e["ɵmpd"](1073742336,h.n,h.n,[]),e["ɵmpd"](1073742336,z.d,z.d,[]),e["ɵmpd"](1073742336,h.y,h.y,[]),e["ɵmpd"](1073742336,el.a,el.a,[]),e["ɵmpd"](1073742336,B.c,B.c,[]),e["ɵmpd"](1073742336,K.d,K.d,[]),e["ɵmpd"](1073742336,H.d,H.d,[]),e["ɵmpd"](1073742336,ol.b,ol.b,[]),e["ɵmpd"](1073742336,X.e,X.e,[]),e["ɵmpd"](1073742336,al.a,al.a,[]),e["ɵmpd"](1073742336,Y.e,Y.e,[]),e["ɵmpd"](1073742336,dl.f,dl.f,[]),e["ɵmpd"](1073742336,tl.ClickOutsideModule,tl.ClickOutsideModule,[]),e["ɵmpd"](1073742336,sl.b,sl.b,[]),e["ɵmpd"](1073742336,$.q,$.q,[[2,$.v],[2,$.m]]),e["ɵmpd"](1073742336,il.a,il.a,[]),e["ɵmpd"](1073742336,J.u,J.u,[]),e["ɵmpd"](1073742336,rl.a,rl.a,[]),e["ɵmpd"](1073742336,cl.a,cl.a,[]),e["ɵmpd"](1073742336,ml.a,ml.a,[]),e["ɵmpd"](1073742336,ll.d,ll.d,[]),e["ɵmpd"](1073742336,nl.g,nl.g,[]),e["ɵmpd"](1073742336,o.a,o.a,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,Y.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])})),Kn=e["ɵcmf"](o.b,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[a.a,d.a,t.a,s.a,s.b,i.a,r.a,c.a,m.a,p.a,f.a,v.a,v.c,v.b,v.d,ql,In,_n,Gn]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,g.NgLocalization,g.NgLocaleLocalization,[e.LOCALE_ID,[2,g["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,h.D,h.D,[]),e["ɵmpd"](4608,h.h,h.h,[]),e["ɵmpd"](4608,b.a,b.a,[]),e["ɵmpd"](4608,C.a,C.a,[]),e["ɵmpd"](4608,R.a,R.a,[w.a]),e["ɵmpd"](4608,g.DatePipe,g.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,I.a,I.a,[]),e["ɵmpd"](4608,E.a,E.a,[]),e["ɵmpd"](4608,y.a,y.a,[]),e["ɵmpd"](4608,N.a,N.a,[y.a]),e["ɵmpd"](4608,x.a,x.a,[y.a]),e["ɵmpd"](4608,T.a,T.a,[y.a]),e["ɵmpd"](4608,k.a,k.a,[]),e["ɵmpd"](4608,D.a,D.a,[]),e["ɵmpd"](4608,S.a,S.a,[]),e["ɵmpd"](4608,q.a,q.a,[]),e["ɵmpd"](4608,P.a,P.a,[g.DatePipe]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,_.a,_.a,[]),e["ɵmpd"](4608,V.a,V.a,[]),e["ɵmpd"](4608,U.a,U.a,[]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,L.a,L.a,[w.a]),e["ɵmpd"](4608,A.a,A.a,[]),e["ɵmpd"](4608,O.a,O.a,[]),e["ɵmpd"](4608,j.a,j.a,[]),e["ɵmpd"](4608,B.b,B.b,[]),e["ɵmpd"](4608,z.a,z.a,[]),e["ɵmpd"](4608,G.a,G.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,Z.a,Z.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,G.a,e.ApplicationRef]),e["ɵmpd"](4608,K.c,K.c,[]),e["ɵmpd"](4608,H.a,H.a,[]),e["ɵmpd"](4608,X.b,X.b,[e.RendererFactory2,Z.a]),e["ɵmpd"](4608,J.y,J.y,[g.DOCUMENT]),e["ɵmpd"](4608,J.r,J.r,[]),e["ɵmpd"](4608,J.a,J.a,[]),e["ɵmpd"](4608,Y.f,Y.f,[]),e["ɵmpd"](4608,Q.a,Q.a,[]),e["ɵmpd"](4608,W.a,W.a,[$.m,Q.a]),e["ɵmpd"](4608,ll.f,ll.f,[]),e["ɵmpd"](4608,nl.t,nl.t,[]),e["ɵmpd"](4608,nl.v,nl.v,[]),e["ɵmpd"](4608,nl.a,nl.a,[]),e["ɵmpd"](4608,nl.h,nl.h,[]),e["ɵmpd"](4608,nl.d,nl.d,[]),e["ɵmpd"](4608,nl.j,nl.j,[]),e["ɵmpd"](4608,nl.l,nl.l,[]),e["ɵmpd"](4608,nl.u,nl.u,[nl.v,nl.l]),e["ɵmpd"](1073742336,ul.a,ul.a,[]),e["ɵmpd"](1073742336,g.CommonModule,g.CommonModule,[]),e["ɵmpd"](1073742336,h.C,h.C,[]),e["ɵmpd"](1073742336,h.n,h.n,[]),e["ɵmpd"](1073742336,z.d,z.d,[]),e["ɵmpd"](1073742336,h.y,h.y,[]),e["ɵmpd"](1073742336,el.a,el.a,[]),e["ɵmpd"](1073742336,B.c,B.c,[]),e["ɵmpd"](1073742336,K.d,K.d,[]),e["ɵmpd"](1073742336,H.d,H.d,[]),e["ɵmpd"](1073742336,ol.b,ol.b,[]),e["ɵmpd"](1073742336,X.e,X.e,[]),e["ɵmpd"](1073742336,al.a,al.a,[]),e["ɵmpd"](1073742336,Y.e,Y.e,[]),e["ɵmpd"](1073742336,dl.f,dl.f,[]),e["ɵmpd"](1073742336,tl.ClickOutsideModule,tl.ClickOutsideModule,[]),e["ɵmpd"](1073742336,sl.b,sl.b,[]),e["ɵmpd"](1073742336,$.q,$.q,[[2,$.v],[2,$.m]]),e["ɵmpd"](1073742336,il.a,il.a,[]),e["ɵmpd"](1073742336,J.u,J.u,[]),e["ɵmpd"](1073742336,rl.a,rl.a,[]),e["ɵmpd"](1073742336,cl.a,cl.a,[]),e["ɵmpd"](1073742336,ml.a,ml.a,[]),e["ɵmpd"](1073742336,ll.d,ll.d,[]),e["ɵmpd"](1073742336,nl.g,nl.g,[]),e["ɵmpd"](1073742336,o.a,o.a,[]),e["ɵmpd"](1073742336,o.b,o.b,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,Y.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](1024,$.k,(function(){return[[{path:"",redirectTo:"users",pathMatch:"full"},{path:"users",data:o.c,children:[{path:"",component:Il.a},{path:"create",component:Hl.a,data:o.d},{path:"edit/:username",component:Hl.a,data:o.e}]},{path:"roles",data:o.f,children:[{path:"",component:Dn.a},{path:"create",component:Vn.a,data:o.g},{path:"edit/:name",component:Vn.a,data:o.h}]}]]}),[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/8.a5d6e73e48ae0cf89ca6.js ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/8.a5d6e73e48ae0cf89ca6.js --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/8.a5d6e73e48ae0cf89ca6.js 1970-01-01 00:00:00.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/8.a5d6e73e48ae0cf89ca6.js 2021-04-19 13:53:42.000000000 +0000 @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{DY6s:function(l,n,u){"use strict";u.r(n);var e=u("8Y7J"),o=u("LceX"),a=u("ES0t"),d=u("MdoF"),t=u("Xg1U"),s=u("z5nN"),i=u("iutN"),r=u("pMnS"),c=u("EEJc"),m=u("PEr+"),p=u("a40w"),f=u("hfeG"),v=u("atuK"),g=u("SVse"),h=u("s7LF"),b=u("yT6U"),C=u("4DD9"),R=u("iExv"),w=u("GiVz"),I=u("85J/"),E=u("+0ag"),y=u("aXbf"),N=u("Fgil"),x=u("IzCI"),T=u("o4+5"),k=u("Dwqy"),D=u("uYzU"),S=u("FFMq"),q=u("E2fk"),P=u("a0VL"),F=u("nSDx"),_=u("SB+Q"),V=u("TYzs"),U=u("BQkM"),M=u("dEH0"),L=u("G1/K"),A=u("8xTl"),O=u("TJUb"),j=u("efK2"),B=u("CNMR"),z=u("KOzp"),G=u("2uy1"),Z=u("z/SZ"),K=u("38Bd"),H=u("978R"),X=u("LqlI"),J=u("w9WL"),Y=u("FE24"),Q=u("aexS"),W=u("Avrn"),$=u("iInd"),ll=u("2ZVE"),nl=u("ienR"),ul=u("aHM3"),el=u("9Xeq"),ol=u("hrfs"),al=u("yGOH"),dl=u("+gVj"),tl=u("bxSN"),sl=u("WF9J"),il=u("V/fk"),rl=u("ChqD"),cl=u("pL04"),ml=u("PCNd"),pl=u("pKUh");class fl{constructor(l){this.router=l}ngOnInit(){this.url=this.router.url}navigateTo(l){this.router.navigate([l])}}var vl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function gl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,pl.b,pl.a)),e["ɵdid"](1,180224,null,0,ll.e,[ll.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,1,"tab",[["heading","Users"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],[[null,"selectTab"]],(function(l,n,u){var e=!0;return"selectTab"===n&&(e=!1!==l.component.navigateTo("/user-management/users")&&e),e}),null,null)),e["ɵdid"](3,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"],active:[1,"active"]},{selectTab:"selectTab"}),(l()(),e["ɵeld"](4,0,null,0,1,"tab",[["heading","Roles"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],[[null,"selectTab"]],(function(l,n,u){var e=!0;return"selectTab"===n&&(e=!1!==l.component.navigateTo("/user-management/roles")&&e),e}),null,null)),e["ɵdid"](5,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"],active:[1,"active"]},{selectTab:"selectTab"})],(function(l,n){var u=n.component;l(n,3,0,"Users","/user-management/users"===u.url),l(n,5,0,"Roles","/user-management/roles"===u.url)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby),l(n,4,0,e["ɵnov"](n,5).id,e["ɵnov"](n,5).active,e["ɵnov"](n,5).addClass,e["ɵnov"](n,5).role,e["ɵnov"](n,5).ariaLabelledby)}))}var hl=u("25BL"),bl=u("uIqm"),Cl=u("NUGo"),Rl=u("S7zO"),wl=u("EgGo"),Il=u("ZEkX"),El=u("Mxhz"),yl=u("9nlD"),Nl=u("sne2"),xl=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Tl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" ",""," "]))],null,(function(l,n){l(n,1,0,n.context.$implicit,n.context.last?"":", ")}))}function kl(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Tl)),e["ɵdid"](1,278528,null,0,g.NgForOf,[e.ViewContainerRef,e.TemplateRef,e.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(l()(),e["ɵand"](0,null,null,0))],(function(l,n){l(n,1,0,n.context.value)}),null)}function Dl(l){return e["ɵvid"](0,[e["ɵqud"](402653184,1,{userRolesTpl:0}),(l()(),e["ɵeld"](1,0,null,null,1,"cd-user-tabs",[],null,null,null,gl,vl)),e["ɵdid"](2,114688,null,0,fl,[$.m],null,null),(l()(),e["ɵeld"](3,0,null,null,3,"cd-table",[["columnMode","flex"],["identifier","username"],["selectionType","single"]],null,[[null,"fetchData"],[null,"updateSelection"]],(function(l,n,u){var e=!0,o=l.component;return"fetchData"===n&&(e=!1!==o.getUsers()&&e),"updateSelection"===n&&(e=!1!==o.updateSelection(u)&&e),e}),hl.b,hl.a)),e["ɵdid"](4,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],identifier:[3,"identifier"],selectionType:[4,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection"}),(l()(),e["ɵeld"](5,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Cl.b,Cl.a)),e["ɵdid"](6,114688,null,0,Rl.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵand"](0,[[1,2],["userRolesTpl",2]],null,0,null,kl))],(function(l,n){var u=n.component;l(n,2,0),l(n,4,0,u.users,u.columns,"flex","username","single"),l(n,6,0,u.permission,u.selection,u.tableActions)}),null)}function Sl(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-user-list",[],null,null,null,Dl,xl)),e["ɵprd"](256,null,wl.a,Il.b,[]),e["ɵdid"](2,114688,null,0,Il.a,[El.a,F.a,X.b,yl.a,Q.a,w.a,wl.a,P.a,Nl.b],null,null)],(function(l,n){l(n,2,0)}),null)}var ql=e["ɵccf"]("cd-user-list",Il.a,Sl,{},{},[]),Pl=u("QC43"),Fl=u("XFyV"),_l=u("4HWh"),Vl=u("p4Cf"),Ul=u("mXUL"),Ml=u("ANnk"),Ll=u("f/UV"),Al=u("D4zM"),Ol=u("pYKc"),jl=u("ppaS"),Bl=u("IZUe"),zl=u("gp3X"),Gl=u("sb0X"),Zl=u("KVJa"),Kl=u("Z21x"),Hl=u("V3my"),Xl=u("DSvg"),Jl=u("SgmB"),Yl=u("1nQr"),Ql=u("2EZI"),Wl=u("20UP"),$l=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function ln(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-loading-panel",[],null,null,null,Pl.b,Pl.a)),e["ɵdid"](1,49152,null,0,Fl.a,[],null,null),(l()(),e["ɵted"](-1,0,["Loading..."]))],null,null)}function nn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function un(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The username already exists."]))],null,null)}function en(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-helper",[["class","text-pre-wrap"]],null,null,null,_l.b,_l.a)),e["ɵdid"](1,49152,null,0,Vl.a,[],{class:[0,"class"],html:[1,"html"]},null)],(function(l,n){l(n,1,0,"text-pre-wrap",e["ɵinlineInterpolate"](1,"",n.component.passwordPolicyHelpText,""))}),null)}function on(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function an(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](1,null,[" "," "]))],null,(function(l,n){l(n,1,0,n.component.passwordValuation)}))}function dn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,27,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,4,{FormControlNames:1}),e["ɵqud"](603979776,5,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,4,"label",[["class","cd-col-form-label"],["for","password"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password"])),(l()(),e["ɵand"](16777216,null,null,1,null,en)),e["ɵdid"](8,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](9,0,null,0,18,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](10,0,null,null,11,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](11,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","password"],["id","password"],["name","password"],["placeholder","Password..."],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,12)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,12).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,12)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,12)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](12,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](14,671744,[[4,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](16,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](17,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](18,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](19,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](20,0,null,null,1,"button",[["cdPasswordButton","password"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,21).onClick()&&o),o}),null,null)),e["ɵdid"](21,81920,null,0,Al.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵeld"](22,0,null,null,1,"div",[["class","password-strength-level"]],null,null,null,null,null)),(l()(),e["ɵeld"](23,0,null,null,0,"div",[["data-toggle","tooltip"]],[[8,"className",0],[8,"title",0]],null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,on)),e["ɵdid"](25,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,an)),e["ɵdid"](27,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,8,0,u.passwordPolicyHelpText.length>0),l(n,14,0,"password"),l(n,18,0,"password"),l(n,21,0,"password"),l(n,25,0,u.userForm.showError("password",e["ɵnov"](n.parent,2),"required")),l(n,27,0,u.userForm.showError("password",e["ɵnov"](n.parent,2),"passwordPolicy"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,11,0,e["ɵnov"](n,16).ngClassUntouched,e["ɵnov"](n,16).ngClassTouched,e["ɵnov"](n,16).ngClassPristine,e["ɵnov"](n,16).ngClassDirty,e["ɵnov"](n,16).ngClassValid,e["ɵnov"](n,16).ngClassInvalid,e["ɵnov"](n,16).ngClassPending,e["ɵnov"](n,18).validClass,e["ɵnov"](n,18).invalidClass),l(n,23,0,e["ɵinlineInterpolate"](1,"",u.passwordStrengthLevelClass,""),e["ɵinlineInterpolate"](1,"",u.passwordValuation,""))}))}function tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password confirmation doesn't match the password."]))],null,null)}function sn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function rn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,6,{FormControlNames:1}),e["ɵqud"](603979776,7,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,1,"label",[["class","cd-col-form-label"],["for","confirmpassword"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Confirm password"])),(l()(),e["ɵeld"](6,0,null,0,16,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,13,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](8,0,null,null,7,"input",[["autocomplete","new-password"],["class","form-control"],["formControlName","confirmpassword"],["id","confirmpassword"],["name","confirmpassword"],["placeholder","Confirm password..."],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,9)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,9).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,9)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,9)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](9,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](11,671744,[[6,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](13,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](14,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](15,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](16,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](17,0,null,null,1,"button",[["cdPasswordButton","confirmpassword"],["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,18).onClick()&&o),o}),null,null)),e["ɵdid"](18,81920,null,0,Al.a,[e.ElementRef,e.Renderer2],{cdPasswordButton:[0,"cdPasswordButton"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,tn)),e["ɵdid"](20,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,sn)),e["ɵdid"](22,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,11,0,"confirmpassword"),l(n,15,0,"confirmpassword"),l(n,18,0,"confirmpassword"),l(n,20,0,u.userForm.showError("confirmpassword",e["ɵnov"](n.parent,2),"match")),l(n,22,0,u.userForm.showError("confirmpassword",e["ɵnov"](n.parent,2),"required"))}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,8,0,e["ɵnov"](n,13).ngClassUntouched,e["ɵnov"](n,13).ngClassTouched,e["ɵnov"](n,13).ngClassPristine,e["ɵnov"](n,13).ngClassDirty,e["ɵnov"](n,13).ngClassValid,e["ɵnov"](n,13).ngClassInvalid,e["ɵnov"](n,13).ngClassPending,e["ɵnov"](n,15).validClass,e["ɵnov"](n,15).invalidClass)}))}function cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,12,"cd-helper",[["class","text-pre-wrap"]],null,null,null,_l.b,_l.a)),e["ɵdid"](1,49152,null,0,Vl.a,[],{class:[0,"class"]},null),(l()(),e["ɵeld"](2,0,null,0,4,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,[" The Dashboard setting defining the expiration interval of passwords is currently set to "])),(l()(),e["ɵeld"](4,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["0"])),(l()(),e["ɵted"](-1,null,[". This means if a date is set, the user password will only expire once. "])),(l()(),e["ɵeld"](7,0,null,0,5,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,[" Consider configuring the Dashboard setting "])),(l()(),e["ɵeld"](9,0,null,null,2,"a",[["class","alert-link"],["routerLink","/mgr-modules/edit/dashboard"]],[[1,"target",0],[8,"href",4]],[[null,"click"]],(function(l,n,u){var o=!0;return"click"===n&&(o=!1!==e["ɵnov"](l,10).onClick(u.button,u.ctrlKey,u.metaKey,u.shiftKey)&&o),o}),null,null)),e["ɵdid"](10,671744,null,0,$.p,[$.m,$.a,g.LocationStrategy],{routerLink:[0,"routerLink"]},null),(l()(),e["ɵted"](-1,null,["USER_PWD_EXPIRATION_SPAN"])),(l()(),e["ɵted"](-1,null,[" in order to let passwords expire periodically. "]))],(function(l,n){l(n,1,0,"text-pre-wrap"),l(n,10,0,"/mgr-modules/edit/dashboard")}),(function(l,n){l(n,9,0,e["ɵnov"](n,10).target,e["ɵnov"](n,10).href)}))}function mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,29,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,8,{FormControlNames:1}),e["ɵqud"](603979776,9,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,7,"label",[["class","cd-col-form-label"],["for","pwdExpirationDate"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](6,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](7,{required:0}),(l()(),e["ɵeld"](8,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Password expiration date"])),(l()(),e["ɵand"](16777216,null,null,1,null,cn)),e["ɵdid"](11,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](12,0,null,0,17,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,16,"div",[["class","input-group"]],null,null,null,null,null)),(l()(),e["ɵeld"](14,16777216,null,null,10,"input",[["bsDatepicker",""],["class","form-control"],["formControlName","pwdExpirationDate"],["id","pwdExpirationDate"],["name","pwdExpirationDate"],["placeholder","Password expiration date..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"],[null,"keyup.esc"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,15)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,15).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,15)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,15)._compositionEnd(u.target.value)&&o),"change"===n&&(o=!1!==e["ɵnov"](l,17).onChange(u)&&o),"keyup.esc"===n&&(o=!1!==e["ɵnov"](l,17).hide()&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,17).onBlur()&&o),o}),null,null)),e["ɵdid"](15,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵdid"](16,737280,null,0,nl.c,[nl.a,e.ElementRef,e.Renderer2,e.ViewContainerRef,Z.a],{bsConfig:[0,"bsConfig"],minDate:[1,"minDate"]},null),e["ɵdid"](17,16384,null,0,nl.f,[nl.c,nl.l,e.Renderer2,e.ElementRef,e.ChangeDetectorRef],null,null),e["ɵprd"](1024,null,h.o,(function(l){return[l]}),[nl.f]),e["ɵprd"](1024,null,h.p,(function(l,n){return[l,n]}),[h.e,nl.f]),e["ɵdid"](20,671744,[[8,4]],0,h.j,[[3,h.d],[6,h.o],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](22,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](23,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](24,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](25,0,null,null,2,"span",[["class","input-group-append"]],null,null,null,null,null)),(l()(),e["ɵeld"](26,0,null,null,1,"button",[["class","btn btn-light"],["type","button"]],null,[[null,"click"]],(function(l,n,u){var e=!0;return"click"===n&&(e=!1!==l.component.clearExpirationDate()&&e),e}),null,null)),(l()(),e["ɵeld"](27,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,mn)),e["ɵdid"](29,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){var u=n.component;l(n,1,0);var o=l(n,7,0,u.pwdExpirationSettings.pwdExpirationSpan>0);l(n,6,0,"cd-col-form-label",o),l(n,11,0,0==u.pwdExpirationSettings.pwdExpirationSpan),l(n,16,0,u.bsConfig,u.minDate),l(n,20,0,"pwdExpirationDate"),l(n,24,0,"pwdExpirationDate"),l(n,29,0,u.userForm.showError("pwdExpirationDate",e["ɵnov"](n.parent,2),"required"))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,14,0,e["ɵnov"](n,22).ngClassUntouched,e["ɵnov"](n,22).ngClassTouched,e["ɵnov"](n,22).ngClassPristine,e["ɵnov"](n,22).ngClassDirty,e["ɵnov"](n,22).ngClassValid,e["ɵnov"](n,22).ngClassInvalid,e["ɵnov"](n,22).ngClassPending,e["ɵnov"](n,24).validClass,e["ɵnov"](n,24).invalidClass),l(n,27,0,e["ɵinlineInterpolate"](1,"icon-prepend ",u.icons.destroy,""))}))}function fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Invalid email."]))],null,null)}function vn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"span",[["class","no-border full-height"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"cd-select-badges",[],null,null,null,Ol.b,Ol.a)),e["ɵdid"](2,49152,null,0,jl.a,[w.a],{data:[0,"data"],options:[1,"options"],messages:[2,"messages"]},null)],(function(l,n){var u=n.component;l(n,2,0,u.userForm.controls.roles.value,u.allRoles,u.messages)}),null)}function gn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,16,{FormControlNames:1}),e["ɵqud"](603979776,17,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","enabled"],["id","enabled"],["name","enabled"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var o=!0;return"change"===n&&(o=!1!==e["ɵnov"](l,7).onChange(u.target.checked)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,7).onTouched()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.c]),e["ɵdid"](9,671744,[[16,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](11,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](12,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","enabled"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Enabled"]))],(function(l,n){l(n,1,0),l(n,9,0,"enabled"),l(n,13,0,"enabled")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,11).ngClassUntouched,e["ɵnov"](n,11).ngClassTouched,e["ɵnov"](n,11).ngClassPristine,e["ɵnov"](n,11).ngClassDirty,e["ɵnov"](n,11).ngClassValid,e["ɵnov"](n,11).ngClassInvalid,e["ɵnov"](n,11).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function hn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,15,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](1,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,18,{FormControlNames:1}),e["ɵqud"](603979776,19,{messagesBlock:0}),(l()(),e["ɵeld"](4,0,null,0,11,"div",[["class","cd-col-form-offset"]],null,null,null,null,null)),(l()(),e["ɵeld"](5,0,null,null,10,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,7,"input",[["class","custom-control-input"],["formControlName","pwdUpdateRequired"],["id","pwdUpdateRequired"],["name","pwdUpdateRequired"],["type","checkbox"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"],[null,"blur"]],(function(l,n,u){var o=!0;return"change"===n&&(o=!1!==e["ɵnov"](l,7).onChange(u.target.checked)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,7).onTouched()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.c,[e.Renderer2,e.ElementRef],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.c]),e["ɵdid"](9,671744,[[18,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](11,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](12,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](13,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](14,0,null,null,1,"label",[["class","custom-control-label"],["for","pwdUpdateRequired"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["User must change password at next logon"]))],(function(l,n){l(n,1,0),l(n,9,0,"pwdUpdateRequired"),l(n,13,0,"pwdUpdateRequired")}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).hasErrors,e["ɵnov"](n,1).hasSuccess),l(n,6,0,e["ɵnov"](n,11).ngClassUntouched,e["ɵnov"](n,11).ngClassTouched,e["ɵnov"](n,11).ngClassPristine,e["ɵnov"](n,11).ngClassDirty,e["ɵnov"](n,11).ngClassValid,e["ɵnov"](n,11).ngClassInvalid,e["ɵnov"](n,11).ngClassPending,e["ɵnov"](n,13).validClass,e["ɵnov"](n,13).invalidClass)}))}function bn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,94,"form",[["name","userForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var o=!0;return"submit"===n&&(o=!1!==e["ɵnov"](l,2).onSubmit(u)&&o),"reset"===n&&(o=!1!==e["ɵnov"](l,2).onReset()&&o),"submit"===n&&(o=!1!==e["ɵnov"](l,5).onSubmit()&&o),o}),null,null)),e["ɵdid"](1,16384,null,0,h.G,[],null,null),e["ɵdid"](2,540672,[["formDir",4]],0,h.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,h.d,null,[h.l]),e["ɵdid"](4,16384,null,0,h.s,[[4,h.d]],null,null),e["ɵdid"](5,16384,null,0,dl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](6,0,null,null,88,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](7,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](8,null,[""," ",""])),e["ɵppd"](9,1),e["ɵppd"](10,1),(l()(),e["ɵeld"](11,0,null,null,74,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](12,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](13,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,2,{FormControlNames:1}),e["ɵqud"](603979776,3,{messagesBlock:0}),(l()(),e["ɵeld"](16,0,null,0,4,"label",[["class","cd-col-form-label"],["for","username"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](18,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](19,{required:0}),(l()(),e["ɵted"](-1,null,["Username"])),(l()(),e["ɵeld"](21,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](22,0,null,null,8,"input",[["autocomplete","off"],["autofocus",""],["class","form-control"],["formControlName","username"],["id","username"],["name","username"],["placeholder","Username..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,23)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,23).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,23)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,23)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](23,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](25,671744,[[2,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](27,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](28,4210688,null,0,Bl.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](29,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](30,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,nn)),e["ɵdid"](32,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,un)),e["ɵdid"](34,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,dn)),e["ɵdid"](36,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,rn)),e["ɵdid"](38,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,pn)),e["ɵdid"](40,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](42,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,10,{FormControlNames:1}),e["ɵqud"](603979776,11,{messagesBlock:0}),(l()(),e["ɵeld"](45,0,null,0,1,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Full name"])),(l()(),e["ɵeld"](47,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](48,0,null,null,7,"input",[["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Full name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,49)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,49).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,49)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,49)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](49,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](51,671744,[[10,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](53,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](54,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](55,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](56,0,null,null,16,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](57,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,12,{FormControlNames:1}),e["ɵqud"](603979776,13,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"],["for","email"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Email"])),(l()(),e["ɵeld"](62,0,null,0,10,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,7,"input",[["class","form-control"],["formControlName","email"],["id","email"],["name","email"],["placeholder","Email..."],["type","email"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,64)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,64).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,64)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,64)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](64,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](66,671744,[[12,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](68,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](69,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](70,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,fn)),e["ɵdid"](72,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](73,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](74,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,14,{FormControlNames:1}),e["ɵqud"](603979776,15,{messagesBlock:0}),(l()(),e["ɵeld"](77,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Roles"])),(l()(),e["ɵeld"](79,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,vn)),e["ɵdid"](81,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,gn)),e["ɵdid"](83,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,hn)),e["ɵdid"](85,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](86,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](87,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](88,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),zl.b,zl.a)),e["ɵdid"](89,114688,null,0,Gl.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](90,0,[""," ",""])),e["ɵppd"](91,1),e["ɵppd"](92,1),(l()(),e["ɵeld"](93,0,null,null,1,"cd-back-button",[],null,null,null,Zl.b,Zl.a)),e["ɵdid"](94,49152,null,0,Kl.a,[g.Location,Nl.b],null,null)],(function(l,n){var u=n.component;l(n,2,0,u.userForm),l(n,5,0,u.userForm),l(n,13,0);var o=l(n,19,0,u.mode!==u.userFormMode.editing);l(n,18,0,"cd-col-form-label",o),l(n,25,0,"username"),l(n,28,0,""),l(n,30,0,"username"),l(n,32,0,u.userForm.showError("username",e["ɵnov"](n,2),"required")),l(n,34,0,u.userForm.showError("username",e["ɵnov"](n,2),"notUnique")),l(n,36,0,!u.authStorageService.isSSO()),l(n,38,0,!u.authStorageService.isSSO()),l(n,40,0,!u.authStorageService.isSSO()),l(n,42,0),l(n,51,0,"name"),l(n,55,0,"name"),l(n,57,0),l(n,66,0,"email"),l(n,70,0,"email"),l(n,72,0,u.userForm.showError("email",e["ɵnov"](n,2),"email")),l(n,74,0),l(n,81,0,u.allRoles),l(n,83,0,!u.isCurrentUser()),l(n,85,0,!u.isCurrentUser()&&!u.authStorageService.isSSO()),l(n,89,0,e["ɵnov"](n,2))}),(function(l,n){var u=n.component;l(n,0,0,e["ɵnov"](n,4).ngClassUntouched,e["ɵnov"](n,4).ngClassTouched,e["ɵnov"](n,4).ngClassPristine,e["ɵnov"](n,4).ngClassDirty,e["ɵnov"](n,4).ngClassValid,e["ɵnov"](n,4).ngClassInvalid,e["ɵnov"](n,4).ngClassPending);var o=e["ɵunv"](n,8,0,l(n,9,0,e["ɵnov"](n.parent,0),u.action)),a=e["ɵunv"](n,8,1,l(n,10,0,e["ɵnov"](n.parent,1),u.resource));l(n,8,0,o,a),l(n,12,0,e["ɵnov"](n,13).hasErrors,e["ɵnov"](n,13).hasSuccess),l(n,22,0,e["ɵnov"](n,27).ngClassUntouched,e["ɵnov"](n,27).ngClassTouched,e["ɵnov"](n,27).ngClassPristine,e["ɵnov"](n,27).ngClassDirty,e["ɵnov"](n,27).ngClassValid,e["ɵnov"](n,27).ngClassInvalid,e["ɵnov"](n,27).ngClassPending,e["ɵnov"](n,30).validClass,e["ɵnov"](n,30).invalidClass),l(n,41,0,e["ɵnov"](n,42).hasErrors,e["ɵnov"](n,42).hasSuccess),l(n,48,0,e["ɵnov"](n,53).ngClassUntouched,e["ɵnov"](n,53).ngClassTouched,e["ɵnov"](n,53).ngClassPristine,e["ɵnov"](n,53).ngClassDirty,e["ɵnov"](n,53).ngClassValid,e["ɵnov"](n,53).ngClassInvalid,e["ɵnov"](n,53).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess),l(n,63,0,e["ɵnov"](n,68).ngClassUntouched,e["ɵnov"](n,68).ngClassTouched,e["ɵnov"](n,68).ngClassPristine,e["ɵnov"](n,68).ngClassDirty,e["ɵnov"](n,68).ngClassValid,e["ɵnov"](n,68).ngClassInvalid,e["ɵnov"](n,68).ngClassPending,e["ɵnov"](n,70).validClass,e["ɵnov"](n,70).invalidClass),l(n,73,0,e["ɵnov"](n,74).hasErrors,e["ɵnov"](n,74).hasSuccess);var d=e["ɵunv"](n,90,0,l(n,91,0,e["ɵnov"](n.parent,0),u.action)),t=e["ɵunv"](n,90,1,l(n,92,0,e["ɵnov"](n.parent,1),u.resource));l(n,90,0,d,t)}))}function Cn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"p",[],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,1,"strong",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,['You are about to remove "user read / update" permissions from your own user.'])),(l()(),e["ɵeld"](3,0,null,null,0,"br",[],null,null,null,null,null)),(l()(),e["ɵeld"](4,0,null,null,1,"p",[],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["If you continue, you will no longer be able to add or remove roles from any user."])),(l()(),e["ɵeld"](6,0,null,null,1,null,null,null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Are you sure you want to continue?"]))],null,null)}function Rn(l){return e["ɵvid"](0,[e["ɵpid"](0,g.TitleCasePipe,[]),e["ɵpid"](0,A.a,[]),e["ɵqud"](402653184,1,{removeSelfUserReadUpdatePermissionTpl:0}),(l()(),e["ɵand"](16777216,null,null,1,null,ln)),e["ɵdid"](4,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](5,0,null,null,2,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵand"](16777216,null,null,1,null,bn)),e["ɵdid"](7,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](0,[[1,2],["removeSelfUserReadUpdatePermissionTpl",2]],null,0,null,Cn))],(function(l,n){var u=n.component;l(n,4,0,!u.pwdExpirationSettings),l(n,7,0,u.pwdExpirationSettings)}),null)}function wn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-user-form",[],null,null,null,Rn,$l)),e["ɵdid"](1,114688,null,0,Hl.a,[Xl.a,Q.a,$.a,$.m,X.b,Jl.a,El.a,yl.a,w.a,Nl.b,Yl.a,Ql.a,Wl.a],null,null)],(function(l,n){l(n,1,0)}),null)}var In=e["ɵccf"]("cd-user-form",Hl.a,wn,{},{},[]),En=u("LvDl"),yn=u("x38r");class Nn{constructor(l){this.i18n=l,this.scopes_permissions=[]}ngOnInit(){this.columns=[{prop:"scope",name:this.i18n("Scope"),flexGrow:2},{prop:"read",name:this.i18n("Read"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"create",name:this.i18n("Create"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"update",name:this.i18n("Update"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon},{prop:"delete",name:this.i18n("Delete"),flexGrow:1,cellClass:"text-center",cellTransformation:yn.a.checkIcon}]}ngOnChanges(){if(this.selection){this.selectedItem=this.selection;const l=[];En.each(this.scopes,n=>{const u={read:!1,create:!1,update:!1,delete:!1};u.scope=n,n in this.selectedItem.scopes_permissions&&En.each(this.selectedItem.scopes_permissions[n],l=>{u[l]=!0}),l.push(u)}),this.scopes_permissions=l}}}var xn=e["ɵcrt"]({encapsulation:0,styles:[["thead[_ngcontent-%COMP%]{background-color:#f5f5f5}.fa[_ngcontent-%COMP%]{font-size:large}.fa.fa-square-o[_ngcontent-%COMP%]{color:#d1d1d1}"]],data:{}});function Tn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"tabset",[],[[2,"tab-container",null]],null,null,pl.b,pl.a)),e["ɵdid"](1,180224,null,0,ll.e,[ll.f,e.Renderer2,e.ElementRef],null,null),(l()(),e["ɵeld"](2,0,null,0,3,"tab",[["heading","Details"]],[[1,"id",0],[2,"active",null],[2,"tab-pane",null],[1,"role",0],[1,"aria-labelledby",0]],null,null,null,null)),e["ɵdid"](3,212992,null,0,ll.b,[ll.e,e.ElementRef,e.Renderer2],{heading:[0,"heading"]},null),(l()(),e["ɵeld"](4,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,hl.b,hl.a)),e["ɵdid"](5,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],toolHeader:[3,"toolHeader"],footer:[4,"footer"],limit:[5,"limit"],autoReload:[6,"autoReload"],autoSave:[7,"autoSave"]},null)],(function(l,n){var u=n.component;l(n,3,0,"Details"),l(n,5,0,u.scopes_permissions,u.columns,"flex",!1,!1,0,!1,!1)}),(function(l,n){l(n,0,0,e["ɵnov"](n,1).clazz),l(n,2,0,e["ɵnov"](n,3).id,e["ɵnov"](n,3).active,e["ɵnov"](n,3).addClass,e["ɵnov"](n,3).role,e["ɵnov"](n,3).ariaLabelledby)}))}function kn(l){return e["ɵvid"](0,[(l()(),e["ɵand"](16777216,null,null,1,null,Tn)),e["ɵdid"](1,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null)],(function(l,n){l(n,1,0,n.component.selection)}),null)}var Dn=u("n/D3"),Sn=u("ZDA6"),qn=e["ɵcrt"]({encapsulation:0,styles:[[""]],data:{}});function Pn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-user-tabs",[],null,null,null,gl,vl)),e["ɵdid"](1,114688,null,0,fl,[$.m],null,null),(l()(),e["ɵeld"](2,0,null,null,5,"cd-table",[["columnMode","flex"],["identifier","name"],["selectionType","single"]],null,[[null,"setExpandedRow"],[null,"fetchData"],[null,"updateSelection"]],(function(l,n,u){var e=!0,o=l.component;return"setExpandedRow"===n&&(e=!1!==o.setExpandedRow(u)&&e),"fetchData"===n&&(e=!1!==o.getRoles()&&e),"updateSelection"===n&&(e=!1!==o.updateSelection(u)&&e),e}),hl.b,hl.a)),e["ɵdid"](3,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],hasDetails:[3,"hasDetails"],identifier:[4,"identifier"],selectionType:[5,"selectionType"]},{fetchData:"fetchData",updateSelection:"updateSelection",setExpandedRow:"setExpandedRow"}),(l()(),e["ɵeld"](4,0,null,1,1,"cd-table-actions",[["class","table-actions"]],null,null,null,Cl.b,Cl.a)),e["ɵdid"](5,114688,null,0,Rl.a,[],{permission:[0,"permission"],selection:[1,"selection"],tableActions:[2,"tableActions"]},null),(l()(),e["ɵeld"](6,0,null,3,1,"cd-role-details",[["cdTableDetail",""]],null,null,null,kn,xn)),e["ɵdid"](7,638976,null,0,Nn,[w.a],{selection:[0,"selection"],scopes:[1,"scopes"]},null)],(function(l,n){var u=n.component;l(n,1,0),l(n,3,0,u.roles,u.columns,"flex",!0,"name","single"),l(n,5,0,u.permission,u.selection,u.tableActions),l(n,7,0,u.expandedRow,u.scopes)}),null)}function Fn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,2,"cd-role-list",[],null,null,null,Pn,qn)),e["ɵprd"](256,null,wl.a,Dn.b,[]),e["ɵdid"](2,114688,null,0,Dn.a,[Jl.a,Sn.a,F.a,Q.a,X.b,yl.a,w.a,wl.a,Nl.b],null,null)],(function(l,n){l(n,2,0)}),null)}var _n=e["ɵccf"]("cd-role-list",Dn.a,Fn,{},{},[]),Vn=u("eTJe"),Un=e["ɵcrt"]({encapsulation:0,styles:[[".datatable-permissions-header-cell-label[_ngcontent-%COMP%], .datatable-permissions-scope-cell-label[_ngcontent-%COMP%]{font-weight:700}"]],data:{}});function Mn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["This field is required."]))],null,null)}function Ln(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"span",[["class","invalid-feedback"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["The chosen name is already in use."]))],null,null)}function An(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"checked",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickCellCheckbox(l.context.row.scope,l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,1,"label",[["class","datatable-permissions-scope-cell-label custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),e["ɵted"](5,null,["",""]))],null,(function(l,n){var u=n.component;l(n,1,0,e["ɵinlineInterpolate"](1,"scope_",n.context.row.scope,""),u.isRowChecked(n.context.row.scope),e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,e["ɵinlineInterpolate"](1,"scope_",n.context.row.scope,"")),l(n,5,0,n.context.value)}))}function On(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,4,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"checked",0],[8,"id",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickCellCheckbox(l.context.row.scope,l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,0,"label",[["class","custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null))],null,(function(l,n){l(n,1,0,n.context.value,n.context.row.scope+"-"+n.context.column.prop,e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,n.context.row.scope+"-"+n.context.column.prop)}))}function jn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,5,"div",[["class","custom-control custom-checkbox"]],null,null,null,null,null)),(l()(),e["ɵeld"](1,0,null,null,2,"input",[["class","custom-control-input"],["type","checkbox"]],[[8,"id",0],[8,"checked",0],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"change"]],(function(l,n,u){var e=!0;return"change"===n&&(e=!1!==l.component.onClickHeaderCheckbox(l.context.column.prop,u)&&e),e}),null,null)),e["ɵdid"](2,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](3,16384,null,0,dl.h,[[8,null],dl.a],null,null),(l()(),e["ɵeld"](4,0,null,null,1,"label",[["class","datatable-permissions-header-cell-label custom-control-label"]],[[8,"htmlFor",0]],null,null,null,null)),(l()(),e["ɵted"](5,null,["",""]))],null,(function(l,n){var u=n.component;l(n,1,0,e["ɵinlineInterpolate"](1,"header_",n.context.column.prop,""),u.isHeaderChecked(n.context.column.prop),e["ɵnov"](n,3).validClass,e["ɵnov"](n,3).invalidClass),l(n,4,0,e["ɵinlineInterpolate"](1,"header_",n.context.column.prop,"")),l(n,5,0,n.context.column.name)}))}function Bn(l){return e["ɵvid"](0,[e["ɵpid"](0,g.TitleCasePipe,[]),e["ɵpid"](0,A.a,[]),e["ɵqud"](402653184,1,{headerPermissionCheckboxTpl:0}),e["ɵqud"](402653184,2,{cellScopeCheckboxTpl:0}),e["ɵqud"](402653184,3,{cellPermissionCheckboxTpl:0}),(l()(),e["ɵeld"](5,0,null,null,68,"div",[["class","cd-col-form"]],null,null,null,null,null)),(l()(),e["ɵeld"](6,0,null,null,67,"form",[["name","roleForm"],["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],(function(l,n,u){var o=!0;return"submit"===n&&(o=!1!==e["ɵnov"](l,8).onSubmit(u)&&o),"reset"===n&&(o=!1!==e["ɵnov"](l,8).onReset()&&o),"submit"===n&&(o=!1!==e["ɵnov"](l,11).onSubmit()&&o),o}),null,null)),e["ɵdid"](7,16384,null,0,h.G,[],null,null),e["ɵdid"](8,540672,[["formDir",4]],0,h.l,[[8,null],[8,null]],{form:[0,"form"]},null),e["ɵprd"](2048,null,h.d,null,[h.l]),e["ɵdid"](10,16384,null,0,h.s,[[4,h.d]],null,null),e["ɵdid"](11,16384,null,0,dl.d,[],{formGroup:[0,"formGroup"]},null),(l()(),e["ɵeld"](12,0,null,null,61,"div",[["class","card"]],null,null,null,null,null)),(l()(),e["ɵeld"](13,0,null,null,3,"div",[["class","card-header"]],null,null,null,null,null)),(l()(),e["ɵted"](14,null,[""," ",""])),e["ɵppd"](15,1),e["ɵppd"](16,1),(l()(),e["ɵeld"](17,0,null,null,47,"div",[["class","card-body"]],null,null,null,null,null)),(l()(),e["ɵeld"](18,0,null,null,22,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](19,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,4,{FormControlNames:1}),e["ɵqud"](603979776,5,{messagesBlock:0}),(l()(),e["ɵeld"](22,0,null,0,4,"label",[["class","cd-col-form-label"],["for","name"]],null,null,null,null,null)),e["ɵprd"](512,null,g["ɵNgClassImpl"],g["ɵNgClassR2Impl"],[e.IterableDiffers,e.KeyValueDiffers,e.ElementRef,e.Renderer2]),e["ɵdid"](24,278528,null,0,g.NgClass,[g["ɵNgClassImpl"]],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),e["ɵpod"](25,{required:0}),(l()(),e["ɵted"](-1,null,["Name"])),(l()(),e["ɵeld"](27,0,null,0,13,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](28,0,null,null,8,"input",[["autofocus",""],["class","form-control"],["formControlName","name"],["id","name"],["name","name"],["placeholder","Name..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,29)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,29).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,29)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,29)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](29,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](31,671744,[[4,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](33,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](34,4210688,null,0,Bl.a,[e.ElementRef],{autofocus:[0,"autofocus"]},null),e["ɵdid"](35,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](36,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Mn)),e["ɵdid"](38,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵand"](16777216,null,null,1,null,Ln)),e["ɵdid"](40,16384,null,0,g.NgIf,[e.ViewContainerRef,e.TemplateRef],{ngIf:[0,"ngIf"]},null),(l()(),e["ɵeld"](41,0,null,null,14,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](42,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,6,{FormControlNames:1}),e["ɵqud"](603979776,7,{messagesBlock:0}),(l()(),e["ɵeld"](45,0,null,0,1,"label",[["class","cd-col-form-label"],["for","description"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Description"])),(l()(),e["ɵeld"](47,0,null,0,8,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](48,0,null,null,7,"input",[["class","form-control"],["formControlName","description"],["id","description"],["name","description"],["placeholder","Description..."],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"is-valid",null],[2,"is-invalid",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],(function(l,n,u){var o=!0;return"input"===n&&(o=!1!==e["ɵnov"](l,49)._handleInput(u.target.value)&&o),"blur"===n&&(o=!1!==e["ɵnov"](l,49).onTouched()&&o),"compositionstart"===n&&(o=!1!==e["ɵnov"](l,49)._compositionStart()&&o),"compositionend"===n&&(o=!1!==e["ɵnov"](l,49)._compositionEnd(u.target.value)&&o),o}),null,null)),e["ɵdid"](49,16384,null,0,h.e,[e.Renderer2,e.ElementRef,[2,h.b]],null,null),e["ɵprd"](1024,null,h.p,(function(l){return[l]}),[h.e]),e["ɵdid"](51,671744,[[6,4]],0,h.j,[[3,h.d],[8,null],[8,null],[6,h.p],[2,h.E]],{name:[0,"name"]},null),e["ɵprd"](2048,null,h.q,null,[h.j]),e["ɵdid"](53,16384,null,0,h.r,[[4,h.q]],null,null),e["ɵdid"](54,4210688,null,0,Ml.a,[[2,Ll.a],Q.a,e.ElementRef],null,null),e["ɵdid"](55,16384,null,0,dl.h,[[3,h.d],dl.a],{formControlName:[0,"formControlName"]},null),(l()(),e["ɵeld"](56,0,null,null,8,"div",[["class","form-group row"]],[[2,"has-error",null],[2,"has-success",null]],null,null,Ul.b,Ul.a)),e["ɵdid"](57,1163264,null,2,dl.c,[e.ElementRef,dl.g],null,null),e["ɵqud"](603979776,8,{FormControlNames:1}),e["ɵqud"](603979776,9,{messagesBlock:0}),(l()(),e["ɵeld"](60,0,null,0,1,"label",[["class","cd-col-form-label"]],null,null,null,null,null)),(l()(),e["ɵted"](-1,null,["Permissions"])),(l()(),e["ɵeld"](62,0,null,0,2,"div",[["class","cd-col-form-input"]],null,null,null,null,null)),(l()(),e["ɵeld"](63,0,null,null,1,"cd-table",[["columnMode","flex"]],null,null,null,hl.b,hl.a)),e["ɵdid"](64,2867200,null,0,bl.a,[e.NgZone,e.ChangeDetectorRef],{data:[0,"data"],columns:[1,"columns"],columnMode:[2,"columnMode"],toolHeader:[3,"toolHeader"],footer:[4,"footer"],limit:[5,"limit"],autoReload:[6,"autoReload"],autoSave:[7,"autoSave"]},null),(l()(),e["ɵeld"](65,0,null,null,8,"div",[["class","card-footer"]],null,null,null,null,null)),(l()(),e["ɵeld"](66,0,null,null,7,"div",[["class","button-group text-right"]],null,null,null,null,null)),(l()(),e["ɵeld"](67,0,null,null,4,"cd-submit-button",[],null,[[null,"submitAction"]],(function(l,n,u){var e=!0;return"submitAction"===n&&(e=!1!==l.component.submit()&&e),e}),zl.b,zl.a)),e["ɵdid"](68,114688,null,0,Gl.a,[e.ElementRef],{form:[0,"form"]},{submitAction:"submitAction"}),(l()(),e["ɵted"](69,0,[""," ",""])),e["ɵppd"](70,1),e["ɵppd"](71,1),(l()(),e["ɵeld"](72,0,null,null,1,"cd-back-button",[],null,null,null,Zl.b,Zl.a)),e["ɵdid"](73,49152,null,0,Kl.a,[g.Location,Nl.b],null,null),(l()(),e["ɵand"](0,[[2,2],["cellScopeCheckboxTpl",2]],null,0,null,An)),(l()(),e["ɵand"](0,[[3,2],["cellPermissionCheckboxTpl",2]],null,0,null,On)),(l()(),e["ɵand"](0,[[1,2],["headerPermissionCheckboxTpl",2]],null,0,null,jn))],(function(l,n){var u=n.component;l(n,8,0,u.roleForm),l(n,11,0,u.roleForm),l(n,19,0);var o=l(n,25,0,u.mode!==u.roleFormMode.editing);l(n,24,0,"cd-col-form-label",o),l(n,31,0,"name"),l(n,34,0,""),l(n,36,0,"name"),l(n,38,0,u.roleForm.showError("name",e["ɵnov"](n,8),"required")),l(n,40,0,u.roleForm.showError("name",e["ɵnov"](n,8),"notUnique")),l(n,42,0),l(n,51,0,"description"),l(n,55,0,"description"),l(n,57,0),l(n,64,0,u.scopes_permissions,u.columns,"flex",!1,!1,0,!1,!1),l(n,68,0,e["ɵnov"](n,8))}),(function(l,n){var u=n.component;l(n,6,0,e["ɵnov"](n,10).ngClassUntouched,e["ɵnov"](n,10).ngClassTouched,e["ɵnov"](n,10).ngClassPristine,e["ɵnov"](n,10).ngClassDirty,e["ɵnov"](n,10).ngClassValid,e["ɵnov"](n,10).ngClassInvalid,e["ɵnov"](n,10).ngClassPending);var o=e["ɵunv"](n,14,0,l(n,15,0,e["ɵnov"](n,0),u.action)),a=e["ɵunv"](n,14,1,l(n,16,0,e["ɵnov"](n,1),u.resource));l(n,14,0,o,a),l(n,18,0,e["ɵnov"](n,19).hasErrors,e["ɵnov"](n,19).hasSuccess),l(n,28,0,e["ɵnov"](n,33).ngClassUntouched,e["ɵnov"](n,33).ngClassTouched,e["ɵnov"](n,33).ngClassPristine,e["ɵnov"](n,33).ngClassDirty,e["ɵnov"](n,33).ngClassValid,e["ɵnov"](n,33).ngClassInvalid,e["ɵnov"](n,33).ngClassPending,e["ɵnov"](n,36).validClass,e["ɵnov"](n,36).invalidClass),l(n,41,0,e["ɵnov"](n,42).hasErrors,e["ɵnov"](n,42).hasSuccess),l(n,48,0,e["ɵnov"](n,53).ngClassUntouched,e["ɵnov"](n,53).ngClassTouched,e["ɵnov"](n,53).ngClassPristine,e["ɵnov"](n,53).ngClassDirty,e["ɵnov"](n,53).ngClassValid,e["ɵnov"](n,53).ngClassInvalid,e["ɵnov"](n,53).ngClassPending,e["ɵnov"](n,55).validClass,e["ɵnov"](n,55).invalidClass),l(n,56,0,e["ɵnov"](n,57).hasErrors,e["ɵnov"](n,57).hasSuccess);var d=e["ɵunv"](n,69,0,l(n,70,0,e["ɵnov"](n,0),u.action)),t=e["ɵunv"](n,69,1,l(n,71,0,e["ɵnov"](n,1),u.resource));l(n,69,0,d,t)}))}function zn(l){return e["ɵvid"](0,[(l()(),e["ɵeld"](0,0,null,null,1,"cd-role-form",[],null,null,null,Bn,Un)),e["ɵdid"](1,114688,null,0,Vn.a,[$.a,$.m,Jl.a,Sn.a,yl.a,w.a,Nl.b],null,null)],(function(l,n){l(n,1,0)}),null)}var Gn=e["ɵccf"]("cd-role-form",Vn.a,zn,{},{},[]);u.d(n,"AuthModuleNgFactory",(function(){return Zn})),u.d(n,"RoutedAuthModuleNgFactory",(function(){return Kn}));var Zn=e["ɵcmf"](o.a,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[a.a,d.a,t.a,s.a,s.b,i.a,r.a,c.a,m.a,p.a,f.a,v.a,v.c,v.b,v.d]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,g.NgLocalization,g.NgLocaleLocalization,[e.LOCALE_ID,[2,g["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,h.D,h.D,[]),e["ɵmpd"](4608,h.h,h.h,[]),e["ɵmpd"](4608,b.a,b.a,[]),e["ɵmpd"](4608,C.a,C.a,[]),e["ɵmpd"](4608,R.a,R.a,[w.a]),e["ɵmpd"](4608,g.DatePipe,g.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,I.a,I.a,[]),e["ɵmpd"](4608,E.a,E.a,[]),e["ɵmpd"](4608,y.a,y.a,[]),e["ɵmpd"](4608,N.a,N.a,[y.a]),e["ɵmpd"](4608,x.a,x.a,[y.a]),e["ɵmpd"](4608,T.a,T.a,[y.a]),e["ɵmpd"](4608,k.a,k.a,[]),e["ɵmpd"](4608,D.a,D.a,[]),e["ɵmpd"](4608,S.a,S.a,[]),e["ɵmpd"](4608,q.a,q.a,[]),e["ɵmpd"](4608,P.a,P.a,[g.DatePipe]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,_.a,_.a,[]),e["ɵmpd"](4608,V.a,V.a,[]),e["ɵmpd"](4608,U.a,U.a,[]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,L.a,L.a,[w.a]),e["ɵmpd"](4608,A.a,A.a,[]),e["ɵmpd"](4608,O.a,O.a,[]),e["ɵmpd"](4608,j.a,j.a,[]),e["ɵmpd"](4608,B.b,B.b,[]),e["ɵmpd"](4608,z.a,z.a,[]),e["ɵmpd"](4608,G.a,G.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,Z.a,Z.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,G.a,e.ApplicationRef]),e["ɵmpd"](4608,K.c,K.c,[]),e["ɵmpd"](4608,H.a,H.a,[]),e["ɵmpd"](4608,X.b,X.b,[e.RendererFactory2,Z.a]),e["ɵmpd"](4608,J.y,J.y,[g.DOCUMENT]),e["ɵmpd"](4608,J.r,J.r,[]),e["ɵmpd"](4608,J.a,J.a,[]),e["ɵmpd"](4608,Y.f,Y.f,[]),e["ɵmpd"](4608,Q.a,Q.a,[]),e["ɵmpd"](4608,W.a,W.a,[$.m,Q.a]),e["ɵmpd"](4608,ll.f,ll.f,[]),e["ɵmpd"](4608,nl.t,nl.t,[]),e["ɵmpd"](4608,nl.v,nl.v,[]),e["ɵmpd"](4608,nl.a,nl.a,[]),e["ɵmpd"](4608,nl.h,nl.h,[]),e["ɵmpd"](4608,nl.d,nl.d,[]),e["ɵmpd"](4608,nl.j,nl.j,[]),e["ɵmpd"](4608,nl.l,nl.l,[]),e["ɵmpd"](4608,nl.u,nl.u,[nl.v,nl.l]),e["ɵmpd"](1073742336,ul.a,ul.a,[]),e["ɵmpd"](1073742336,g.CommonModule,g.CommonModule,[]),e["ɵmpd"](1073742336,h.C,h.C,[]),e["ɵmpd"](1073742336,h.n,h.n,[]),e["ɵmpd"](1073742336,z.d,z.d,[]),e["ɵmpd"](1073742336,h.y,h.y,[]),e["ɵmpd"](1073742336,el.a,el.a,[]),e["ɵmpd"](1073742336,B.c,B.c,[]),e["ɵmpd"](1073742336,K.d,K.d,[]),e["ɵmpd"](1073742336,H.d,H.d,[]),e["ɵmpd"](1073742336,ol.b,ol.b,[]),e["ɵmpd"](1073742336,X.e,X.e,[]),e["ɵmpd"](1073742336,al.a,al.a,[]),e["ɵmpd"](1073742336,Y.e,Y.e,[]),e["ɵmpd"](1073742336,dl.f,dl.f,[]),e["ɵmpd"](1073742336,tl.ClickOutsideModule,tl.ClickOutsideModule,[]),e["ɵmpd"](1073742336,sl.b,sl.b,[]),e["ɵmpd"](1073742336,$.q,$.q,[[2,$.v],[2,$.m]]),e["ɵmpd"](1073742336,il.a,il.a,[]),e["ɵmpd"](1073742336,J.u,J.u,[]),e["ɵmpd"](1073742336,rl.a,rl.a,[]),e["ɵmpd"](1073742336,cl.a,cl.a,[]),e["ɵmpd"](1073742336,ml.a,ml.a,[]),e["ɵmpd"](1073742336,ll.d,ll.d,[]),e["ɵmpd"](1073742336,nl.g,nl.g,[]),e["ɵmpd"](1073742336,o.a,o.a,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,Y.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])})),Kn=e["ɵcmf"](o.b,[],(function(l){return e["ɵmod"]([e["ɵmpd"](512,e.ComponentFactoryResolver,e["ɵCodegenComponentFactoryResolver"],[[8,[a.a,d.a,t.a,s.a,s.b,i.a,r.a,c.a,m.a,p.a,f.a,v.a,v.c,v.b,v.d,ql,In,_n,Gn]],[3,e.ComponentFactoryResolver],e.NgModuleRef]),e["ɵmpd"](4608,g.NgLocalization,g.NgLocaleLocalization,[e.LOCALE_ID,[2,g["ɵangular_packages_common_common_a"]]]),e["ɵmpd"](4608,h.D,h.D,[]),e["ɵmpd"](4608,h.h,h.h,[]),e["ɵmpd"](4608,b.a,b.a,[]),e["ɵmpd"](4608,C.a,C.a,[]),e["ɵmpd"](4608,R.a,R.a,[w.a]),e["ɵmpd"](4608,g.DatePipe,g.DatePipe,[e.LOCALE_ID]),e["ɵmpd"](4608,I.a,I.a,[]),e["ɵmpd"](4608,E.a,E.a,[]),e["ɵmpd"](4608,y.a,y.a,[]),e["ɵmpd"](4608,N.a,N.a,[y.a]),e["ɵmpd"](4608,x.a,x.a,[y.a]),e["ɵmpd"](4608,T.a,T.a,[y.a]),e["ɵmpd"](4608,k.a,k.a,[]),e["ɵmpd"](4608,D.a,D.a,[]),e["ɵmpd"](4608,S.a,S.a,[]),e["ɵmpd"](4608,q.a,q.a,[]),e["ɵmpd"](4608,P.a,P.a,[g.DatePipe]),e["ɵmpd"](4608,F.a,F.a,[]),e["ɵmpd"](4608,_.a,_.a,[]),e["ɵmpd"](4608,V.a,V.a,[]),e["ɵmpd"](4608,U.a,U.a,[]),e["ɵmpd"](4608,M.a,M.a,[]),e["ɵmpd"](4608,L.a,L.a,[w.a]),e["ɵmpd"](4608,A.a,A.a,[]),e["ɵmpd"](4608,O.a,O.a,[]),e["ɵmpd"](4608,j.a,j.a,[]),e["ɵmpd"](4608,B.b,B.b,[]),e["ɵmpd"](4608,z.a,z.a,[]),e["ɵmpd"](4608,G.a,G.a,[e.NgZone,e.RendererFactory2,e.PLATFORM_ID]),e["ɵmpd"](4608,Z.a,Z.a,[e.ComponentFactoryResolver,e.NgZone,e.Injector,G.a,e.ApplicationRef]),e["ɵmpd"](4608,K.c,K.c,[]),e["ɵmpd"](4608,H.a,H.a,[]),e["ɵmpd"](4608,X.b,X.b,[e.RendererFactory2,Z.a]),e["ɵmpd"](4608,J.y,J.y,[g.DOCUMENT]),e["ɵmpd"](4608,J.r,J.r,[]),e["ɵmpd"](4608,J.a,J.a,[]),e["ɵmpd"](4608,Y.f,Y.f,[]),e["ɵmpd"](4608,Q.a,Q.a,[]),e["ɵmpd"](4608,W.a,W.a,[$.m,Q.a]),e["ɵmpd"](4608,ll.f,ll.f,[]),e["ɵmpd"](4608,nl.t,nl.t,[]),e["ɵmpd"](4608,nl.v,nl.v,[]),e["ɵmpd"](4608,nl.a,nl.a,[]),e["ɵmpd"](4608,nl.h,nl.h,[]),e["ɵmpd"](4608,nl.d,nl.d,[]),e["ɵmpd"](4608,nl.j,nl.j,[]),e["ɵmpd"](4608,nl.l,nl.l,[]),e["ɵmpd"](4608,nl.u,nl.u,[nl.v,nl.l]),e["ɵmpd"](1073742336,ul.a,ul.a,[]),e["ɵmpd"](1073742336,g.CommonModule,g.CommonModule,[]),e["ɵmpd"](1073742336,h.C,h.C,[]),e["ɵmpd"](1073742336,h.n,h.n,[]),e["ɵmpd"](1073742336,z.d,z.d,[]),e["ɵmpd"](1073742336,h.y,h.y,[]),e["ɵmpd"](1073742336,el.a,el.a,[]),e["ɵmpd"](1073742336,B.c,B.c,[]),e["ɵmpd"](1073742336,K.d,K.d,[]),e["ɵmpd"](1073742336,H.d,H.d,[]),e["ɵmpd"](1073742336,ol.b,ol.b,[]),e["ɵmpd"](1073742336,X.e,X.e,[]),e["ɵmpd"](1073742336,al.a,al.a,[]),e["ɵmpd"](1073742336,Y.e,Y.e,[]),e["ɵmpd"](1073742336,dl.f,dl.f,[]),e["ɵmpd"](1073742336,tl.ClickOutsideModule,tl.ClickOutsideModule,[]),e["ɵmpd"](1073742336,sl.b,sl.b,[]),e["ɵmpd"](1073742336,$.q,$.q,[[2,$.v],[2,$.m]]),e["ɵmpd"](1073742336,il.a,il.a,[]),e["ɵmpd"](1073742336,J.u,J.u,[]),e["ɵmpd"](1073742336,rl.a,rl.a,[]),e["ɵmpd"](1073742336,cl.a,cl.a,[]),e["ɵmpd"](1073742336,ml.a,ml.a,[]),e["ɵmpd"](1073742336,ll.d,ll.d,[]),e["ɵmpd"](1073742336,nl.g,nl.g,[]),e["ɵmpd"](1073742336,o.a,o.a,[]),e["ɵmpd"](1073742336,o.b,o.b,[]),e["ɵmpd"](256,e.LOCALE_ID,"en-US",[]),e["ɵmpd"](256,Y.a,{autoClose:!0,insideClick:!1},[]),e["ɵmpd"](1024,$.k,(function(){return[[{path:"",redirectTo:"users",pathMatch:"full"},{path:"users",data:o.c,children:[{path:"",component:Il.a},{path:"create",component:Hl.a,data:o.d},{path:"edit/:username",component:Hl.a,data:o.e}]},{path:"roles",data:o.f,children:[{path:"",component:Dn.a},{path:"create",component:Vn.a,data:o.g},{path:"edit/:name",component:Vn.a,data:o.h}]}]]}),[]),e["ɵmpd"](256,e.TRANSLATIONS_FORMAT,"xlf",[])])}))}}]); \ No newline at end of file diff -Nru ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/index.html ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/index.html --- ceph-15.2.8/src/pybind/mgr/dashboard/frontend/dist/en-US/index.html 2020-12-16 17:37:22.000000000 +0000 +++ ceph-15.2.11/src/pybind/mgr/dashboard/frontend/dist/en-US/index.html 2021-04-19 13:53:43.000000000 +0000 @@ -3,14 +3,15 @@ Ceph + - +