Cinder Ceph Replication tests
* Add optional parameter `pools` to the Juju actions: `resync-pools`, `status`, `demote`, and `promote`. * Add `bionic-train-image-mirroring` to the `gate_bundles`. Change-Id: I9df77be628718bb60a1bdc65078c94d0b7bda9d4 Func-Test-Pr: https://github.com/openstack-charmers/zaza-openstack-tests/pull/486
This commit is contained in:
parent
8c7e471615
commit
c2a27dc336
@ -1,15 +1,25 @@
|
|||||||
demote:
|
demote:
|
||||||
description: |
|
description: |
|
||||||
Demote all primary images within all pools to non-primary.
|
Demote all primary images within given pools to non-primary.
|
||||||
params:
|
params:
|
||||||
force:
|
force:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
pools:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Comma-separated list of pools to demote. If this is not set, all the
|
||||||
|
pools will be demoted.
|
||||||
promote:
|
promote:
|
||||||
description: |
|
description: |
|
||||||
Promote all non-primary images within all pools to primary.
|
Promote all non-primary images within given pools to primary.
|
||||||
params:
|
params:
|
||||||
force:
|
force:
|
||||||
type: boolean
|
type: boolean
|
||||||
|
pools:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Comma-separated list of pools to promote. If this is not set, all the
|
||||||
|
pools will be promoted.
|
||||||
refresh-pools:
|
refresh-pools:
|
||||||
description: |
|
description: |
|
||||||
\
|
\
|
||||||
@ -19,13 +29,19 @@ refresh-pools:
|
|||||||
resync-pools:
|
resync-pools:
|
||||||
description: |
|
description: |
|
||||||
\
|
\
|
||||||
USE WITH CAUTION - Force image resync for all images in pools on local
|
USE WITH CAUTION - Force image resync for all images in the given
|
||||||
Ceph endpoint.
|
pools on local Ceph endpoint.
|
||||||
params:
|
params:
|
||||||
i-really-mean-it:
|
i-really-mean-it:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: |
|
description: |
|
||||||
This must be set to true to perform the action
|
This must be set to true to perform the action
|
||||||
|
pools:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Comma-separated list of pools to resync from the local Ceph endpoint.
|
||||||
|
If this is not set, all the pools from the local Ceph endpoint will
|
||||||
|
be resynced.
|
||||||
required:
|
required:
|
||||||
- i-really-mean-it
|
- i-really-mean-it
|
||||||
status:
|
status:
|
||||||
@ -41,3 +57,8 @@ status:
|
|||||||
- plain
|
- plain
|
||||||
- json
|
- json
|
||||||
- xml
|
- xml
|
||||||
|
pools:
|
||||||
|
type: string
|
||||||
|
description: |
|
||||||
|
Comma-separated list of pools to include in the status. If this is
|
||||||
|
not set, all the pools will be included.
|
||||||
|
@ -40,12 +40,22 @@ ch_core.hookenv._run_atstart()
|
|||||||
charms_openstack.bus.discover()
|
charms_openstack.bus.discover()
|
||||||
|
|
||||||
|
|
||||||
|
def get_pools():
|
||||||
|
"""Get the list of pools given as parameter to perform the actions on."""
|
||||||
|
pools = ch_core.hookenv.action_get('pools')
|
||||||
|
if pools:
|
||||||
|
return [p.strip() for p in pools.split(',')]
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def rbd_mirror_action(args):
|
def rbd_mirror_action(args):
|
||||||
"""Perform RBD command on pools in local Ceph endpoint."""
|
"""Perform RBD command on pools in local Ceph endpoint."""
|
||||||
action_name = os.path.basename(args[0])
|
action_name = os.path.basename(args[0])
|
||||||
with charms_openstack.charm.provide_charm_instance() as charm:
|
with charms_openstack.charm.provide_charm_instance() as charm:
|
||||||
ceph_local = reactive.endpoint_from_name('ceph-local')
|
ceph_local = reactive.endpoint_from_name('ceph-local')
|
||||||
pools = charm.eligible_pools(ceph_local.pools)
|
pools = get_pools()
|
||||||
|
if not pools:
|
||||||
|
pools = charm.eligible_pools(ceph_local.pools)
|
||||||
result = {}
|
result = {}
|
||||||
cmd = ['rbd', '--id', charm.ceph_id, 'mirror', 'pool', action_name]
|
cmd = ['rbd', '--id', charm.ceph_id, 'mirror', 'pool', action_name]
|
||||||
if ch_core.hookenv.action_get('force'):
|
if ch_core.hookenv.action_get('force'):
|
||||||
@ -103,7 +113,9 @@ def resync_pools(args):
|
|||||||
return
|
return
|
||||||
with charms_openstack.charm.provide_charm_instance() as charm:
|
with charms_openstack.charm.provide_charm_instance() as charm:
|
||||||
ceph_local = reactive.endpoint_from_name('ceph-local')
|
ceph_local = reactive.endpoint_from_name('ceph-local')
|
||||||
pools = charm.eligible_pools(ceph_local.pools)
|
pools = get_pools()
|
||||||
|
if not pools:
|
||||||
|
pools = charm.eligible_pools(ceph_local.pools)
|
||||||
result = collections.defaultdict(dict)
|
result = collections.defaultdict(dict)
|
||||||
for pool in pools:
|
for pool in pools:
|
||||||
# list images in pool
|
# list images in pool
|
||||||
@ -112,6 +124,12 @@ def resync_pools(args):
|
|||||||
'-p', pool, 'ls'], universal_newlines=True)
|
'-p', pool, 'ls'], universal_newlines=True)
|
||||||
images = json.loads(output)
|
images = json.loads(output)
|
||||||
for image in images:
|
for image in images:
|
||||||
|
output = subprocess.check_output(
|
||||||
|
['rbd', '--id', charm.ceph_id, '--format', 'json', 'info',
|
||||||
|
'{}/{}'.format(pool, image)], universal_newlines=True)
|
||||||
|
image_info = json.loads(output)
|
||||||
|
if image_info['mirroring']['state'] == 'disabled':
|
||||||
|
continue
|
||||||
output = subprocess.check_output(
|
output = subprocess.check_output(
|
||||||
['rbd', '--id', charm.ceph_id, 'mirror', 'image', 'resync',
|
['rbd', '--id', charm.ceph_id, 'mirror', 'image', 'resync',
|
||||||
'{}/{}'.format(pool, image)], universal_newlines=True)
|
'{}/{}'.format(pool, image)], universal_newlines=True)
|
||||||
|
120
src/tests/bundles/bionic-train-image-mirroring.yaml
Normal file
120
src/tests/bundles/bionic-train-image-mirroring.yaml
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
series: bionic
|
||||||
|
applications:
|
||||||
|
mysql:
|
||||||
|
charm: cs:~openstack-charmers-next/percona-cluster
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
keystone:
|
||||||
|
charm: cs:~openstack-charmers-next/keystone
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-train
|
||||||
|
rabbitmq-server:
|
||||||
|
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
cinder:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
block-device: None
|
||||||
|
glance-api-version: 2
|
||||||
|
openstack-origin: cloud:bionic-train
|
||||||
|
cinder-ceph:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
num_units: 0
|
||||||
|
options:
|
||||||
|
rbd-mirroring-mode: image
|
||||||
|
glance:
|
||||||
|
charm: cs:~openstack-charmers-next/glance
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-train
|
||||||
|
nova-compute:
|
||||||
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-train
|
||||||
|
ceph-mon:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: cloud:bionic-train
|
||||||
|
ceph-osd:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
ceph-rbd-mirror:
|
||||||
|
series: bionic
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
ceph-mon-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: cloud:bionic-train
|
||||||
|
ceph-osd-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
ceph-rbd-mirror-b:
|
||||||
|
series: bionic
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-train
|
||||||
|
relations:
|
||||||
|
- - mysql
|
||||||
|
- keystone
|
||||||
|
- - mysql
|
||||||
|
- cinder
|
||||||
|
- - mysql
|
||||||
|
- glance
|
||||||
|
- - rabbitmq-server
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- glance
|
||||||
|
- - cinder
|
||||||
|
- cinder-ceph
|
||||||
|
- - cinder-ceph:ceph
|
||||||
|
- ceph-mon:client
|
||||||
|
- - nova-compute:ceph-access
|
||||||
|
- cinder-ceph:ceph-access
|
||||||
|
- - nova-compute:amqp
|
||||||
|
- rabbitmq-server:amqp
|
||||||
|
- - glance:image-service
|
||||||
|
- nova-compute:image-service
|
||||||
|
- - glance
|
||||||
|
- ceph-mon
|
||||||
|
- - ceph-mon:osd
|
||||||
|
- ceph-osd:mon
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror:ceph-local
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror-b:ceph-remote
|
||||||
|
- - ceph-mon-b:osd
|
||||||
|
- ceph-osd-b:mon
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror-b:ceph-local
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror:ceph-remote
|
||||||
|
- - cinder-ceph:ceph-replication-device
|
||||||
|
- ceph-mon-b:client
|
120
src/tests/bundles/bionic-ussuri-image-mirroring.yaml
Normal file
120
src/tests/bundles/bionic-ussuri-image-mirroring.yaml
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
series: bionic
|
||||||
|
applications:
|
||||||
|
mysql:
|
||||||
|
charm: cs:~openstack-charmers-next/percona-cluster
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
keystone:
|
||||||
|
charm: cs:~openstack-charmers-next/keystone
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-ussuri
|
||||||
|
rabbitmq-server:
|
||||||
|
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
cinder:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
block-device: None
|
||||||
|
glance-api-version: 2
|
||||||
|
openstack-origin: cloud:bionic-ussuri
|
||||||
|
cinder-ceph:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
num_units: 0
|
||||||
|
options:
|
||||||
|
rbd-mirroring-mode: image
|
||||||
|
glance:
|
||||||
|
charm: cs:~openstack-charmers-next/glance
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-ussuri
|
||||||
|
nova-compute:
|
||||||
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: cloud:bionic-ussuri
|
||||||
|
ceph-mon:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
ceph-osd:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
ceph-rbd-mirror:
|
||||||
|
series: bionic
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
ceph-mon-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
ceph-osd-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
ceph-rbd-mirror-b:
|
||||||
|
series: bionic
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: cloud:bionic-ussuri
|
||||||
|
relations:
|
||||||
|
- - mysql
|
||||||
|
- keystone
|
||||||
|
- - mysql
|
||||||
|
- cinder
|
||||||
|
- - mysql
|
||||||
|
- glance
|
||||||
|
- - rabbitmq-server
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- glance
|
||||||
|
- - cinder
|
||||||
|
- cinder-ceph
|
||||||
|
- - cinder-ceph:ceph
|
||||||
|
- ceph-mon:client
|
||||||
|
- - nova-compute:ceph-access
|
||||||
|
- cinder-ceph:ceph-access
|
||||||
|
- - nova-compute:amqp
|
||||||
|
- rabbitmq-server:amqp
|
||||||
|
- - glance:image-service
|
||||||
|
- nova-compute:image-service
|
||||||
|
- - glance
|
||||||
|
- ceph-mon
|
||||||
|
- - ceph-mon:osd
|
||||||
|
- ceph-osd:mon
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror:ceph-local
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror-b:ceph-remote
|
||||||
|
- - ceph-mon-b:osd
|
||||||
|
- ceph-osd-b:mon
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror-b:ceph-local
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror:ceph-remote
|
||||||
|
- - cinder-ceph:ceph-replication-device
|
||||||
|
- ceph-mon-b:client
|
233
src/tests/bundles/focal-ussuri-image-mirroring.yaml
Normal file
233
src/tests/bundles/focal-ussuri-image-mirroring.yaml
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
variables:
|
||||||
|
openstack-origin: &openstack-origin distro
|
||||||
|
|
||||||
|
series: focal
|
||||||
|
|
||||||
|
comment:
|
||||||
|
- 'machines section to decide order of deployment. database sooner = faster'
|
||||||
|
machines:
|
||||||
|
'0':
|
||||||
|
constraints: mem=3072M
|
||||||
|
'1':
|
||||||
|
constraints: mem=3072M
|
||||||
|
'2':
|
||||||
|
constraints: mem=3072M
|
||||||
|
'3':
|
||||||
|
'4':
|
||||||
|
'5':
|
||||||
|
'6':
|
||||||
|
'7':
|
||||||
|
'8':
|
||||||
|
'9':
|
||||||
|
'10':
|
||||||
|
'11':
|
||||||
|
'12':
|
||||||
|
'13':
|
||||||
|
'14':
|
||||||
|
'15':
|
||||||
|
'16':
|
||||||
|
'17':
|
||||||
|
'18':
|
||||||
|
'19':
|
||||||
|
'20':
|
||||||
|
'21':
|
||||||
|
|
||||||
|
applications:
|
||||||
|
|
||||||
|
cinder-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
|
||||||
|
keystone-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
|
||||||
|
glance-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
|
||||||
|
mysql-innodb-cluster:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-innodb-cluster
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '0'
|
||||||
|
- '1'
|
||||||
|
- '2'
|
||||||
|
|
||||||
|
keystone:
|
||||||
|
charm: cs:~openstack-charmers-next/keystone
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '3'
|
||||||
|
|
||||||
|
rabbitmq-server:
|
||||||
|
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '4'
|
||||||
|
|
||||||
|
cinder:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
block-device: None
|
||||||
|
glance-api-version: 2
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '5'
|
||||||
|
|
||||||
|
cinder-ceph:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
num_units: 0
|
||||||
|
options:
|
||||||
|
rbd-mirroring-mode: image
|
||||||
|
|
||||||
|
glance:
|
||||||
|
charm: cs:~openstack-charmers-next/glance
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '6'
|
||||||
|
|
||||||
|
nova-compute:
|
||||||
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
num_units: 1
|
||||||
|
to:
|
||||||
|
- '7'
|
||||||
|
|
||||||
|
ceph-mon:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '8'
|
||||||
|
- '9'
|
||||||
|
- '10'
|
||||||
|
|
||||||
|
ceph-osd:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
to:
|
||||||
|
- '11'
|
||||||
|
- '12'
|
||||||
|
- '13'
|
||||||
|
|
||||||
|
ceph-rbd-mirror:
|
||||||
|
series: focal
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '14'
|
||||||
|
|
||||||
|
ceph-mon-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '15'
|
||||||
|
- '16'
|
||||||
|
- '17'
|
||||||
|
|
||||||
|
ceph-osd-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
#bluestore: False
|
||||||
|
#use-direct-io: False
|
||||||
|
storage:
|
||||||
|
osd-devices: '10G'
|
||||||
|
to:
|
||||||
|
- '18'
|
||||||
|
- '19'
|
||||||
|
- '20'
|
||||||
|
|
||||||
|
ceph-rbd-mirror-b:
|
||||||
|
series: focal
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '21'
|
||||||
|
|
||||||
|
relations:
|
||||||
|
|
||||||
|
- - 'keystone:shared-db'
|
||||||
|
- 'keystone-mysql-router:shared-db'
|
||||||
|
- - 'keystone-mysql-router:db-router'
|
||||||
|
- 'mysql-innodb-cluster:db-router'
|
||||||
|
|
||||||
|
- - 'cinder:shared-db'
|
||||||
|
- 'cinder-mysql-router:shared-db'
|
||||||
|
- - 'cinder-mysql-router:db-router'
|
||||||
|
- 'mysql-innodb-cluster:db-router'
|
||||||
|
|
||||||
|
- - 'glance:shared-db'
|
||||||
|
- 'glance-mysql-router:shared-db'
|
||||||
|
- - 'glance-mysql-router:db-router'
|
||||||
|
- 'mysql-innodb-cluster:db-router'
|
||||||
|
|
||||||
|
- - 'rabbitmq-server'
|
||||||
|
- 'cinder'
|
||||||
|
|
||||||
|
- - 'keystone'
|
||||||
|
- 'cinder'
|
||||||
|
|
||||||
|
- - 'keystone'
|
||||||
|
- 'glance'
|
||||||
|
|
||||||
|
- - 'cinder'
|
||||||
|
- 'cinder-ceph'
|
||||||
|
|
||||||
|
- - 'cinder-ceph:ceph'
|
||||||
|
- 'ceph-mon:client'
|
||||||
|
|
||||||
|
- - 'cinder-ceph:ceph-replication-device'
|
||||||
|
- 'ceph-mon-b:client'
|
||||||
|
|
||||||
|
- - 'nova-compute:ceph-access'
|
||||||
|
- 'cinder-ceph:ceph-access'
|
||||||
|
|
||||||
|
- - 'nova-compute:amqp'
|
||||||
|
- 'rabbitmq-server:amqp'
|
||||||
|
|
||||||
|
- - 'glance:image-service'
|
||||||
|
- 'nova-compute:image-service'
|
||||||
|
|
||||||
|
- - 'glance'
|
||||||
|
- 'ceph-mon'
|
||||||
|
|
||||||
|
- - 'ceph-mon:osd'
|
||||||
|
- 'ceph-osd:mon'
|
||||||
|
|
||||||
|
- - 'ceph-mon'
|
||||||
|
- 'ceph-rbd-mirror:ceph-local'
|
||||||
|
|
||||||
|
- - 'ceph-mon'
|
||||||
|
- 'ceph-rbd-mirror-b:ceph-remote'
|
||||||
|
|
||||||
|
- - 'ceph-mon-b:osd'
|
||||||
|
- 'ceph-osd-b:mon'
|
||||||
|
|
||||||
|
- - 'ceph-mon-b'
|
||||||
|
- 'ceph-rbd-mirror-b:ceph-local'
|
||||||
|
|
||||||
|
- - 'ceph-mon-b'
|
||||||
|
- 'ceph-rbd-mirror:ceph-remote'
|
171
src/tests/bundles/focal-victoria-image-mirroring.yaml
Normal file
171
src/tests/bundles/focal-victoria-image-mirroring.yaml
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
variables:
|
||||||
|
openstack-origin: &openstack-origin cloud:focal-victoria
|
||||||
|
|
||||||
|
series: &series focal
|
||||||
|
|
||||||
|
machines:
|
||||||
|
'0':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
'1':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
'2':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
|
||||||
|
applications:
|
||||||
|
|
||||||
|
keystone-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
glance-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
cinder-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
|
||||||
|
mysql-innodb-cluster:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-innodb-cluster
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '0'
|
||||||
|
- '1'
|
||||||
|
- '2'
|
||||||
|
|
||||||
|
keystone:
|
||||||
|
charm: cs:~openstack-charmers-next/keystone
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
rabbitmq-server:
|
||||||
|
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
cinder:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
block-device: None
|
||||||
|
glance-api-version: 2
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
cinder-ceph:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
num_units: 0
|
||||||
|
options:
|
||||||
|
rbd-mirroring-mode: image
|
||||||
|
|
||||||
|
glance:
|
||||||
|
charm: cs:~openstack-charmers-next/glance
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
nova-compute:
|
||||||
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
ceph-mon:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-osd:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
bluestore: False
|
||||||
|
use-direct-io: False
|
||||||
|
osd-devices: /opt
|
||||||
|
|
||||||
|
ceph-rbd-mirror:
|
||||||
|
series: *series
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-mon-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-osd-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
bluestore: False
|
||||||
|
use-direct-io: False
|
||||||
|
osd-devices: /opt
|
||||||
|
|
||||||
|
ceph-rbd-mirror-b:
|
||||||
|
series: *series
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
relations:
|
||||||
|
|
||||||
|
- - keystone:shared-db
|
||||||
|
- keystone-mysql-router:shared-db
|
||||||
|
- - keystone-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - glance:shared-db
|
||||||
|
- glance-mysql-router:shared-db
|
||||||
|
- - glance-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - cinder:shared-db
|
||||||
|
- cinder-mysql-router:shared-db
|
||||||
|
- - cinder-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - rabbitmq-server
|
||||||
|
- cinder
|
||||||
|
|
||||||
|
- - keystone
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- glance
|
||||||
|
|
||||||
|
- - cinder
|
||||||
|
- cinder-ceph
|
||||||
|
- - cinder-ceph:ceph
|
||||||
|
- ceph-mon:client
|
||||||
|
- - cinder-ceph:ceph-replication-device
|
||||||
|
- ceph-mon-b:client
|
||||||
|
|
||||||
|
- - nova-compute:ceph-access
|
||||||
|
- cinder-ceph:ceph-access
|
||||||
|
- - nova-compute:amqp
|
||||||
|
- rabbitmq-server:amqp
|
||||||
|
|
||||||
|
- - glance:image-service
|
||||||
|
- nova-compute:image-service
|
||||||
|
- - glance
|
||||||
|
- ceph-mon
|
||||||
|
|
||||||
|
- - ceph-mon:osd
|
||||||
|
- ceph-osd:mon
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror:ceph-local
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror-b:ceph-remote
|
||||||
|
|
||||||
|
- - ceph-mon-b:osd
|
||||||
|
- ceph-osd-b:mon
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror-b:ceph-local
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror:ceph-remote
|
171
src/tests/bundles/groovy-victoria-image-mirroring.yaml
Normal file
171
src/tests/bundles/groovy-victoria-image-mirroring.yaml
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
variables:
|
||||||
|
openstack-origin: &openstack-origin distro
|
||||||
|
|
||||||
|
series: &series groovy
|
||||||
|
|
||||||
|
machines:
|
||||||
|
'0':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
'1':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
'2':
|
||||||
|
constraints: "mem=3072M"
|
||||||
|
|
||||||
|
applications:
|
||||||
|
|
||||||
|
keystone-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
glance-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
cinder-mysql-router:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-router
|
||||||
|
|
||||||
|
mysql-innodb-cluster:
|
||||||
|
charm: cs:~openstack-charmers-next/mysql-innodb-cluster
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
to:
|
||||||
|
- '0'
|
||||||
|
- '1'
|
||||||
|
- '2'
|
||||||
|
|
||||||
|
keystone:
|
||||||
|
charm: cs:~openstack-charmers-next/keystone
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
rabbitmq-server:
|
||||||
|
charm: cs:~openstack-charmers-next/rabbitmq-server
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
cinder:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
block-device: None
|
||||||
|
glance-api-version: 2
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
cinder-ceph:
|
||||||
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
num_units: 0
|
||||||
|
options:
|
||||||
|
rbd-mirroring-mode: image
|
||||||
|
|
||||||
|
glance:
|
||||||
|
charm: cs:~openstack-charmers-next/glance
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
nova-compute:
|
||||||
|
charm: cs:~openstack-charmers-next/nova-compute
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
|
ceph-mon:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-osd:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
bluestore: False
|
||||||
|
use-direct-io: False
|
||||||
|
osd-devices: /opt
|
||||||
|
|
||||||
|
ceph-rbd-mirror:
|
||||||
|
series: *series
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-mon-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-mon
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
expected-osd-count: 3
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
ceph-osd-b:
|
||||||
|
charm: cs:~openstack-charmers-next/ceph-osd
|
||||||
|
num_units: 3
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
bluestore: False
|
||||||
|
use-direct-io: False
|
||||||
|
osd-devices: /opt
|
||||||
|
|
||||||
|
ceph-rbd-mirror-b:
|
||||||
|
series: *series
|
||||||
|
charm: ../../../ceph-rbd-mirror
|
||||||
|
num_units: 1
|
||||||
|
options:
|
||||||
|
source: *openstack-origin
|
||||||
|
|
||||||
|
relations:
|
||||||
|
|
||||||
|
- - keystone:shared-db
|
||||||
|
- keystone-mysql-router:shared-db
|
||||||
|
- - keystone-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - glance:shared-db
|
||||||
|
- glance-mysql-router:shared-db
|
||||||
|
- - glance-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - cinder:shared-db
|
||||||
|
- cinder-mysql-router:shared-db
|
||||||
|
- - cinder-mysql-router:db-router
|
||||||
|
- mysql-innodb-cluster:db-router
|
||||||
|
|
||||||
|
- - rabbitmq-server
|
||||||
|
- cinder
|
||||||
|
|
||||||
|
- - keystone
|
||||||
|
- cinder
|
||||||
|
- - keystone
|
||||||
|
- glance
|
||||||
|
|
||||||
|
- - cinder
|
||||||
|
- cinder-ceph
|
||||||
|
- - cinder-ceph:ceph
|
||||||
|
- ceph-mon:client
|
||||||
|
- - cinder-ceph:ceph-replication-device
|
||||||
|
- ceph-mon-b:client
|
||||||
|
|
||||||
|
- - nova-compute:ceph-access
|
||||||
|
- cinder-ceph:ceph-access
|
||||||
|
- - nova-compute:amqp
|
||||||
|
- rabbitmq-server:amqp
|
||||||
|
|
||||||
|
- - glance:image-service
|
||||||
|
- nova-compute:image-service
|
||||||
|
- - glance
|
||||||
|
- ceph-mon
|
||||||
|
|
||||||
|
- - ceph-mon:osd
|
||||||
|
- ceph-osd:mon
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror:ceph-local
|
||||||
|
- - ceph-mon
|
||||||
|
- ceph-rbd-mirror-b:ceph-remote
|
||||||
|
|
||||||
|
- - ceph-mon-b:osd
|
||||||
|
- ceph-osd-b:mon
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror-b:ceph-local
|
||||||
|
- - ceph-mon-b
|
||||||
|
- ceph-rbd-mirror:ceph-remote
|
@ -48,6 +48,7 @@ applications:
|
|||||||
options:
|
options:
|
||||||
block-device: None
|
block-device: None
|
||||||
glance-api-version: 2
|
glance-api-version: 2
|
||||||
|
openstack-origin: *openstack-origin
|
||||||
|
|
||||||
cinder-ceph:
|
cinder-ceph:
|
||||||
charm: cs:~openstack-charmers-next/cinder-ceph
|
charm: cs:~openstack-charmers-next/cinder-ceph
|
||||||
|
@ -3,6 +3,7 @@ smoke_bundles:
|
|||||||
- bionic-train
|
- bionic-train
|
||||||
gate_bundles:
|
gate_bundles:
|
||||||
- bionic-train
|
- bionic-train
|
||||||
|
- bionic-train-image-mirroring
|
||||||
- bionic-stein
|
- bionic-stein
|
||||||
- bionic-queens
|
- bionic-queens
|
||||||
comment: |
|
comment: |
|
||||||
@ -10,12 +11,17 @@ comment: |
|
|||||||
the functional tests.
|
the functional tests.
|
||||||
dev_bundles:
|
dev_bundles:
|
||||||
- groovy-victoria
|
- groovy-victoria
|
||||||
|
- groovy-victoria-image-mirroring
|
||||||
- focal-victoria
|
- focal-victoria
|
||||||
|
- focal-victoria-image-mirroring
|
||||||
- bionic-queens-e2e
|
- bionic-queens-e2e
|
||||||
- bionic-queens-e2e-lxd
|
- bionic-queens-e2e-lxd
|
||||||
- bionic-rocky
|
- bionic-rocky
|
||||||
- bionic-ussuri
|
- bionic-ussuri
|
||||||
|
# This is a dev bundle because we hit https://bugs.launchpad.net/charm-ceph-rbd-mirror/+bug/1892201.
|
||||||
|
- bionic-ussuri-image-mirroring
|
||||||
- focal-ussuri
|
- focal-ussuri
|
||||||
|
- focal-ussuri-image-mirroring
|
||||||
- xenial-queens
|
- xenial-queens
|
||||||
- xenial-pike
|
- xenial-pike
|
||||||
configure:
|
configure:
|
||||||
|
@ -55,6 +55,7 @@ class TestCephRBDMirrorActions(test_utils.PatchHelper):
|
|||||||
self.endpoint_from_name.assert_called_once_with('ceph-local')
|
self.endpoint_from_name.assert_called_once_with('ceph-local')
|
||||||
self.crm_charm.eligible_pools.assert_called_once_with(endpoint.pools)
|
self.crm_charm.eligible_pools.assert_called_once_with(endpoint.pools)
|
||||||
self.action_get.assert_has_calls([
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('pools'),
|
||||||
mock.call('force'),
|
mock.call('force'),
|
||||||
mock.call('verbose'),
|
mock.call('verbose'),
|
||||||
mock.call('format'),
|
mock.call('format'),
|
||||||
@ -76,7 +77,7 @@ class TestCephRBDMirrorActions(test_utils.PatchHelper):
|
|||||||
sorted(self.action_set.call_args[0][0]['output'].split('\n')),
|
sorted(self.action_set.call_args[0][0]['output'].split('\n')),
|
||||||
['apool: Promoted 0 mirrored images',
|
['apool: Promoted 0 mirrored images',
|
||||||
'bpool: Promoted 0 mirrored images'])
|
'bpool: Promoted 0 mirrored images'])
|
||||||
self.action_get.side_effect = [True, True, False]
|
self.action_get.side_effect = [None, True, True, False]
|
||||||
self.check_output.reset_mock()
|
self.check_output.reset_mock()
|
||||||
actions.rbd_mirror_action(['promote'])
|
actions.rbd_mirror_action(['promote'])
|
||||||
self.check_output.assert_has_calls([
|
self.check_output.assert_has_calls([
|
||||||
@ -90,6 +91,21 @@ class TestCephRBDMirrorActions(test_utils.PatchHelper):
|
|||||||
universal_newlines=True),
|
universal_newlines=True),
|
||||||
], any_order=True)
|
], any_order=True)
|
||||||
self.action_get.assert_has_calls([
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('pools'),
|
||||||
|
mock.call('force'),
|
||||||
|
mock.call('verbose'),
|
||||||
|
mock.call('format'),
|
||||||
|
])
|
||||||
|
self.action_get.side_effect = ['apool', True, True, False]
|
||||||
|
self.check_output.reset_mock()
|
||||||
|
actions.rbd_mirror_action(['promote'])
|
||||||
|
self.check_output.assert_called_once_with(
|
||||||
|
['rbd', '--id', 'acephid', 'mirror', 'pool', 'promote',
|
||||||
|
'--force', '--verbose', 'apool'],
|
||||||
|
stderr=actions.subprocess.STDOUT,
|
||||||
|
universal_newlines=True)
|
||||||
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('pools'),
|
||||||
mock.call('force'),
|
mock.call('force'),
|
||||||
mock.call('verbose'),
|
mock.call('verbose'),
|
||||||
mock.call('format'),
|
mock.call('format'),
|
||||||
@ -123,16 +139,38 @@ class TestCephRBDMirrorActions(test_utils.PatchHelper):
|
|||||||
self.endpoint_from_name.return_value = endpoint
|
self.endpoint_from_name.return_value = endpoint
|
||||||
self.crm_charm.eligible_pools.return_value = endpoint.pools
|
self.crm_charm.eligible_pools.return_value = endpoint.pools
|
||||||
self.crm_charm.ceph_id = 'acephid'
|
self.crm_charm.ceph_id = 'acephid'
|
||||||
self.action_get.return_value = False
|
self.action_get.side_effect = [False, None]
|
||||||
actions.resync_pools([])
|
actions.resync_pools([])
|
||||||
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('i-really-mean-it'),
|
||||||
|
])
|
||||||
self.assertFalse(self.check_output.called)
|
self.assertFalse(self.check_output.called)
|
||||||
self.assertFalse(self.action_set.called)
|
self.assertFalse(self.action_set.called)
|
||||||
self.action_get.return_value = True
|
self.action_get.side_effect = [True, 'bpool']
|
||||||
self.check_output.side_effect = [
|
self.check_output.return_value = json.dumps([])
|
||||||
json.dumps(['imagea']),
|
|
||||||
'resync flagged for imagea\n',
|
|
||||||
]
|
|
||||||
actions.resync_pools([])
|
actions.resync_pools([])
|
||||||
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('i-really-mean-it'),
|
||||||
|
mock.call('pools'),
|
||||||
|
])
|
||||||
|
self.check_output.assert_called_once_with(
|
||||||
|
['rbd', '--id', 'acephid', '--format', 'json',
|
||||||
|
'-p', 'bpool', 'ls'],
|
||||||
|
universal_newlines=True)
|
||||||
|
self.action_set.assert_called_once_with({'output': ''})
|
||||||
|
self.action_get.side_effect = [True, None]
|
||||||
|
self.check_output.side_effect = [
|
||||||
|
json.dumps(['imagea', 'imageb']),
|
||||||
|
json.dumps({'mirroring': {'state': 'enabled'}}),
|
||||||
|
'resync flagged for imagea\n',
|
||||||
|
json.dumps({'mirroring': {'state': 'disabled'}}),
|
||||||
|
]
|
||||||
|
self.check_output.reset_mock()
|
||||||
|
actions.resync_pools([])
|
||||||
|
self.action_get.assert_has_calls([
|
||||||
|
mock.call('i-really-mean-it'),
|
||||||
|
mock.call('pools'),
|
||||||
|
])
|
||||||
self.assertEquals(
|
self.assertEquals(
|
||||||
sorted(self.action_set.call_args[0][0]['output'].split('\n')),
|
sorted(self.action_set.call_args[0][0]['output'].split('\n')),
|
||||||
['apool/imagea: resync flagged for imagea'])
|
['apool/imagea: resync flagged for imagea'])
|
||||||
|
Loading…
Reference in New Issue
Block a user