def __validateNetwork(self, network: Network) -> None:         \
            # pylint: disable=no-self-use
        """
        Raises:
            InvalidArgument
        """

        optionDict = {}

        if 'address' in network and not network['address']:
            raise InvalidArgument('Network address not set')

        if 'netmask' in network and not network['netmask']:
            raise InvalidArgument('Network mask not set')

        # Get all of the network options
        if network.getOptions():
            for option in network.getOptions().split(';'):
                tokens = option.split('=')
                if len(tokens) == 2:
                    key, value = tokens
                    optionDict[key] = value

        if 'startIp' in network and network['startIp']:
            # Validate that the specified start IP address is on the
            # provided subnet

            startIp = ipaddress.IPv4Address(str(network['startIp']))
        else:
            # Start IP address not provided, fill it in since it can
            # be calculated

            increment = int(network['increment']) \
                if 'increment' in network and network['increment'] else 1

            startIp = ipaddress.IPv4Address(str(
                network['address'])) + increment

        ipaddrNetwork = ipaddress.IPv4Network(
            '%s/%s' % (network['address'], network['netmask']))

        if startIp not in ipaddrNetwork:
            raise InvalidArgument(
                'Starting IP address [%s] is not on network [%s]' %
                (startIp, ipaddrNetwork))

        network['startIp'] = str(startIp)

        # Right now just check the VLAN vid
        if 'vlan' in optionDict:
            try:
                if int(optionDict['vlan']) > 4095 or \
                        int(optionDict['vlan']) < 1:
                    raise InvalidArgument(
                        'The VLAN ID must be an integer in the range'
                        ' 1-4095')
            except ValueError:
                # Convert all exceptions to this one...
                raise InvalidArgument(
                    'The VLAN ID must be an integer in the range 1-4095')
Exemple #2
0
    def updateNetwork(self, network):
        """
        Updates network in DB..

            Returns:
                network
            Throws:
                NetworkNotFound
                DbError
        """

        session = DbManager().openSession()

        try:
            dbNetwork = self._networksDbHandler.updateNetwork(session, network)

            newNetwork = Network.getFromDbDict(dbNetwork.__dict__)

            session.commit()

            return newNetwork
        except TortugaException as ex:
            session.rollback()
            raise
        except Exception as ex:
            session.rollback()
            self.getLogger().exception('%s' % ex)
            raise
        finally:
            DbManager().closeSession()
Exemple #3
0
    def getNetworkFromXml(self):
        """
        If the xmlFile option is present attempt to create a Network
        object from the xml.  Otherwise return None
        """

        network = None

        if self.getArgs().xmlFile:
            # An XML file was provided as input...start with that...
            f = open(self.getArgs().xmlFile, 'r')

            try:
                xmlString = f.read()
            finally:
                f.close()

            try:
                from tortuga.objects.network import Network
                network = Network.getFromXml(xmlString)
            except Exception as ex:  # pylint: disable=W0703
                self.getLogger().debug('Error parsing xml %s' % ex)

            if network is None:
                raise InvalidCliRequest(
                    _('File [%s] does not contain a valid network.') %
                    (self.getArgs().xmlFile))

        return network
Exemple #4
0
def populate_network(network: Network,
                     dbNetwork: Optional[NetworkModel] = None) \
        -> NetworkModel:
    if not dbNetwork:
        dbNetwork = NetworkModel()

    dbNetwork.address = network.getAddress()
    dbNetwork.netmask = network.getNetmask()
    dbNetwork.suffix = network.getSuffix()
    dbNetwork.gateway = network.getGateway()
    dbNetwork.options = network.getOptions()
    dbNetwork.name = network.getName()
    dbNetwork.startIp = network.getStartIp()
    dbNetwork.type = network.getType()
    dbNetwork.increment = network.getIncrement()
    dbNetwork.usingDhcp = network.getUsingDhcp()

    return dbNetwork
Exemple #5
0
    def updateNetwork(self, session: Session, network: Network) -> Network:
        """
        Updates network in DB..

            Returns:
                network
            Throws:
                NetworkNotFound
                InvalidArgument
        """

        try:
            if not network.getId():
                raise InvalidArgument(
                    'Network id not set: unable to identify network')

            self._logger.debug('Updating network [%s]' % (network))

            dbNetwork = self._networksDbHandler.getNetworkById(
                session, network.getId())

            dbNetwork = populate_network(network, dbNetwork)

            newNetwork = Network.getFromDbDict(dbNetwork.__dict__)

            session.commit()

            self._logger.info('Updated network [%s]' % (network))

            return newNetwork
        except TortugaException:
            session.rollback()

            raise
        except Exception as ex:
            session.rollback()

            self._logger.exception(str(ex))

            raise
