¡@

Home 

OpenStack Study: floating_ip.py

OpenStack Index

**** CubicPower OpenStack Study ****

# Copyright 2014 Red Hat, Inc.

#

# 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 nova import db

from nova import exception

from nova.objects import base as obj_base

from nova.objects import fields

from nova.objects import fixed_ip

FLOATING_IP_OPTIONAL_ATTRS = ['fixed_ip']

**** CubicPower OpenStack Study ****

class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject):

fields = {

'id': fields.IntegerField(),

'address': fields.IPAddressField(),

'fixed_ip_id': fields.IntegerField(nullable=True),

'project_id': fields.UUIDField(nullable=True),

'host': fields.StringField(nullable=True),

'auto_assigned': fields.BooleanField(),

'pool': fields.StringField(nullable=True),

'interface': fields.StringField(nullable=True),

'fixed_ip': fields.ObjectField('FixedIP', nullable=True),

}

@staticmethod

**** CubicPower OpenStack Study ****

    def _from_db_object(context, floatingip, db_floatingip,

                        expected_attrs=None):

        if expected_attrs is None:

            expected_attrs = []

        for field in floatingip.fields:

            if field not in FLOATING_IP_OPTIONAL_ATTRS:

                floatingip[field] = db_floatingip[field]

        if 'fixed_ip' in expected_attrs:

            floatingip.fixed_ip = fixed_ip.FixedIP._from_db_object(

                context, fixed_ip.FixedIP(), db_floatingip['fixed_ip'])

        floatingip._context = context

        floatingip.obj_reset_changes()

        return floatingip

**** CubicPower OpenStack Study ****

    def obj_load_attr(self, attrname):

        if attrname not in FLOATING_IP_OPTIONAL_ATTRS:

            raise exception.ObjectActionError(

                action='obj_load_attr',

                reason='attribute %s is not lazy-loadable' % attrname)

        if not self._context:

            raise exception.OrphanedObjectError(method='obj_load_attr',

                                                objtype=self.obj_name())

        self.fixed_ip = fixed_ip.FixedIP.get_by_id(self._context,

                                                   self.fixed_ip_id,

                                                   expected_attrs=['network'])

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_id(cls, context, id):

        db_floatingip = db.floating_ip_get(context, id)

        # XXX joins fixed.instance

        return cls._from_db_object(context, cls(), db_floatingip, ['fixed_ip'])

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_address(cls, context, address):

        db_floatingip = db.floating_ip_get_by_address(context, address)

        return cls._from_db_object(context, cls(), db_floatingip)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_pool_names(cls, context):

        return [x['name'] for x in db.floating_ip_get_pools(context)]

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def allocate_address(cls, context, project_id, pool, auto_assigned=False):

        return db.floating_ip_allocate_address(context, project_id, pool,

                                               auto_assigned=auto_assigned)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def associate(cls, context, floating_address, fixed_address, host):

        db_fixed = db.floating_ip_fixed_ip_associate(context,

                                                     floating_address,

                                                     fixed_address,

                                                     host)

        if db_fixed is None:

            return None

        floating = FloatingIP(

            context=context, address=floating_address, host=host,

            fixed_ip_id=db_fixed['id'],

            fixed_ip=fixed_ip.FixedIP._from_db_object(

                context, fixed_ip.FixedIP(), db_fixed,

                expected_attrs=['network']))

        return floating

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def deallocate(cls, context, address):

        db.floating_ip_deallocate(context, address)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def destroy(cls, context, address):

        db.floating_ip_destroy(context, address)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def disassociate(cls, context, address):

        db_fixed = db.floating_ip_disassociate(context, address)

        floating = FloatingIP(

            context=context, address=address,

            fixed_ip_id=db_fixed['id'],

            fixed_ip=fixed_ip.FixedIP._from_db_object(

                context, fixed_ip.FixedIP(), db_fixed,

                expected_attrs=['network']))

        return floating

    @obj_base.remotable

**** CubicPower OpenStack Study ****

    def save(self, context):

        updates = self.obj_get_changes()

        if 'address' in updates:

            raise exception.ObjectActionError(action='save',

                                              reason='address is not mutable')

        db_floatingip = db.floating_ip_update(context, str(self.address),

                                              updates)

        self._from_db_object(context, self, db_floatingip)

**** CubicPower OpenStack Study ****

class FloatingIPList(obj_base.ObjectListBase, obj_base.NovaObject):

fields = {

'objects': fields.ListOfObjectsField('FloatingIP'),

}

child_versions = {

'1.0': '1.0',

}

@obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_all(cls, context):

        db_floatingips = db.floating_ip_get_all(context)

        return obj_base.obj_make_list(context, cls(), FloatingIP,

                                      db_floatingips)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_host(cls, context, host):

        db_floatingips = db.floating_ip_get_all_by_host(context, host)

        return obj_base.obj_make_list(context, cls(), FloatingIP,

                                      db_floatingips)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_project(cls, context, project_id):

        db_floatingips = db.floating_ip_get_all_by_project(context, project_id)

        return obj_base.obj_make_list(context, cls(), FloatingIP,

                                      db_floatingips)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_fixed_address(cls, context, fixed_address):

        db_floatingips = db.floating_ip_get_by_fixed_address(context,

                                                             fixed_address)

        return obj_base.obj_make_list(context, cls(), FloatingIP,

                                      db_floatingips)

    @obj_base.remotable_classmethod

**** CubicPower OpenStack Study ****

    def get_by_fixed_ip_id(cls, context, fixed_ip_id):

        db_floatingips = db.floating_ip_get_by_fixed_ip_id(context,

                                                           fixed_ip_id)

        return obj_base.obj_make_list(context, cls(), FloatingIP,

                                      db_floatingips)