Blame cloudinit/cs_utils.py

Packit Service a04d08
# Copyright (C) 2014 CloudSigma
Packit Service a04d08
#
Packit Service a04d08
# Author: Kiril Vladimiroff <kiril.vladimiroff@cloudsigma.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""
Packit Service a04d08
cepko implements easy-to-use communication with CloudSigma's VMs through
Packit Service a04d08
a virtual serial port without bothering with formatting the messages
Packit Service a04d08
properly nor parsing the output with the specific and sometimes
Packit Service a04d08
confusing shell tools for that purpose.
Packit Service a04d08
Packit Service a04d08
Having the server definition accessible by the VM can ve useful in various
Packit Service a04d08
ways. For example it is possible to easily determine from within the VM,
Packit Service a04d08
which network interfaces are connected to public and which to private network.
Packit Service a04d08
Another use is to pass some data to initial VM setup scripts, like setting the
Packit Service 11b429
hostname to the VM name or passing ssh public keys through server meta.
Packit Service a04d08
Packit Service a04d08
For more information take a look at the Server Context section of CloudSigma
Packit Service a04d08
API Docs: http://cloudsigma-docs.readthedocs.org/en/latest/server_context.html
Packit Service a04d08
"""
Packit Service a04d08
import json
Packit Service a04d08
import platform
Packit Service a04d08
Packit Service a04d08
from cloudinit import serial
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# these high timeouts are necessary as read may read a lot of data.
Packit Service a04d08
READ_TIMEOUT = 60
Packit Service a04d08
WRITE_TIMEOUT = 10
Packit Service a04d08
Packit Service a04d08
SERIAL_PORT = '/dev/ttyS1'
Packit Service a04d08
if platform.system() == 'Windows':
Packit Service a04d08
    SERIAL_PORT = 'COM2'
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class Cepko(object):
Packit Service a04d08
    """
Packit Service a04d08
    One instance of that object could be use for one or more
Packit Service a04d08
    queries to the serial port.
Packit Service a04d08
    """
Packit Service a04d08
    request_pattern = "<\n{}\n>"
Packit Service a04d08
Packit Service a04d08
    def get(self, key="", request_pattern=None):
Packit Service a04d08
        if request_pattern is None:
Packit Service a04d08
            request_pattern = self.request_pattern
Packit Service a04d08
        return CepkoResult(request_pattern.format(key))
Packit Service a04d08
Packit Service a04d08
    def all(self):
Packit Service a04d08
        return self.get()
Packit Service a04d08
Packit Service a04d08
    def meta(self, key=""):
Packit Service a04d08
        request_pattern = self.request_pattern.format("/meta/{}")
Packit Service a04d08
        return self.get(key, request_pattern)
Packit Service a04d08
Packit Service a04d08
    def global_context(self, key=""):
Packit Service a04d08
        request_pattern = self.request_pattern.format("/global_context/{}")
Packit Service a04d08
        return self.get(key, request_pattern)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class CepkoResult(object):
Packit Service a04d08
    """
Packit Service a04d08
    CepkoResult executes the request to the virtual serial port as soon
Packit Service a04d08
    as the instance is initialized and stores the result in both raw and
Packit Service a04d08
    marshalled format.
Packit Service a04d08
    """
Packit Service a04d08
    def __init__(self, request):
Packit Service a04d08
        self.request = request
Packit Service a04d08
        self.raw_result = self._execute()
Packit Service a04d08
        self.result = self._marshal(self.raw_result)
Packit Service a04d08
Packit Service a04d08
    def _execute(self):
Packit Service a04d08
        connection = serial.Serial(port=SERIAL_PORT,
Packit Service a04d08
                                   timeout=READ_TIMEOUT,
Packit Service a04d08
                                   writeTimeout=WRITE_TIMEOUT)
Packit Service a04d08
        connection.write(self.request.encode('ascii'))
Packit Service a04d08
        return connection.readline().strip(b'\x04\n').decode('ascii')
Packit Service a04d08
Packit Service a04d08
    def _marshal(self, raw_result):
Packit Service a04d08
        try:
Packit Service a04d08
            return json.loads(raw_result)
Packit Service a04d08
        except ValueError:
Packit Service a04d08
            return raw_result
Packit Service a04d08
Packit Service a04d08
    def __len__(self):
Packit Service a04d08
        return self.result.__len__()
Packit Service a04d08
Packit Service a04d08
    def __getitem__(self, key):
Packit Service a04d08
        return self.result.__getitem__(key)
Packit Service a04d08
Packit Service a04d08
    def __contains__(self, item):
Packit Service a04d08
        return self.result.__contains__(item)
Packit Service a04d08
Packit Service a04d08
    def __iter__(self):
Packit Service a04d08
        return self.result.__iter__()
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab