summaryrefslogtreecommitdiffstats
path: root/ci/nosdn/README
blob: 765e5eb7dbc6a7732be6e7b78c1a1b8e1b5f153f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
OpenDaylight Deployment with Juju
=================================

This readme contains instructions for checking out and deploying Juju charms for
OpenDaylight.

The charms are targetted at Trusty.


Checkout charms
---------------

Charms are hosted on Launchpad.
You need to 'sudo apt-get install bzr' first.

Follow these steps to checkout code:

cd <deployer dir>
./fetch-charms.sh

This will checkout the relevant charms into 'src' and create any Juju symlinks
in 'charms'.


Deploy with cloud-sh-odl
------------------------

cloud-sh-odl is a collection of development shell scripts to deploy
and setup OpenStack with OpenDaylight using Juju's local provider. This will
create 3 KVMs as follows:

*KVM #1 - Keystone, Glance, Neutron Server, Nova Cloud Controller, Horizon,
          MySQL, RabbitMQ, OpenDaylight Controller

*KVM #2 - Neutron agents

*KVM #3 - Nova Compute

You'll require approx. 13Gb RAM with 40Gb+ disk space.
Deployment can take anywhere between 20 mins to 1 hour.

You need to 'sudo apt-get install juju juju-local uvtool', and
logout/login in order to pick up libvirt group permissions before
proceeding. See https://bugs.launchpad.net/juju-core/+bug/1308088.

Follow these steps:

