Skip to content

Commit

Permalink
Merge branch 'sc-20602/provide-a-way-in-the-cdr-ui-api-to-do-a-bulk' …
Browse files Browse the repository at this point in the history
…into 'master'

#20602 Add ConfigsService.bulk_upgrade method

See merge request qacafe/cdrouter/cdrouter.py!17
  • Loading branch information
Niels Widger committed Nov 21, 2022
2 parents 0407f3f + 42e287d commit 0fa16a1
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 26 deletions.
15 changes: 15 additions & 0 deletions cdrouter/configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,21 @@ def bulk_edit(self, _fields, ids=None, filter=None, type=None, all=False, testva
return self.service.bulk_edit(self.base, self.RESOURCE,
_fields, ids=ids, filter=filter, type=type, all=all, testvars=testvars)

def bulk_upgrade(self, ids=None, filter=None, type=None, all=False): # pylint: disable=redefined-builtin
"""Bulk upgrade a set of configs.
:param ids: (optional) Int list of config IDs.
:param filter: (optional) String list of filters.
:param type: (optional) `union` or `inter` as string.
:param all: (optional) Apply to all if bool `True`.
"""
json = {}
if ids is not None:
json[self.RESOURCE] = [{'id': str(x)} for x in ids]

return self.service.post(self.base,
params={'bulk': 'upgrade', 'filter': filter, 'type': type, 'all': all}, json=json)

def bulk_delete(self, ids=None, filter=None, type=None, all=False): # pylint: disable=redefined-builtin
"""Bulk delete a set of configs.
Expand Down
49 changes: 48 additions & 1 deletion tests/test_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from cdrouter.filters import Field as field
from cdrouter.users import User

from .utils import my_cdrouter, my_c, import_all_from_file # pylint: disable=unused-import
from .utils import cdrouter_version, my_cdrouter, my_c, import_all_from_file # pylint: disable=unused-import

class TestConfigs:
def test_list(self, c):
Expand Down Expand Up @@ -377,6 +377,53 @@ def test_bulk_edit(self, c):
assert c.configs.get(cfg.id).tags == new_tags
assert c.configs.get_testvar(cfg.id, 'lanIp').value == '3.3.3.3'

@pytest.mark.skipif(cdrouter_version() < (13, 9, 1), reason="bulk upgrade endpoint added in 13.9.1")
def test_bulk_upgrade(self, c):
for ii in range(1, 4):
cfg = Config(
name='My config {}'.format(ii),
contents='# i have not been upgraded'
)
cfg = c.configs.create(cfg)

c.configs.bulk_upgrade(ids=[1, 3])

for ii in range(1, 4):
cfg = c.configs.get(ii)
if ii in (1, 3):
assert 'SECTION' in cfg.contents
else:
assert cfg.contents == '# i have not been upgraded'

for ii in range(1, 4):
cfg = c.configs.get(ii)
cfg.contents = '# i have not been upgraded'
c.configs.edit(cfg)
cfg = c.configs.get(ii)
assert cfg.contents == '# i have not been upgraded'

c.configs.bulk_upgrade(filter=[field('id').eq(1), field('id').eq(3)], type='union')

for ii in range(1, 4):
cfg = c.configs.get(ii)
if ii in (1, 3):
assert 'SECTION' in cfg.contents
else:
assert cfg.contents == '# i have not been upgraded'

for ii in range(1, 4):
cfg = c.configs.get(ii)
cfg.contents = '# i have not been upgraded'
c.configs.edit(cfg)
cfg = c.configs.get(ii)
assert cfg.contents == '# i have not been upgraded'

c.configs.bulk_upgrade(all=True)

for ii in range(1, 4):
cfg = c.configs.get(ii)
assert 'SECTION' in cfg.contents

def test_bulk_delete(self, c):
cfg = Config(
name='My config',
Expand Down
6 changes: 4 additions & 2 deletions tests/test_devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from cdrouter.filters import Field as field
from cdrouter.users import User

from .utils import my_cdrouter, my_c, import_all_from_file # pylint: disable=unused-import
from .utils import cdrouter_version, my_cdrouter, my_c, import_all_from_file # pylint: disable=unused-import

class TestDevices:
def test_list(self, c):
Expand Down Expand Up @@ -98,7 +98,9 @@ def test_create(self, c):
assert d2.default_ip == d.default_ip
assert d2.default_login == d.default_login
assert d2.default_password == d.default_password
assert d2.default_ssid == d.default_ssid
# default_ssid field added in 13.8.1
if cdrouter_version() >= (13, 8, 1):
assert d2.default_ssid == d.default_ssid
assert d2.location == d.location
assert d2.device_category == d.device_category
assert d2.manufacturer == d.manufacturer
Expand Down
67 changes: 44 additions & 23 deletions tests/test_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@

import pytest

from marshmallow import Schema, post_load

from cdrouter.cdrouter import CDRouterError
from cdrouter.cdr_datetime import DateTime
from cdrouter.filters import Field as field
from cdrouter.jobs import Job

Expand All @@ -20,7 +23,7 @@ def test_list(self, c):
assert links.total == 0

package = c.packages.get_by_name('example')
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

(jobs, links) = c.jobs.list()
assert len(jobs) == 1
Expand All @@ -32,7 +35,7 @@ def test_iter_list(self, c):
assert len(list(c.jobs.iter_list(limit=1))) == 0

package = c.packages.get_by_name('example')
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

assert len(list(c.jobs.iter_list(limit=1))) == 1

Expand All @@ -42,7 +45,7 @@ def test_get(self, c):
assert len(list(c.jobs.iter_list())) == 0

package = c.packages.get_by_name('example')
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

assert len(list(c.jobs.iter_list())) == 1

Expand Down Expand Up @@ -74,11 +77,11 @@ def test_edit(self, c):

package = c.packages.get_by_name('example')

c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

jobs = list(c.jobs.iter_list(filter=[field('active').eq(False)]))

Expand All @@ -104,7 +107,7 @@ def test_launch(self, c):

assert len(list(c.jobs.iter_list())) == 0

j = c.jobs.launch(Job(package_id=package.id))
j = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
assert j.id > 0
assert j.package_id == package.id
assert j.package_name == package.name
Expand All @@ -125,11 +128,11 @@ def test_delete(self, c):

assert len(list(c.jobs.iter_list())) == 0

c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

assert len(list(c.jobs.iter_list())) == 5

Expand All @@ -145,7 +148,7 @@ def test_get_interfaces(self, c):

package = c.packages.get_by_name('example')

j = c.jobs.launch(Job(package_id=package.id))
j = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))

intfs = c.jobs.get_interfaces(j)
assert len(intfs) == 1
Expand All @@ -160,9 +163,9 @@ def test_bulk_launch(self, c):
package = c.packages.get_by_name('example')

c.jobs.bulk_launch(jobs=[
Job(package_id=package.id),
Job(package_id=package.id),
Job(package_id=package.id)
Job(package_id=package.id, run_at=self.run_at_year_9999()),
Job(package_id=package.id, run_at=self.run_at_year_9999()),
Job(package_id=package.id, run_at=self.run_at_year_9999())
])

assert len(list(c.jobs.iter_list())) == 3
Expand All @@ -176,11 +179,11 @@ def test_bulk_delete(self, c):

package = c.packages.get_by_name('example')

c.jobs.launch(Job(package_id=package.id))
j2 = c.jobs.launch(Job(package_id=package.id))
j3 = c.jobs.launch(Job(package_id=package.id))
j4 = c.jobs.launch(Job(package_id=package.id))
j5 = c.jobs.launch(Job(package_id=package.id))
c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
j2 = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
j3 = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
j4 = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
j5 = c.jobs.launch(Job(package_id=package.id, run_at=self.run_at_year_9999()))
assert len(list(c.jobs.iter_list())) == 5

c.jobs.bulk_delete(ids=[j2.id, j3.id])
Expand All @@ -196,3 +199,21 @@ def test_bulk_delete(self, c):
c.jobs.get(j4.id)
with pytest.raises(CDRouterError, match='no such Job'):
c.jobs.get(j5.id)

def run_at_year_9999(self):
data = { 'timestamp': '9999-01-01T12:00:00-00:00' }
schema = TimestampSchema()
timestamp = schema.load(data)
run_at = timestamp.timestamp
return run_at

class Timestamp(object):
def __init__(self, **kwargs):
self.timestamp = kwargs.get('timestamp', None)

class TimestampSchema(Schema):
timestamp = DateTime()

@post_load
def post_load(self, data, **kwargs): # pylint: disable=unused-argument
return Timestamp(**data)
26 changes: 26 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
# All Rights Reserved.
#

from collections import namedtuple
from os import environ
from os.path import basename
import re
import tarfile
from time import sleep, time

Expand All @@ -13,6 +15,30 @@

from cdrouter import CDRouter

CDRouterVersion = namedtuple('CDRouterVersion', ['major', 'minor', 'build'], defaults=[0, 0])

_cdrouter_version = None
def cdrouter_version():
global _cdrouter_version # pylint: disable=global-statement
if _cdrouter_version is not None:
return _cdrouter_version
client = docker.from_env()
client.images.pull(environ.get('CDR_DOCKER_IMAGE'))
container = client.containers.create(
environ.get('CDR_DOCKER_IMAGE'),
['-c', '/usr/cdrouter/bin/cdrouter -version'],
entrypoint=['/bin/bash'])
container.start()
container.wait()
ver = container.logs()
container.remove()
m = re.search(r'Version (\d+)\.(\d+) build (\d+)', str(ver))
if m is None:
raise ValueError('unable to parse cdrouter version: {}'.format(ver))
major, minor, build = int(m.group(1)), int(m.group(2)), int(m.group(3))
_cdrouter_version = CDRouterVersion(major, minor, build)
return _cdrouter_version

@pytest.fixture(name="cdrouter")
def my_cdrouter():
client = docker.from_env()
Expand Down

0 comments on commit 0fa16a1

Please sign in to comment.