Exemple #6
0
    def getFromDict(cls, _dict):
        """ Get nic from _dict. """

        nic = super(Nic, cls).getFromDict(_dict)

        networkDict = _dict.get(Network.ROOT_TAG)

        if networkDict:
            nic.setNetwork(Network.getFromDict(networkDict))

        networkDeviceDict = _dict.get(NetworkDevice.ROOT_TAG)

        if networkDeviceDict:
            nic.setNetworkDevice(NetworkDevice.getFromDict(networkDeviceDict))

        return nic
Exemple #7
0
    def getFromDict(cls, _dict, ignore: Optional[Iterable[str]] = None):
        """ Get nic from _dict. """

        nic = super(Nic, cls).getFromDict(_dict)

        networkDict = _dict.get(Network.ROOT_TAG)

        if networkDict:
            nic.setNetwork(Network.getFromDict(networkDict))

        networkDeviceDict = _dict.get(NetworkDevice.ROOT_TAG)

        if networkDeviceDict:
            nic.setNetworkDevice(NetworkDevice.getFromDict(networkDeviceDict))

        return nic
Exemple #8
0
    def getNetworkById(self, session: Session, id_):
        """
        Get a network by id from the db.
        """

        self._logger.debug('Retrieving network ID [%s]' % (id_))

        try:
            network = self._networksDbHandler.getNetworkById(session, id_)

            return Network.getFromDbDict(network.__dict__)
        except TortugaException:
            raise
        except Exception as ex:
            self._logger.exception(str(ex))
            raise
Exemple #9
0
    def getNetwork(self, session: Session, address: str, netmask: str):
        """
        Get a network from the db.
        """

        self._logger.debug('Retrieving network [%s/%s]' % (address, netmask))

        try:
            network = self._networksDbHandler.getNetwork(
                session, address, netmask)

            return Network.getFromDbDict(network.__dict__)
        except TortugaException:
            raise
        except Exception as ex:
            self._logger.exception(str(ex))
            raise
Exemple #10
0
    def getFromDbDict(cls, _dict, ignore: Optional[Iterable[str]] = None):
        nic = super(Nic, cls).getFromDict(_dict, ignore=ignore)

        # network (relation)
        networkDict = _dict.get(Network.ROOT_TAG)

        if networkDict:
            nic.setNetwork(Network.getFromDbDict(networkDict.__dict__))

        # networkdevice (relation)
        networkDeviceDict = _dict.get(NetworkDevice.ROOT_TAG)

        if networkDeviceDict:
            nic.setNetworkDevice(
                NetworkDevice.getFromDbDict(networkDeviceDict.__dict__))

        return nic
Exemple #11
0
    def getFromDbDict(cls, _dict):
        nic = super(Nic, cls).getFromDict(_dict)

        # network (relation)
        networkDict = _dict.get(Network.ROOT_TAG)

        if networkDict:
            nic.setNetwork(Network.getFromDbDict(networkDict.__dict__))

        # networkdevice (relation)
        networkDeviceDict = _dict.get(NetworkDevice.ROOT_TAG)

        if networkDeviceDict:
            nic.setNetworkDevice(
                NetworkDevice.getFromDbDict(networkDeviceDict.__dict__))

        return nic
Exemple #12
0
    def getNetworkById(self, id_):
        """
        Get a network by id from the db.
        """

        session = DbManager().openSession()

        try:
            network = self._networksDbHandler.getNetworkById(session, id_)

            return Network.getFromDbDict(network.__dict__)
        except TortugaException as ex:
            raise
        except Exception as ex:
            self.getLogger().exception('%s' % ex)
            raise
        finally:
            DbManager().closeSession()
Exemple #13
0
    def runCommand(self):
        self.parseArgs(
            _("""
Registers a network within Tortuga. This network can then be associated with
hardware profile(s) to allow Tortuga to manage cluster node networking
configuration.
"""))

        network = self.get_network_from_cmdline(retrieve_network=False)

        if network is None:
            network = Network()

        # Apply command line parameters
        self.updateNetwork(network)

        # Check for required parameters
        self.validateNetwork(network)

        # Save the updated network
        self.getNetworkApi().addNetwork(network)
