예제 #1
0
def provision_self(update_manager):
    """
    Provision the node.

    Returns a deferred.
    """
    name = "node-{:x}".format(devices.get_hardware_serial())

    conf = read_provisioning_conf()
    batch_id = conf.get("batch_id", None)
    batch_key = conf.get("batch_key", None)

    def cbresponse(response):
        router = response.data['router']
        nexus.core.provision(router['_id'])
        nexus.core.saveKey(router['password'], 'apitoken')
        nexus.core.jwt_valid = True

        batch = response.data['batch']
        hostconfig_patch = batch.get("hostconfig_patch", [])
        zerotier_networks = batch.get("zerotier_networks", [])
        update_manager.add_provision_update(hostconfig_patch, zerotier_networks)

        write_provisioning_result(response.data)

    data = {
        "name": name,
        "key": batch_key,
        "zerotier_address": zerotier.getAddress()
    }

    request = PDServerRequest('/api/batches/{}/provision'.format(batch_id))
    d = request.post(**data)
    d.addCallback(cbresponse)
    return d
예제 #2
0
    def send(self, report):
        request = PDServerRequest('/api/routers/{router_id}/' + self.model)
        d = request.post(**report)

        # Check for error code and retry.
        def cbresponse(response):
            if not response.success:
                out.warn('{} to {} returned code {}'.format(
                    request.method, request.url, response.code))
                if self.max_retries is None or self.retries < self.max_retries:
                    reactor.callLater(self.retryDelay, self.send, report)
                    self.retries += 1
                    self.increaseDelay()
                nexus.core.jwt_valid = False
            else:
                nexus.core.jwt_valid = True

        # Check for connection failures and retry.
        def cberror(ignored):
            out.warn('{} to {} failed'.format(request.method, request.url))
            if self.max_retries is None or self.retries < self.max_retries:
                reactor.callLater(self.retryDelay, self.send, report)
                self.retries += 1
                self.increaseDelay()
            nexus.core.jwt_valid = False

        d.addCallback(cbresponse)
        d.addErrback(cberror)
        return d
예제 #3
0
    def send(self, report):
        request = PDServerRequest('/api/routers/{router_id}/' + self.model)
        d = request.post(**report)

        # Check for error code and retry.
        def cbresponse(response):
            if not response.success:
                out.warn('{} to {} returned code {}'.format(request.method,
                    request.url, response.code))
                if self.max_retries is None or self.retries < self.max_retries:
                    reactor.callLater(self.retryDelay, self.send, report)
                    self.retries += 1
                    self.increaseDelay()
                nexus.core.jwt_valid = False
            else:
                nexus.core.jwt_valid = True

        # Check for connection failures and retry.
        def cberror(ignored):
            out.warn('{} to {} failed'.format(request.method, request.url))
            if self.max_retries is None or self.retries < self.max_retries:
                reactor.callLater(self.retryDelay, self.send, report)
                self.retries += 1
                self.increaseDelay()
            nexus.core.jwt_valid = False

        d.addCallback(cbresponse)
        d.addErrback(cberror)
        return d
예제 #4
0
    def progress(self, message):
        if self.pkg is not None:
            self.pkg.request.write(message + '\n')

        # TODO Look into this.
        # This might happen during router initialization.  If nexus.core is
        # None, we do not know the router's identity, so we cannot publish any
        # messages.
        if nexus.core is None:
            return

        data = {'time': time.time(), 'message': message}

        def handleError(error):
            print("Error sending message: {}".format(error.getErrorMessage()))

        # The external field is set for updates from pdserver but not for
        # locally-initiated (sideloaded) updates.
        update_id = None
        if hasattr(self, 'external'):
            update_id = self.external['update_id']
            request = PDServerRequest(
                '/api/routers/{}/updates/{}/messages'.format(
                    nexus.core.info.pdid, update_id))
            d = request.post(**data)
            d.addErrback(handleError)

        session = getattr(nexus.core, 'session', None)
        if session is not None:
            data['update_id'] = update_id

            # Catch the occasional Exception due to connectivity failure.  We
            # don't want to fail a chute installation just because we had problems
            # sending the log messages.
            try:
                session.publish(session.uriPrefix + 'updateProgress', data)
            except Exception as error:
                out.warn("Publish failed: {} {}".format(
                    error.__class__, error))

        # Send messages to internal consumers (e.g. open websocket connections)
        self.messages.append(data)
        for observer in self.message_observers:
            observer.on_message(data)
예제 #5
0
def provision_self(update_manager):
    """
    Provision the node.

    Returns a deferred.
    """
    name = "node-{:x}".format(devices.get_hardware_serial())

    conf = read_provisioning_conf()
    batch_id = conf.get("batch_id", None)
    batch_key = conf.get("batch_key", None)

    def cbresponse(response):
        router = response.data['router']
        nexus.core.provision(router['_id'])
        nexus.core.saveKey(router['password'], 'apitoken')
        nexus.core.jwt_valid = True

        batch = response.data['batch']
        hostconfig_patch = batch.get("hostconfig_patch", [])
        zerotier_networks = batch.get("zerotier_networks", [])
        update_manager.add_provision_update(hostconfig_patch,
                                            zerotier_networks)

        write_provisioning_result(response.data)

    data = {
        "name": name,
        "key": batch_key,
        "zerotier_address": zerotier.getAddress()
    }

    request = PDServerRequest('/api/batches/{}/provision'.format(batch_id))
    d = request.post(**data)
    d.addCallback(cbresponse)
    return d