ssh-keygen
  (if you don't already have a key at ~/.ssh/id_rsa).

cp cloud-sh-odl/environments.yaml ~/.juju
  (or create your own default local environment in your existing
   environments.yaml file)

cd cloud-sh-odl

./deploy.sh

This will log to 'out.log'.

This will deploy OpenStack and import Trusty's daily image into Glance.

Horizon will be located on the machine 'juju status openstack-dashboard' -
http://<ip>/horizon.
Admin credentials will be written to cloud/admin-openrc.

The deployment can be destroyed with:

juju destroy-environment local


Deploy with Juju Deployer
-------------------------

Juju Deployer can deploy a preset configuration of charms given a yaml
configuration file. There is a configuration file in
'juju-deployer/odl.yaml'.

You need to 'sudo apt-get install juju-deployer' first.

Then:

cd juju-deployer

juju-deployer -c odl.yaml -d trusty-icehouse-odl

Juju Deployer will branch its own copy of the remote charms.
eight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
# Copyright (c) 2017 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from oslo_utils import excutils


class ProcessExecutionError(RuntimeError):
    def __init__(self, message, returncode):
        super(ProcessExecutionError, self).__init__(message)
        self.returncode = returncode


class ErrorClass(object):

    def __init__(self, *args, **kwargs):
        if 'test' not in kwargs:
            raise RuntimeError

    def __getattr__(self, item):
        raise AttributeError


class YardstickException(Exception):
    """Base Yardstick Exception.

    To correctly use this class, inherit from it and define
    a 'message' property. That message will get printf'd
    with the keyword arguments provided to the constructor.

    Based on NeutronException class.
    """
    message = "An unknown exception occurred."

    def __init__(self, **kwargs):
        try:
            super(YardstickException, self).__init__(self.message % kwargs)
            self.msg = self.message % kwargs
        except Exception:  # pylint: disable=broad-except
            with excutils.save_and_reraise_exception() as ctxt:
                if not self.use_fatal_exceptions():
                    ctxt.reraise = False
                    # at least get the core message out if something happened
                    super(YardstickException, self).__init__(self.message)

    def __str__(self):
        return self.msg

    def use_fatal_exceptions(self):
        """Is the instance using fatal exceptions.

        :returns: Always returns False.
        """
        return False


class ResourceCommandError(YardstickException):
    message = 'Command: "%(command)s" Failed, stderr: "%(stderr)s"'


class FunctionNotImplemented(YardstickException):
    message = ('The function "%(function_name)s" is not implemented in '
               '"%(class_name)" class.')


class InfluxDBConfigurationMissing(YardstickException):
    message = ('InfluxDB configuration is not available. Add "influxdb" as '
               'a dispatcher and the configuration section')


class YardstickBannedModuleImported(YardstickException):
    # pragma: no cover
    message = 'Module "%(module)s" cannnot be imported. Reason: "%(reason)s"'


class PayloadMissingAttributes(YardstickException):
    message = ('Error instantiating a Payload class, missing attributes: '
               '%(missing_attributes)s')


class HeatTemplateError(YardstickException):
    """Error in Heat during the stack deployment"""
    message = ('Error in Heat during the creation of the OpenStack stack '
               '"%(stack_name)s"')


class IPv6RangeError(YardstickException):
    message = 'Start IP "%(start_ip)s" is greater than end IP "%(end_ip)s"'


class TrafficProfileNotImplemented(YardstickException):
    message = 'No implementation for traffic profile %(profile_class)s.'


class DPDKSetupDriverError(YardstickException):
    message = '"igb_uio" driver is not loaded'


class OVSUnsupportedVersion(YardstickException):
    message = ('Unsupported OVS version "%(ovs_version)s". Please check the '
               'config. OVS to DPDK version map: %(ovs_to_dpdk_map)s.')


class OVSHugepagesInfoError(YardstickException):
    message = 'MemInfo cannnot be retrieved.'


class OVSHugepagesNotConfigured(YardstickException):
    message = 'HugePages are not configured in this system.'


class OVSHugepagesZeroFree(YardstickException):
    message = ('There are no HugePages free in this system. Total HugePages '
               'configured: %(total_hugepages)s')


class OVSDeployError(YardstickException):
    message = 'OVS deploy tool failed with error: %(stderr)s.'


class OVSSetupError(YardstickException):
    message = 'OVS setup error. Command: %(command)s. Error: %(error)s.'


class LibvirtCreateError(YardstickException):
    message = 'Error creating the virtual machine. Error: %(error)s.'


class LibvirtQemuImageBaseImageNotPresent(YardstickException):
    message = ('Error creating the qemu image for %(vm_image)s. Base image: '
               '%(base_image)s. Base image not present in execution host or '
               'remote host.')


class LibvirtQemuImageCreateError(YardstickException):
    message = ('Error creating the qemu image for %(vm_image)s. Base image: '
               '%(base_image)s. Error: %(error)s.')


class SSHError(YardstickException):
    message = '%(error_msg)s'


class SSHTimeout(SSHError):
    pass


class IncorrectConfig(YardstickException):
    message = '%(error_msg)s'


class IncorrectSetup(YardstickException):
    message = '%(error_msg)s'


class IncorrectNodeSetup(IncorrectSetup):
    pass


class ScenarioConfigContextNameNotFound(YardstickException):
    message = 'Context for host name "%(host_name)s" not found'


class StackCreationInterrupt(YardstickException):
    message = 'Stack create interrupted.'


class TaskRenderArgumentError(YardstickException):
    message = 'Error reading the task input arguments'


class TaskReadError(YardstickException):
    message = 'Failed to read task %(task_file)s'


class TaskRenderError(YardstickException):
    message = 'Failed to render template:\n%(input_task)s'


class TimerTimeout(YardstickException):
    message = 'Timer timeout expired, %(timeout)s seconds'


class WaitTimeout(YardstickException):
    message = 'Wait timeout while waiting for condition'


class ScenarioCreateNetworkError(YardstickException):
    message = 'Create Neutron Network Scenario failed'


class ScenarioCreateSubnetError(YardstickException):
    message = 'Create Neutron Subnet Scenario failed'


class ScenarioDeleteRouterError(YardstickException):
    message = 'Delete Neutron Router Scenario failed'


class MissingPodInfoError(YardstickException):
    message = 'Missing pod args, please check'


class UnsupportedPodFormatError(YardstickException):
    message = 'Failed to load pod info, unsupported format'


class ScenarioCreateRouterError(YardstickException):
    message = 'Create Neutron Router Scenario failed'


class ScenarioRemoveRouterIntError(YardstickException):
    message = 'Remove Neutron Router Interface Scenario failed'


class ScenarioCreateFloatingIPError(YardstickException):
    message = 'Create Neutron Floating IP Scenario failed'


class ScenarioDeleteFloatingIPError(YardstickException):
    message = 'Delete Neutron Floating IP Scenario failed'


class ScenarioCreateSecurityGroupError(YardstickException):
    message = 'Create Neutron Security Group Scenario failed'


class ScenarioDeleteNetworkError(YardstickException):
    message = 'Delete Neutron Network Scenario failed'


class ScenarioCreateServerError(YardstickException):
    message = 'Nova Create Server Scenario failed'


class ScenarioDeleteServerError(YardstickException):
    message = 'Delete Server Scenario failed'


class ScenarioCreateKeypairError(YardstickException):
    message = 'Nova Create Keypair Scenario failed'


class ScenarioDeleteKeypairError(YardstickException):
    message = 'Nova Delete Keypair Scenario failed'


class ScenarioAttachVolumeError(YardstickException):
    message = 'Nova Attach Volume Scenario failed'


class ScenarioGetServerError(YardstickException):
    message = 'Nova Get Server Scenario failed'


class ScenarioGetFlavorError(YardstickException):
    message = 'Nova Get Falvor Scenario failed'


class ScenarioCreateVolumeError(YardstickException):
    message = 'Cinder Create Volume Scenario failed'


class ScenarioDeleteVolumeError(YardstickException):
    message = 'Cinder Delete Volume Scenario failed'


class ScenarioDetachVolumeError(YardstickException):
    message = 'Cinder Detach Volume Scenario failed'


class ApiServerError(YardstickException):
    message = 'An unkown exception happened to Api Server!'


class UploadOpenrcError(ApiServerError):
    message = 'Upload openrc ERROR!'


class UpdateOpenrcError(ApiServerError):
    message = 'Update openrc ERROR!'


class ScenarioCreateImageError(YardstickException):
    message = 'Glance Create Image Scenario failed'


class ScenarioDeleteImageError(YardstickException):
    message = 'Glance Delete Image Scenario failed'


class IxNetworkClientNotConnected(YardstickException):
    message = 'IxNetwork client not connected to a TCL server'


class IxNetworkFlowNotPresent(YardstickException):
    message = 'Flow Group "%(flow_group)s" is not present'


class IxNetworkFieldNotPresentInStackItem(YardstickException):
    message = 'Field "%(field_name)s" not present in stack item %(stack_item)s'


class SLAValidationError(YardstickException):
    message = '%(case_name)s SLA validation failed. Error: %(error_msg)s'