Exemple #14
0
    def getNetworkList(self):
        """
        Get network list.

            Returns:
                [networks]
            Throws:
                UserNotAuthorized
                TortugaException
        """

        url = 'v1/networks'

        try:
            _, responseDict = self.sendSessionRequest(url)

            return Network.getListFromDict(responseDict)
        except TortugaException:
            raise
        except Exception as ex:
            raise TortugaException(exception=ex)
Exemple #15
0
    def getNetworkById(self, id_):
        """
        Get network information by id.

            Returns:
                network
            Throws:
                UserNotAuthorized
                NetworkNotFound
                TortugaException
        """

        url = 'v1/networks/%s' % (id_)

        try:
            _, responseDict = self.sendSessionRequest(url)

            return Network.getFromDict(responseDict.get(Network.ROOT_TAG))
        except TortugaException:
            raise
        except Exception as ex:
            raise TortugaException(exception=ex)
Exemple #16
0
def test_add_and_delete_network(dbm):
    address = '192.168.1.0'
    netmask = '255.255.255.0'

    network = Network()
    network.setAddress(address)
    network.setNetmask(netmask)
    network.setType('provision')

    with dbm.session() as session:
        NetworkDbApi().addNetwork(session, network)

        # attempt to add the same network twice..
        with pytest.raises(NetworkAlreadyExists):
            NetworkDbApi().addNetwork(session, network)

        stored_network = NetworkDbApi().getNetwork(session, address, netmask)

        assert stored_network

        new_netmask = '255.255.0.0'

        stored_network.setNetmask(new_netmask)

        assert NetworkDbApi().updateNetwork(session, stored_network)

        updated_network = NetworkDbApi().getNetworkById(
            session, stored_network.getId())

        assert updated_network.getNetmask() == new_netmask

        NetworkDbApi().deleteNetwork(session, updated_network.getId())

        # attempt to delete network already deleted
        with pytest.raises(NetworkNotFound):
            NetworkDbApi().getNetwork(session, address, new_netmask)
Exemple #17
0
    def getNetwork(self, address, netmask):
        """
        Get network information.

            Returns:
                network
            Throws:
                UserNotAuthorized
                NetworkNotFound
                TortugaException
        """

        url = 'networks/?address=%s&netmask=%s' % (address, netmask)

        try:
            responseDict = self.get(url)
            return Network.getListFromDict(responseDict)[0]

        except TortugaException:
            raise

        except Exception as ex:
            raise TortugaException(exception=ex)
    def addNetwork(self, address, netmask):
        '''
        Handle put to networks/:(address)/:(netmask)/)
        '''

        response = None

        postdata = cherrypy.request.json

        network = Network.getFromDict(postdata)

        try:
            # Make sure the values are synced
            network.setAddress(address)
            network.setNetmask(netmask)

            self.app.network_api.addNetwork(cherrypy.request.db, network)
        except Exception as ex:
            self._logger.error(str(ex))
            self.handleException(ex)
            response = self.errorResponse(str(ex))

        return self.formatResponse(response)
Exemple #19
0
def test_updateNetwork_failed(dbm):
    bogus_network = Network()

    with dbm.session() as session:
        with pytest.raises(InvalidArgument):
            NetworkDbApi().updateNetwork(session, bogus_network)
