~emagana/neutron/emagana-l2network-plugin-extensions

« back to all changes in this revision

Viewing changes to quantum/plugins/cisco/db/l2network_models.py

Merge from Rohit's branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
import uuid
19
19
 
20
20
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
21
 
from sqlalchemy.orm import relation
22
 
 
23
 
from quantum.db.models import BASE
24
 
 
25
 
 
26
 
class VlanBinding(BASE):
 
21
from sqlalchemy.ext.declarative import declarative_base
 
22
from sqlalchemy.orm import relation, object_mapper
 
23
 
 
24
BASE = declarative_base()
 
25
 
 
26
 
 
27
class L2NetworkBase(object):
 
28
    """Base class for L2Network Models."""
 
29
    __table_args__ = {'mysql_engine': 'InnoDB'}
 
30
 
 
31
    def __setitem__(self, key, value):
 
32
        setattr(self, key, value)
 
33
 
 
34
    def __getitem__(self, key):
 
35
        return getattr(self, key)
 
36
 
 
37
    def get(self, key, default=None):
 
38
        return getattr(self, key, default)
 
39
 
 
40
    def __iter__(self):
 
41
        self._i = iter(object_mapper(self).columns)
 
42
        return self
 
43
 
 
44
    def next(self):
 
45
        n = self._i.next().name
 
46
        return n, getattr(self, n)
 
47
 
 
48
    def update(self, values):
 
49
        """Make the model object behave like a dict"""
 
50
        for k, v in values.iteritems():
 
51
            setattr(self, k, v)
 
52
 
 
53
    def iteritems(self):
 
54
        """Make the model object behave like a dict.
 
55
        Includes attributes from joins."""
 
56
        local = dict(self)
 
57
        joined = dict([(k, v) for k, v in self.__dict__.iteritems()
 
58
                      if not k[0] == '_'])
 
59
        local.update(joined)
 
60
        return local.iteritems()
 
61
 
 
62
 
 
63
class Port(BASE, L2NetworkBase):
 
64
    """Represents a port on a l2network plugin"""
 
65
    __tablename__ = 'ports'
 
66
 
 
67
    uuid = Column(String(255), primary_key=True)
 
68
    network_id = Column(String(255), ForeignKey("networks.uuid"),
 
69
                        nullable=False)
 
70
    interface_id = Column(String(255))
 
71
    state = Column(String(8))
 
72
 
 
73
    def __init__(self, network_id):
 
74
        self.uuid = str(uuid.uuid4())
 
75
        self.network_id = network_id
 
76
        self.state = "DOWN"
 
77
 
 
78
    def __repr__(self):
 
79
        return "<Port(%s,%s,%s,%s)>" % (self.uuid, self.network_id,
 
80
                                     self.state, self.interface_id)
 
81
 
 
82
 
 
83
class Network(BASE, L2NetworkBase):
 
84
    """Represents a networ on l2network plugin"""
 
85
    __tablename__ = 'networks'
 
86
 
 
87
    uuid = Column(String(255), primary_key=True)
 
88
    tenant_id = Column(String(255), nullable=False)
 
89
    name = Column(String(255))
 
90
    ports = relation(Port, order_by=Port.uuid, backref="network")
 
91
 
 
92
    def __init__(self, tenant_id, name):
 
93
        self.uuid = str(uuid.uuid4())
 
94
        self.tenant_id = tenant_id
 
95
        self.name = name
 
96
 
 
97
    def __repr__(self):
 
98
        return "<Network(%s,%s,%s)>" % \
 
99
          (self.uuid, self.name, self.tenant_id)
 
100
 
 
101
 
 
102
class VlanBinding(BASE, L2NetworkBase):
27
103
    """Represents a binding of vlan_id to network_id"""
28
104
    __tablename__ = 'vlan_bindings'
29
105
 
30
106
    vlan_id = Column(Integer, primary_key=True)
31
107
    vlan_name = Column(String(255))
32
 
    network_id = Column(String(255), nullable=False)
33
 
    #foreign key to networks.uuid
 
108
    network_id = Column(String(255), ForeignKey("networks.uuid"), \
 
109
                        nullable=False)
 
110
    network = relation(Network, uselist=False)
34
111
 
35
112
    def __init__(self, vlan_id, vlan_name, network_id):
36
113
        self.vlan_id = vlan_id
42
119
          (self.vlan_id, self.vlan_name, self.network_id)
43
120
 
44
121
 
45
 
class PortProfile(BASE):
 
122
class PortProfile(BASE, L2NetworkBase):
46
123
    """Represents L2 network plugin level PortProfile for a network"""
47
124
    __tablename__ = 'portprofiles'
48
125
 
62
139
          (self.uuid, self.name, self.vlan_id, self.qos)
63
140
 
64
141
 
65
 
class PortProfileBinding(BASE):
 
142
class PortProfileBinding(BASE, L2NetworkBase):
66
143
    """Represents PortProfile binding to tenant and network"""
67
144
    __tablename__ = 'portprofile_bindings'
68
145
 
69
146
    id = Column(Integer, primary_key=True, autoincrement=True)
70
147
    tenant_id = Column(String(255))
71
148
 
72
 
    network_id = Column(String(255), nullable=False)
73
 
    #foreign key to networks.uuid
74
 
    portprofile_id = Column(String(255), nullable=False)
75
 
    #foreign key to portprofiles.uuid
 
149
    network_id = Column(String(255), ForeignKey("networks.uuid"), \
 
150
                        nullable=False)
 
151
    portprofile_id = Column(String(255), ForeignKey("portprofiles.uuid"), \
 
152
                            nullable=False)
76
153
    default = Column(Boolean)
 
154
    network = relation(Network, uselist=False)
 
155
    portprofile = relation(PortProfile, uselist=False)
77
156
 
78
157
    def __init__(self, tenant_id, network_id, portprofile_id, default):
79
158
        self.tenant_id = tenant_id