diff --git a/bin/create_release b/bin/create_release index db743814c..4069ebe5d 100755 --- a/bin/create_release +++ b/bin/create_release @@ -81,7 +81,7 @@ def main(): elif response.status == 409: logger.error("Release '%s' already exists" % httpdata['name']) sys.exit(0) - elif response.status < 201 and response.status >= 300: + elif response.status < 201 or response.status >= 300: logger.error("Error in creating release: %s" % response.read()) sys.exit(1) diff --git a/nailgun/api/handlers.py b/nailgun/api/handlers.py index 34c719692..2d3ebc0bd 100644 --- a/nailgun/api/handlers.py +++ b/nailgun/api/handlers.py @@ -244,8 +244,8 @@ class ClusterChangesHandler(JSONHandler): pc.password = settings.COBBLER_PASSWORD try: pd = ProvisionFactory.getInstance(pc) - except: - raise web.badrequest() + except Exception as err: + raise web.badrequest(str(err)) pf = ProvisionProfile(settings.COBBLER_PROFILE) ndp = ProvisionPower("ssh") ndp.power_user = "root" @@ -253,6 +253,9 @@ class ClusterChangesHandler(JSONHandler): for node in itertools.ifilter( lambda n: n.status == "discover", cluster.nodes ): + node.status = u"provisioning" + web.ctx.orm.add(node) + web.ctx.orm.commit() nd = ProvisionNode(node.id) nd.driver = pd nd.mac = node.mac diff --git a/nailgun/provision/__init__.py b/nailgun/provision/__init__.py index db2b8bf67..2d0ac0630 100644 --- a/nailgun/provision/__init__.py +++ b/nailgun/provision/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import re diff --git a/nailgun/provision/driver/cobbler.py b/nailgun/provision/driver/cobbler.py index 8df3f0422..c8b0e5cd4 100644 --- a/nailgun/provision/driver/cobbler.py +++ b/nailgun/provision/driver/cobbler.py @@ -1,8 +1,12 @@ +# -*- coding: utf-8 -*- + +import logging +import xmlrpclib +from itertools import repeat + from provision import ProvisionException from provision import ProvisionAlreadyExists, ProvisionDoesNotExist from provision import Provision -import logging -import xmlrpclib class Cobbler(Provision): @@ -45,120 +49,59 @@ class Cobbler(Provision): systems = self.server.find_system({'name': name}, self.token) if systems: if len(systems) > 1: - self.logger.error( - "There are more than one system found by pattern: %s", - name - ) - raise ProvisionException( - "There are more than one system found by pattern: %s", - name - ) + err = "There are more than one system" + " found by pattern: %s" % name + self.logger.error(err) + raise ProvisionException(err) return systems[0] return None - # FIXME - # IT NEEDED TO BE IMPLEMENTED AS ONLY METHOD FOR ADD AND EDIT - def add_system(self, name, mac, power, profile, kopts=""): + def update_system(self, name, mac, power, profile, kopts="", create=False): if self.system_by_name(name): - self.logger.error( - "Trying to add system that already exists: %s", - name - ) - raise ProvisionAlreadyExists( - "System with name %s already exists. Try to edit it.", - name - ) - system_id = self.server.new_system(self.token) - self.server.modify_system( - system_id, 'name', name, self.token - ) - self.server.modify_system( - system_id, 'profile', profile.name, self.token - ) - self.server.modify_system( - system_id, 'kopts', kopts, self.token - ) - self.server.modify_system( - system_id, 'modify_interface', { - "macaddress-eth0": mac, - }, self.token - ) - self.server.modify_system( - system_id, 'power_type', power.power_type, self.token - ) - if power.power_user: - self.server.modify_system( - system_id, 'power_user', power.power_user, self.token - ) - if power.power_pass: - self.server.modify_system( - system_id, 'power_pass', power.power_pass, self.token - ) - if power.power_id: - self.server.modify_system( - system_id, 'power_id', power.power_id, self.token - ) - if power.power_address: - self.server.modify_system( - system_id, 'power_address', power.power_address, self.token - ) - self.server.save_system(system_id, self.token) - return self.system_by_name(name) + err = "System with name %s already exists." + " Try to edit it." % name + self.logger.error(err) + raise ProvisionAlreadyExists(err) + if create: + system_id = self.server.new_system(self.token) + else: + system_id = self.server.get_system_handle(name, self.token) - def edit_system(self, name, mac, power, profile, kopts=""): - if not self.system_by_name(name): - self.logger.error( - "Trying to edit system that does not exist: %s", - name - ) - raise ProvisionDoesNotExist( - "System with name %s does not exist. Try to edit it.", - name - ) - system_id = self.server.get_system_handle(name, self.token) - self.server.modify_system( - system_id, 'profile', profile.name, self.token - ) - self.server.modify_system( - system_id, 'kopts', kopts, self.token - ) - self.server.modify_system( - system_id, 'modify_interface', - { + fields = { + "name": name, + "profile": profile.name, + "kopts": kopts, + "modify_interface": { "macaddress-eth0": mac, - }, self.token - ) + }, + } - self.server.modify_system( - system_id, 'power_type', power.power_type, self.token - ) - if power.power_user: + for key, value in fields.iteritems(): self.server.modify_system( - system_id, 'power_user', power.power_user, self.token - ) - if power.power_pass: - self.server.modify_system( - system_id, 'power_pass', power.power_pass, self.token - ) - if power.power_id: - self.server.modify_system( - system_id, 'power_id', power.power_id, self.token - ) - if power.power_address: - self.server.modify_system( - system_id, 'power_address', power.power_address, self.token + system_id, key, value, self.token ) + + if_fields = { + "power_type": power.power_type, + "power_user": power.power_user, + "power_pass": power.power_pass, + "power_id": power.power_id, + "power_address": power.power_address + } + for key, value in if_fields.iteritems(): + if value: + self.server.modify_system( + system_id, key, value, self.token + ) self.server.save_system(system_id, self.token) return self.system_by_name(name) def power_system(self, name, power): if not self.system_by_name(name): - self.logger.error( - "Trying to power system that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "System with name %s does not exist. Try to edit it." % name - ) + err = "Trying to power system" + " that does not exist: %s" % name + self.logger.error(err) + raise ProvisionDoesNotExist(err) if power not in ('on', 'off', 'reboot', 'status'): raise ValueError("Power has invalid value") system_id = self.server.get_system_handle(name, self.token) @@ -167,21 +110,18 @@ class Cobbler(Provision): def handle_system(self, name, mac, power, profile, kopts=""): try: - self.edit_system(name, mac, power, profile, kopts) + self.update_system(name, mac, power, profile, kopts) self.logger.info("Edited system: %s" % name) except ProvisionDoesNotExist: - self.add_system(name, mac, power, profile, kopts) + self.update_system(name, mac, power, profile, kopts, create=True) self.logger.info("Added system: %s" % name) def del_system(self, name): system = self.system_by_name(name) if not system: - self.logger.error( - "Trying to remove system that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "There is no system with name %s" % name - ) + err = "There is no system with name %s" % name + self.logger.error(err) + raise ProvisionDoesNotExist(err) self.server.remove_system(name, self.token) self.logger.info("Removed system %s" % name) @@ -189,29 +129,22 @@ class Cobbler(Provision): profiles = self.server.find_profile({'name': name}, self.token) if profiles: if len(profiles) > 1: - self.logger.error( - "There are more than one profile found by pattern: %s", - name - ) - raise ProvisionException( - "There are more than one profile found by pattern: %s", - name - ) + err = "There are more than one profile" + " found by pattern: %s" % name + self.logger.error(err) + raise ProvisionException(err) return profiles[0] return None - # FIXME - # IT NEEDED TO BE IMPLEMENTED AS ONLY METHOD FOR ADD AND EDIT - def add_profile(self, name, distro, kickstart): + def update_profile(self, name, distro, kickstart, create=False): if self.profile_by_name(name): - self.logger.error( - "Trying to add profile that already exists: %s" % name - ) - raise ProvisionAlreadyExists( - "Profile with name %s already exists. Try to edit it.", - name - ) - profile_id = self.server.new_profile(self.token) + err = "Trying to add profile that already exists: %s" % name + self.logger.error(err) + raise ProvisionAlreadyExists(err) + if create: + profile_id = self.server.new_profile(self.token) + else: + profile_id = self.server.get_profile_handle(name, self.token) self.server.modify_profile(profile_id, 'name', name, self.token) self.server.modify_profile(profile_id, 'distro', distro, self.token) self.server.modify_profile( @@ -220,39 +153,20 @@ class Cobbler(Provision): self.server.save_profile(profile_id, self.token) return self.profile_by_name(name) - def edit_profile(self, name, distro, kickstart): - if not self.profile_by_name(name): - self.logger.error( - "Trying to edit profile that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "Profile with name %s does not exist. Try to add it." % name - ) - profile_id = self.server.get_profile_handle(name, self.token) - self.server.modify_profile(profile_id, 'distro', distro, self.token) - self.server.modify_profile( - profile_id, 'kickstart', kickstart, self.token - ) - self.server.save_profile(profile_id, self.token) - return self.profile_by_name(name) - def handle_profile(self, name, distro, seed): try: - self.edit_profile(name, distro, seed) + self.update_profile(name, distro, seed) self.logger.info("Edited profile: %s" % name) except ProvisionDoesNotExist: - self.add_profile(name, distro, seed) + self.update_profile(name, distro, seed, create=True) self.logger.info("Added profile: %s" % name) def del_profile(self, name): profile = self.profile_by_name(name) if not profile: - self.logger.error( - "Trying to remove profile that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "There is no profile with name %s" % name - ) + err = "Trying to remove profile that does not exist: %s" % name + self.logger.error(err) + raise ProvisionDoesNotExist(err) self.server.remove_profile(name, self.token) self.logger.info("Removed profile: %s" % name) @@ -260,28 +174,24 @@ class Cobbler(Provision): distros = self.server.find_distro({'name': name}, self.token) if distros: if len(distros) > 1: - self.logger.error( - "There are more than one distro found by pattern: %s", - name - ) - raise ProvisionException( - "There are more than one distro found by pattern %s", - name - ) + err = "There are more than one distro" + " found by pattern: %s" % name + self.logger.error(err) + raise ProvisionException(err) return distros[0] return None - # FIXME - # IT NEEDED TO BE IMPLEMENTED AS ONLY METHOD FOR ADD AND EDIT - def add_distro(self, name, kernel, initrd, arch, breed, osversion): + def update_distro( + self, name, kernel, initrd, arch, breed, osversion, + create=False): if self.distro_by_name(name): - self.logger.error( - "Trying to add distro that already exists: %s" % name - ) - raise ProvisionAlreadyExists( - "Distro with name %s already exists. Try to edit it." % name - ) - distro_id = self.server.new_distro(self.token) + err = "Trying to add distro that already exists: %s" % name + self.logger.error(err) + raise ProvisionAlreadyExists(err) + if create: + distro_id = self.server.new_distro(self.token) + else: + distro_id = self.server.get_distro_handle(name, self.token) self.server.modify_distro(distro_id, 'name', name, self.token) self.server.modify_distro(distro_id, 'kernel', kernel, self.token) self.server.modify_distro(distro_id, 'initrd', initrd, self.token) @@ -293,42 +203,23 @@ class Cobbler(Provision): self.server.save_distro(distro_id, self.token) return self.distro_by_name(name) - def edit_distro(self, name, kernel, initrd, arch, breed, osversion): - if not self.distro_by_name(name): - self.logger.error( - "Trying to edit distro that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "Distro with name %s does not exist. Try to add it." % name - ) - distro_id = self.server.get_distro_handle(name, self.token) - self.server.modify_distro(distro_id, 'kernel', kernel, self.token) - self.server.modify_distro(distro_id, 'initrd', initrd, self.token) - self.server.modify_distro(distro_id, 'arch', arch, self.token) - self.server.modify_distro(distro_id, 'breed', breed, self.token) - self.server.modify_distro( - distro_id, 'os_version', osversion, self.token - ) - self.server.save_distro(distro_id, self.token) - return self.distro_by_name(name) - def handle_distro(self, name, kernel, initrd, arch, os, osversion): try: - self.edit_distro(name, kernel, initrd, arch, os, osversion) + self.update_distro(name, kernel, initrd, arch, os, osversion) self.logger.info("Edited distro: %s" % name) except ProvisionDoesNotExist: - self.add_distro(name, kernel, initrd, arch, os, osversion) + self.update_distro( + name, kernel, initrd, arch, os, osversion, create=True + ) self.logger.info("Added distro: %s" % name) def del_distro(self, name): distro = self.distro_by_name(name) if not distro: - self.logger.error( - "Trying to remove distro that does not exist: %s" % name - ) - raise ProvisionDoesNotExist( - "There is no distro with name %s" % name - ) + err = "Trying to remove distro" + " that does not exist: %s" % name + self.logger.error(err) + raise ProvisionDoesNotExist(err) self.server.remove_distro(name, self.token) self.logger.info("Removed distro %s" % name) diff --git a/nailgun/provision/model/__init__.py b/nailgun/provision/model/__init__.py index 94601e6af..bc0ba6b97 100644 --- a/nailgun/provision/model/__init__.py +++ b/nailgun/provision/model/__init__.py @@ -1,7 +1,10 @@ +# -*- coding: utf-8 -*- + import re -from provision import ProvisionException import logging +from provision import ProvisionException + class ModelObject(object): _driver = None diff --git a/nailgun/provision/test_model.py b/nailgun/provision/test_model.py index 4d674c54e..067ceb981 100644 --- a/nailgun/provision/test_model.py +++ b/nailgun/provision/test_model.py @@ -1,11 +1,14 @@ +# -*- coding: utf-8 -*- + +from unittest import TestCase + from model import Validator from model.profile import Profile from model.node import Node from model.power import Power -from nose.tools import eq_ -class TestValidator: +class TestValidator(TestCase): def setUp(self): self.mac = "c8:0a:a9:a6:ff:28" self.platform = ("ubuntu", "precise", "x86_64") @@ -14,26 +17,26 @@ class TestValidator: self.arch = "x86_64" def test_is_mac_valid(self): - assert Validator.is_mac_valid(self.mac) + self.assertTrue(Validator.is_mac_valid(self.mac)) def test_is_platform_valid(self): - assert Validator.is_platform_valid( + self.assertTrue(Validator.is_platform_valid( self.platform[0], self.platform[1], self.platform[2] - ) + )) def test_is_os_valid(self): - assert Validator.is_os_valid(self.os) + self.assertTrue(Validator.is_os_valid(self.os)) def test_is_osversion_valid(self): - assert Validator.is_osversion_valid(self.osversion) + self.assertTrue(Validator.is_osversion_valid(self.osversion)) def test_is_arch_valid(self): - assert Validator.is_arch_valid(self.arch) + self.assertTrue(Validator.is_arch_valid(self.arch)) -class TestProfile: +class TestProfile(TestCase): def setUp(self): self.profile = Profile('profile') self.arch = "x86_64" @@ -46,34 +49,34 @@ class TestProfile: def test_arch(self): self.profile.arch = self.arch - eq_(self.profile.arch, self.arch) + self.assertEqual(self.profile.arch, self.arch) def test_os(self): self.profile.os = self.os - eq_(self.profile.os, self.os) + self.assertEqual(self.profile.os, self.os) def test_osversion(self): self.profile.osversion = self.osversion - eq_(self.profile.osversion, self.osversion) + self.assertEqual(self.profile.osversion, self.osversion) def test_kernel(self): self.profile.kernel = self.kernel - eq_(self.profile.kernel, self.kernel) + self.assertEqual(self.profile.kernel, self.kernel) def test_initrd(self): self.profile.initrd = self.initrd - eq_(self.profile.initrd, self.initrd) + self.assertEqual(self.profile.initrd, self.initrd) def test_seed(self): self.profile.seed = self.seed - eq_(self.profile.seed, self.seed) + self.assertEqual(self.profile.seed, self.seed) def test_kopts(self): self.profile.kopts = self.kopts - eq_(self.profile.kopts, self.kopts) + self.assertEqual(self.profile.kopts, self.kopts) -class TestNode: +class TestNode(TestCase): def setUp(self): self.node = Node('node') self.mac = "c8:0a:a9:a6:ff:28" @@ -84,26 +87,26 @@ class TestNode: def test_mac(self): self.node.mac = self.mac - eq_(self.node.mac, self.mac) + self.assertEqual(self.node.mac, self.mac) def test_profile(self): self.node.profile = self.profile - eq_(self.node.profile, self.profile) + self.assertEqual(self.node.profile, self.profile) def test_kopts(self): self.node.kopts = self.kopts - eq_(self.node.kopts, self.kopts) + self.assertEqual(self.node.kopts, self.kopts) def test_pxe(self): self.node.pxe = self.pxe - eq_(self.node.pxe, self.pxe) + self.assertEqual(self.node.pxe, self.pxe) def test_power(self): self.node.power = self.power - eq_(self.node.power, self.power) + self.assertEqual(self.node.power, self.power) -class TestPower: +class TestPower(TestCase): def setUp(self): self.power = Power('ssh') self.power_user = "user" @@ -113,16 +116,16 @@ class TestPower: def test_power_user(self): self.power.power_user = self.power_user - eq_(self.power.power_user, self.power_user) + self.assertEqual(self.power.power_user, self.power_user) def test_power_pass(self): self.power.power_pass = self.power_pass - eq_(self.power.power_pass, self.power_pass) + self.assertEqual(self.power.power_pass, self.power_pass) def test_power_address(self): self.power.power_address = self.power_address - eq_(self.power.power_address, self.power_address) + self.assertEqual(self.power.power_address, self.power_address) def test_power_id(self): self.power.power_id = self.power_id - eq_(self.power.power_id, self.power_id) + self.assertEqual(self.power.power_id, self.power_id)