Exemple #20
0
    def runCommand(self):
        self.parseArgs()

        if not self.getArgs().name and \
                not self.getArgs().hardwareProfileName:
            self.getParser().error(
                'the following arguments are required: NAME')

        if self.getArgs().name and self.getArgs().hardwareProfileName:
            self.getParser().error(
                'argument name: not allowed with argument --name')

        name = self.getArgs().name \
            if self.getArgs().name else self.getArgs().hardwareProfileName

        api = HardwareProfileWsApi(username=self.getUsername(),
                                   password=self.getPassword(),
                                   baseurl=self.getUrl(),
                                   verify=self._verify)

        spApi = SoftwareProfileWsApi(username=self.getUsername(),
                                     password=self.getPassword(),
                                     baseurl=self.getUrl(),
                                     verify=self._verify)

        nodeApi = NodeWsApi(username=self.getUsername(),
                            password=self.getPassword(),
                            baseurl=self.getUrl(),
                            verify=self._verify)

        hp = api.getHardwareProfile(name, UpdateHardwareProfileCli.optionDict)

        if self.getArgs().newName is not None:
            hp.setName(self.getArgs().newName)

        if self.getArgs().description is not None:
            hp.setDescription(self.getArgs().description)

        if self.getArgs().nameFormat is not None:
            hp.setNameFormat(self.getArgs().nameFormat)

        if self.getArgs().kernel is not None:
            hp.setKernel(self.getArgs().kernel)

        if self.getArgs().kernelParameters is not None:
            hp.setKernelParams(self.getArgs().kernelParameters)

        if self.getArgs().initrd is not None:
            hp.setInitrd(self.getArgs().initrd)

        if self.getArgs().soAllowed is not None:
            if self.getArgs().soAllowed.lower() == _('true'):
                hp.setSoftwareOverrideAllowed(True)
            elif self.getArgs().soAllowed.lower() == _('false'):
                hp.setSoftwareOverrideAllowed(False)
            else:
                raise InvalidCliRequest(
                    _('--software-override-allowed must be either "true" or'
                      ' "false".'))

        if self.getArgs().idleProfile is not None and \
           self.getArgs().bUnsetIdleProfile:
            raise InvalidCliRequest(
                _('Conflicting options --idle-software-profile and'
                  ' --unset-idle-software-profile'))

        if self.getArgs().idleProfile is not None:
            sp = spApi.getSoftwareProfile(self.getArgs().idleProfile)

            hp.setIdleSoftwareProfileId(sp.getId())

        if self.getArgs().bUnsetIdleProfile:
            hp.setIdleSoftwareProfileId(None)

        if self.getArgs().location is not None:
            hp.setLocation(self.getArgs().location)

        if self.getArgs().localBootParameters is not None:
            hp.setLocalBootParams(self.getArgs().localBootParameters)

        if self.getArgs().cost is not None:
            hp.setCost(self.getArgs().cost)

        if self.getArgs().resourceAdapter:
            resourceAdapter = ResourceAdapter(
                name=self.getArgs().resourceAdapter)
            hp.setResourceAdapter(resourceAdapter)

        if self.getArgs().default_adapter_config:
            hp.setDefaultResourceAdapterConfig(
                self.getArgs().default_adapter_config)

        if self.getArgs().deletePNic is not None:
            out = TortugaObjectList()

            for nic in hp.getProvisioningNics():
                for dnic in self.getArgs().deletePNic:
                    if dnic == nic.getIp():
                        # Skip over this item..its getting deleted
                        break
                else:
                    # Not a NIC we are deleting
                    out.append(nic)

            hp.setProvisioningNics(out)

        if self.getArgs().addPNic is not None:
            for nicIp in self.getArgs().addPNic:
                nicsNode = nodeApi.getNodeByIp(nicIp)

                if nicsNode is not None:
                    for nic in nicsNode.getNics():
                        if nic.getIp() == nicIp:
                            hp.getProvisioningNics().append(nic)
                            break

        if self.getArgs().deleteNetwork is not None:
            # Make sure we actually delete a network
            out = TortugaObjectList()
            out.extend(hp.getNetworks())

            for netstring in self.getArgs().deleteNetwork:
                try:
                    dnet, dmask, ddev = netstring.split('/')
                except ValueError:
                    raise InvalidCliRequest(
                        _('Incorrect input format for --delete-network'
                          ' ("address/mask/device")'))

                for network in hp.getNetworks():
                    if dnet == network.getAddress() and \
                       dmask == network.getNetmask() and \
                       ddev == network.getNetworkDevice().getName():
                        # Skip over this item..its getting deleted
                        for n in out:
                            if n.getId() == network.getId():
                                out.remove(n)
                                break

                        break
                else:
                    # Not a NIC we are deleting
                    print('Ignoring deletion of non-existent network:'
                          ' %s/%s/%s' % (dnet, dmask, ddev))

            hp.setNetworks(out)

        if self.getArgs().addNetwork:
            for netstring in self.getArgs().addNetwork:
                try:
                    anet, amask, adev = netstring.split('/')
                except ValueError:
                    raise InvalidCliRequest(
                        _('Incorrect input format for --add-network'
                          ' ("address/mask/device")'))

                network = Network()
                networkDevice = NetworkDevice()
                networkDevice.setName(adev)
                network.setAddress(anet)
                network.setNetmask(amask)
                network.setNetworkDevice(networkDevice)
                hp.getNetworks().append(network)

        if self.getArgs().tags:
            tags = hp.getTags()
            tags.update(parse_tags(self.getArgs().tags))
            hp.setTags(tags)

        if self.getArgs().remove_tags:
            tags = hp.getTags()
            for string in self.getArgs().remove_tags:
                for tag_name in string.split(','):
                    if tag_name in tags.keys():
                        tags.pop(tag_name)
            hp.setTags(tags)

        api.updateHardwareProfile(hp)