Merge lp://qastaging/~raxnetworking/nova/melange into lp://qastaging/~hudson-openstack/nova/trunk

Proposed by Josh Kearney
Status: Work in progress
Proposed branch: lp://qastaging/~raxnetworking/nova/melange
Merge into: lp://qastaging/~hudson-openstack/nova/trunk
Diff against target: 10561 lines (+10125/-10)
70 files modified
.bzrignore (+6/-9)
.mailmap (+1/-0)
Authors (+4/-0)
bin/melange (+67/-0)
bin/melange-client (+219/-0)
bin/melange-delete-deallocated-ips (+66/-0)
bin/melange-manage (+124/-0)
etc/melange/melange.conf.sample (+82/-0)
melange/README (+16/-0)
melange/__init__.py (+33/-0)
melange/common/__init__.py (+16/-0)
melange/common/auth.py (+83/-0)
melange/common/client.py (+57/-0)
melange/common/config.py (+49/-0)
melange/common/exception.py (+52/-0)
melange/common/extensions.py (+29/-0)
melange/common/pagination.py (+89/-0)
melange/common/utils.py (+167/-0)
melange/common/wsgi.py (+255/-0)
melange/db/__init__.py (+46/-0)
melange/db/sqlalchemy/__init__.py (+16/-0)
melange/db/sqlalchemy/api.py (+232/-0)
melange/db/sqlalchemy/mappers.py (+71/-0)
melange/db/sqlalchemy/migrate_repo/README (+4/-0)
melange/db/sqlalchemy/migrate_repo/__init__.py (+16/-0)
melange/db/sqlalchemy/migrate_repo/manage.py (+21/-0)
melange/db/sqlalchemy/migrate_repo/migrate.cfg (+21/-0)
melange/db/sqlalchemy/migrate_repo/schema.py (+63/-0)
melange/db/sqlalchemy/migrate_repo/versions/001_base_schema.py (+128/-0)
melange/db/sqlalchemy/migrate_repo/versions/__init__.py (+18/-0)
melange/db/sqlalchemy/migration.py (+132/-0)
melange/db/sqlalchemy/session.py (+89/-0)
melange/extensions/__init__.py (+16/-0)
melange/ipam/__init__.py (+16/-0)
melange/ipam/client.py (+267/-0)
melange/ipam/models.py (+864/-0)
melange/ipam/service.py (+508/-0)
melange/ipam/views.py (+64/-0)
melange/ipv4/__init__.py (+22/-0)
melange/ipv4/db_based_ip_generator.py (+46/-0)
melange/ipv6/__init__.py (+36/-0)
melange/ipv6/rfc2462_generator.py (+43/-0)
melange/ipv6/tenant_based_generator.py (+48/-0)
melange/tests/__init__.py (+81/-0)
melange/tests/factories/__init__.py (+16/-0)
melange/tests/factories/models.py (+94/-0)
melange/tests/functional/__init__.py (+111/-0)
melange/tests/functional/server.py (+78/-0)
melange/tests/functional/test_cli.py (+478/-0)
melange/tests/functional/test_service.py (+83/-0)
melange/tests/unit/__init__.py (+87/-0)
melange/tests/unit/mock_generator.py (+28/-0)
melange/tests/unit/test_auth.py (+210/-0)
melange/tests/unit/test_config.py (+50/-0)
melange/tests/unit/test_extensions.py (+51/-0)
melange/tests/unit/test_ipam_models.py (+1658/-0)
melange/tests/unit/test_ipam_service.py (+1905/-0)
melange/tests/unit/test_ipam_views.py (+69/-0)
melange/tests/unit/test_ipv6.py (+59/-0)
melange/tests/unit/test_pagination.py (+73/-0)
melange/tests/unit/test_rfc2462_ipv6_generator.py (+52/-0)
melange/tests/unit/test_tenant_based_ipv6_generator.py (+58/-0)
melange/tests/unit/test_utils.py (+183/-0)
melange/tests/unit/test_versions.py (+58/-0)
melange/tests/unit/test_wsgi.py (+315/-0)
melange/version.py (+32/-0)
melange/versions.py (+86/-0)
run_tests.sh (+1/-0)
tools/install_venv.py (+4/-0)
tools/pip-requires (+3/-1)
To merge this branch: bzr merge lp://qastaging/~raxnetworking/nova/melange
Reviewer Review Type Date Requested Status
Thierry Carrez (community) ffe Abstain
Brian Lamar (community) Needs Fixing
Sandy Walsh Pending
Jay Pipes Pending
Rick Harris Pending
Vish Ishaya Pending
Review via email: mp+72926@code.qastaging.launchpad.net

This proposal supersedes a proposal from 2011-08-17.

Description of the change

adds melange to nova

melange is currently an IP or L3 management service, but will probably expand into more of a "network identifier" management service which may include L2 data in the future.

To post a comment you must log in.
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

Getting some errors http://paste.openstack.org/show/2187/
(are you running novaclient 2.6.1?)

review: Needs Information
Revision history for this message
Josh Kearney (jk0) wrote : Posted in a previous version of this proposal

> Getting some errors http://paste.openstack.org/show/2187/
> (are you running novaclient 2.6.1?)

That's odd. All tests pass for me running the latest novaclient.

Revision history for this message
Vish Ishaya (vishvananda) wrote : Posted in a previous version of this proposal

This is looking good guys. First impression is that the code is pretty clean and well laid out. Quick nits in my first glance at the code:

Not sure about the changes to bzrignore. Why remove the ignores for logs and sqlite dbs?

3320 +required_dbs=['mysql','postgres','sqllite']
extra l in sqlite.

Are there some tests as well? I see reference to melage/tests/unit in a couple places, but no actual code

review: Needs Information
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

ok, got the tests running again. Was running an older eventlet and the easy_install and pip were conflicting with two versions.

But melange tests are failing

http://paste.openstack.org/show/2188/

review: Needs Fixing
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

unit tests pass, but functional tests won't run
http://paste.openstack.org/show/2189/

review: Needs Fixing
Revision history for this message
Trey Morris (tr3buchet) wrote : Posted in a previous version of this proposal

Vish, there are tests, this diff is truncated, yay launchpad. You'll have to use commandline diffs.

The tests are located in melange/tests/.

sqllite -> sqlite

As for the bzrignore changes:
*.DS_Store, .project, and .pydevproject
were simply moved, no harm no foul i guess

run_tests.err.log
run_tests.log
are replaced with *.log

nova.sqlite
clean.sqlite
tests.sqlite
are replaced with *.sqlite

Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

There is *so* much copy-paste from nova in here I feel dirty pressing Approve.

Why not just make it a proper Nova service under the network service and do it right?

review: Needs Information
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

For unit tests we shouldn't have to create a db or copy/move a .conf file. Maybe for functional tests.

Revision history for this message
Josh Kearney (jk0) wrote : Posted in a previous version of this proposal

> For unit tests we shouldn't have to create a db or copy/move a .conf file.
> Maybe for functional tests.

Hm, I never had to do that. Does it say that somewhere?

Revision history for this message
Jay Pipes (jaypipes) wrote : Posted in a previous version of this proposal

Some notes...

1) I probably missed a discussion somewhere, but weren't we planning on having melange as a completely separate service?

2) I don't think it's a good idea to have tools like bin/melange accessing or configuring the db API manually... this should be done through a client class only, and bin/melange shouldn't be configuring any database at all.

3) The bin/melange-manage has copyright headers having to do with Django's interactive shell, but I see no evidence of django interactive shell stuff being used there.

4) Agree with Vishy on some of the bzrignore stuff... for instance, what is this:

 34 +.ropeproject

?

5) Executables like bin/melange-delete-deallocated-ips should a) be combined into a single melange-manage tool, and b) Should not directly access db models or API... these should be client commands. These tools look like they were written assuming someone would always be logged into the box running the melange server; this should not be the case. An admin should be able to run bin/melange-manage and similar tools from anywhere, and a Melange client class should send HTTP commands to the Melange server, not directly interact with the underlying database...

6) Pretty much all of the code in bin/melange-manage should be in a melange.Client class, with the melange-manage executable being a simple CLI wrapper around the client calls, instead of being direct HTTP calls.

7)

1364 +def integer(value):
1365 + return int(value)

Really?

8) I would recommend removing all of the "extensions" code in /melange/extensions/. IMO, YAGNI, and it just makes things overly complicated.

9) Nobody is upgrading melange yet, so not sure any of the db-migrate scripts are necessary

Cheers,
jay

review: Needs Fixing
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

+1 to Jay's feedback.

This should really be our motivation to push on openstack-common.

Revision history for this message
Jay Pipes (jaypipes) wrote : Posted in a previous version of this proposal

Where we are putting common code (that will eventually become openstack.common...)

https://github.com/openstack/openstack-skeleton/

Revision history for this message
Rick Harris (rconradharris) wrote : Posted in a previous version of this proposal

+1 on Jay's comments

Some other minor nits:

> 268 +from gettext import gettext as _

Nova uses this pattern for importing gettext (might be a good idea to match):

    import gettext
    gettext.install('melange', unicode=1)

> 1005 + def do_request(self, method, path, body=None, headers={}, params={}):

Usually not a good idea to use mutable types as default arguments since the
default is shared across invocations which can lead to some very strange bugs.
A better approach is usually to do something like:

    def do_request(self, method, path, body=None, headers=None, params=None):
        headers = headers or {}
        params = params or {}

        # OR

        if not headers:
            headers = {}

> 1384 +def boolean(subject):

Nova already has a pretty well tested boolean to string method
`utils.bool_from_str`. It would probably be a good idea to use that if
possible.

> === added file 'melange/common/utils.py'
>

Pertains to all of melange/common/ really:

Since melange resides in the same source tree as Nova, it would probably be a
good idea to pull as much as this as possible from nova.utils directly (rather than duplicate it).

As mentioned above, an even better solution is to have openstack.common as an external dependency (at some point).

review: Needs Fixing
Revision history for this message
Sandy Walsh (sandy-walsh) wrote : Posted in a previous version of this proposal

+1 to Rick's suggestion of, at least, fixing the imports to use nova's existing code base.

1358. By Rajaram Mallya

Rajaram/Vinkesh| updated readme file

1359. By Rajaram Mallya

Rajaram/Vinkesh| used wsgi.resource from openstack.common

1360. By Rajaram Mallya

merge from nova trunk

Revision history for this message
Thierry Carrez (ttx) wrote :

As discussed in last week meeting, this should wait for Essex opening -- September 8.

review: Disapprove (ffe)
Revision history for this message
Brian Lamar (blamar) wrote :
Download full text (16.8 KiB)

This is quite a lengthy review for a lengthy merge request.

I tried to be as pedantic as possible, so you're going to see a LOT of me repeating myself. Overall the code looks pretty good from a style perspective although I haven't even started testing the code for functionality, so this review is all about style.

Top issues:

1) Newlines between imports and the copyright header. For some reason no separation here makes me bonkers. I don't think this is a PEP8 requirement, but it seems to be consistent with Nova to have a space here.

2) Importing classes and methods. Having imports only deal with modules makes things easier down the line.

-----------------

96 +# under the License.
97 +import gettext

Please separate with an empty line.

112 +gettext.install('melange', unicode=1)

In nova, we put this in nova/__init__.py because it was used so frequently. I think it makes sense for melange to do the same.

119 +def create_options(parser):
120 + """
121 + Sets up the CLI and config-file options that may be
122 + parsed and program commands.
123 + :param parser: The option parser
124 + """

According the HACKING, this docstring should read something along the lines of:

def create_options(parser):
    """Adds needed options to the given parser.

    :param parser: The option parser to add options to.
    :returns: None

    """

134 + oparser = optparse.OptionParser(version='%%prog VERSION')

Should there be a VERSION substitute here?

144 + except RuntimeError, e:

As a rule for Python future compatibility, I would suggets this be replaced with:

except RuntimeError as error:

In general replace all commas in 'except' statements with "as" and try not to use single letter names.

168 +"""
169 + CLI interface for IPAM.
170 +"""
171 +import gettext

Space to look like:

# under the License.

"""CLI interface for IPAM."""

import gettext

185 +gettext.install("melange", unicode=1)

Same gettext suggestion as earlier.

188 +from melange.common.auth import KeystoneClient
189 +from melange.common.client import HTTPClient
190 +from melange.common.utils import MethodInspector
191 +from melange.ipam.client import (IpBlockClient, SubnetClient, PolicyClient,
192 + UnusableIpOctetsClient,
193 + UnusableIpRangesClient)

No importing classes, and only one import per line.

196 +def create_options(parser):
197 + """
198 + Sets up the CLI and config-file options that may be
199 + parsed and program commands.
200 +
201 + :param parser: The option parser
202 + """

Fix docstring according to HACKING.

237 + """
238 + Returns the parsed CLI options, command to run and its arguments, merged
239 + with any same-named options found in a configuration file
240 +
241 + :param parser: The option parser
242 + """

Fix docstring according to HACKING.

252 +%prog category action [args] [options]"

Not sure if the " should be at the end there.

262 +categories = dict(ip_block=IpBlockClient, subnet=SubnetClient,
263 + policy=PolicyClient, unusable_ip_range=UnusableIpRangesClient,
264 + unusable_ip_octet=Unu...

review: Needs Fixing
1361. By Rajaram Mallya

Rajaram| Newline between imports and copyright header, imports only import modules, doc strings as per HACKING guide

1362. By Rajaram Mallya

Rajaram|missed a couple of pep8 voilations

Revision history for this message
Rajaram Mallya (rajarammallya) wrote :
Download full text (5.6 KiB)

Thanks Brain, for taking the time out for such a thorough review.
Wish I had adhered to the HACKING guide better :-)

We are halfway through fixing the style and other issues you raised.
Also fixing these style issues for the rest of the melange code that you
couldnt go through.

I though I would elaborate on only those issues that need a little more
discussion and not mention the ones that we are fixing anyway:

> 967 +from openstack.common.config import (parse_options,
> 968 + add_log_options,
> 969 + add_common_options,
> 970 + load_paste_config,
> 971 + setup_logging,
> 972 + load_paste_app, get_option)
>
> I'm not sure how you're running this right now as there isn't an official
> openstack.common package/module. I'm guessing you're just using the openstack-
> skeleton project? I hope to get the openstack-common initiative on the road
> soon so.

We are using openstack.common from the skeleton project. We made a few changes to
it so that we could use it in Melange. We are also looking to move extensions and
default serializers to openstack.common so that we can remove most of the copy-paste
code that sits in Melange today.
To allow Melange to access the skeleton projects, we have done the following in
tools/install_venv.py:
+ run_command(['tools/with_venv.sh', 'pip', 'install', '-E', venv, '-e',
+ "git+https://github.com/rajarammallya/"
+ "openstack-skeleton.git#egg=skeleton"],
+ redirect_output=False)

Of course, we will replace the reference to the personal git branch with the
main git branch for the skeleton project once we get all our changes approved
in the main git branch.
I suppose this can be changed to a pip_requires once there is a package ready for
openstack.common

> 967 +from openstack.common.config import (parse_options,
> 968 + add_log_options,
> 969 + add_common_options,
> 970 + load_paste_config,
> 971 + setup_logging,
> 972 + load_paste_app, get_option)
> These lines, however, need to import the module, not the individual methods.
> (so from openstack.common import config)
> Actually, these lines are not currently used? So this import can actually go
> away completely?

This is an area we wanted some feedback on. We weren't sure if this way of doing things is
very unorthodox in python.
Importing openstack.common classes/functions into the corresponding melange.common module
allows the rest of the application to use the openstack common methods through melange.common
The rest of the app is unaware of wether the common stuff is coming from
openstack-common or is an overridden version from melange-common.
We will always have some classes from openstack.common that would be overriden to tailor it to
a particular project's needs. This may cause some confusion and ...

Read more...

Revision history for this message
Brian Lamar (blamar) wrote :
Download full text (4.1 KiB)

> We are halfway through fixing the style and other issues you raised.
> Also fixing these style issues for the rest of the melange code that you
> couldnt go through.

It's very much appreciated! Thank you.

> I though I would elaborate on only those issues that need a little more
> discussion and not mention the ones that we are fixing anyway:

Perfect, some things were personal preference so this is appreciated.

> This is an area we wanted some feedback on. We weren't sure if this way of
> doing things is
> very unorthodox in python.
> Importing openstack.common classes/functions into the corresponding
> melange.common module
> allows the rest of the application to use the openstack common methods through
> melange.common
> The rest of the app is unaware of wether the common stuff is coming from
> openstack-common or is an overridden version from melange-common.
> We will always have some classes from openstack.common that would be overriden
> to tailor it to
> a particular project's needs. This may cause some confusion and erroneous
> usage in the application
> if it ends up using the openstack.common class directly instead of an
> overriden class in
> melange.common. That is why we have done this. Is this too unconventional or
> do you see problems in this approach?

Limiting coupling points like this is something that I do myself and I didn't quite catch on that you were doing it for that reason. I'm fine with that strategy in general, although I don't know you gain a lot by doing it here.

I would suggest going this route to comply with HACKING:

from openstack.common import config

parse_options = config.parse_options
add_log_options = config.add_log_options
add_common_options = config.add_common_options
load_paste_config = config.load_paste_config
setup_logging = config.setup_logging
load_paste_app = config.load_paste_app
get_option = config.get_option

Although at this point you're not pylint variable name compliant because module-level labels need to be UpperCamelCase I believe.

> This is done for unit tests. We have a StubConfig class in unit tests that is
> used
> as follows:
> with unit.StubConfig(some_config_key="blah"):
> #access functions which read some_config_key
> #and assert that they ended up with the "blah" value
>
> StubConfig is able to override the value of some_config_key by resetting
> Config.instance within the "with" block.
> In the actual code, we are only setting Config.instance once, during app
> creation, so I dont see this becoming a problem. Do you think otherwise?

I'm fine with this for now. I'd love to have a hardcore revist when we put configuration management into common, but this is a valid strategy for the time being.

> HTTPNotAcceptable because the version might be coming from the ACCEPT headers
> as well.
> (The openstack Api1.1 spec mentioned that versions can come from a header,
> hence
> we also parse accept headers looking for a version)

This is a fine error if it is talking about headers but I don't think the method knows if it's parsed the API version from headers or from the URL right? If the API version is given in the Accept header and it's w...

Read more...

1363. By Rajaram Mallya

Vinkesh/Rajaram| Fixes as per Brain's comments:
1. :moved gettext.install to melange/__init__
2. melange-client raises errros only on option.verbose
3. Used urlparse.urljoin where applicable
4. Fixed version in bin/melange* scripts
and other misc fixes according to HACKING or style recomendations

1364. By Rajaram Mallya

Rajaram/Vinkesh|fixed more imports to import only modules and misc style improvements

Revision history for this message
Rajaram Mallya (rajarammallya) wrote :

> Limiting coupling points like this is something that I do myself and I didn't
> quite catch on that you were doing it for that reason. I'm fine with that
> strategy in general, although I don't know you gain a lot by doing it here.
>
> I would suggest going this route to comply with HACKING:
>
> from openstack.common import config
>
>
> parse_options = config.parse_options
> add_log_options = config.add_log_options
> add_common_options = config.add_common_options
> load_paste_config = config.load_paste_config
> setup_logging = config.setup_logging
> load_paste_app = config.load_paste_app
> get_option = config.get_option
>
>
> Although at this point you're not pylint variable name compliant because
> module-level labels need to be UpperCamelCase I believe.

Nice approach, and more than HACKING compliance, I like the way this makes things more explicit.
With this, there wont be any misunderstandings about these being unused imports.
We'll use this approach, even though it would cause pylint voilations.

> > HTTPNotAcceptable because the version might be coming from the ACCEPT
> headers
> > as well.
> > (The openstack Api1.1 spec mentioned that versions can come from a header,
> > hence
> > we also parse accept headers looking for a version)
>
> This is a fine error if it is talking about headers but I don't think the
> method knows if it's parsed the API version from headers or from the URL
> right? If the API version is given in the Accept header and it's wrong then
> this is valid, if the API version is parsed from the URL then this isn't a
> valid exception. Not sure if that case is covered but I did forget that the
> version might be specified in the Accept header so there are absolutely cases
> where this works.

The HTTPNotAcceptable is raised only when accept headers contain the versions.
If the version is specified in the url, then it doesn't get into this code path at all.
Sorry if my comments might have led you to misunderstand this.

1365. By Rajaram Mallya

Rajaram/Vinkesh | Changed openstack.common imports in melange common to module level labels

1366. By Rajaram Mallya

Rajaram/Vinkesh | Made MelangeError a subclass of openstack common's OpenstackException, removed usages of merge_dicts

1367. By Rajaram Mallya

Vinkesh\Rajaram|made keystone auth optional in melange-client

1368. By Rajaram Mallya

Vinkesh/Rajaram|changed wsgi in melange.common to use serializers from openstack.common

1369. By Vinkesh Banka

Vinkesh/Rajaram| Added tests for melange-manage db_sync and db_upgrade commands

1370. By Rajaram Mallya

Rajaram/Vinkesh | Removed overridden get_content_type in wsgi.Request class

1371. By Rajaram Mallya

Vinkesh/Rajaram|Removed extensions code and started using openstack common's extension code

Revision history for this message
Thierry Carrez (ttx) wrote :

Essex is open !

review: Abstain (ffe)
1372. By Rajaram Mallya

Rajaram/Vinkesh|ipaddress now stores used_by_tenant to denote tenant using the ipaddress and used_by_device for the instance on which the ip_address is allocated

1373. By Rajaram Mallya

Vinkesh/Rajaram|Removed non tenanted resources from api

1374. By Rajaram Mallya

Vinkesh/Rajaram|Removed admin actions as after removing non tenant scoped resources, we dont have any admin actions

1375. By Rajaram Mallya

Merged from nova trunk

1376. By Rajaram Mallya

Rajaram/Vinkesh|nat resources in api are tenant scoped

1377. By Rajaram Mallya

Rajaram/Vinkesh | Non Tenanted resources can only be accessed by admins

1378. By Rajaram Mallya

Rajaram/Vinkesh| mandated PasteDeploy>=1.5 in pip_requires since melange uses call URI scheme from PasteDeploy 1.5

1379. By Rajaram Mallya

Rajaram/Vinkesh|added route to search for allocated ip addresses

1380. By Rajaram Mallya

Rajaram/Vinkesh | Added CLI commands for ip_address

1381. By Rajaram Mallya

Rajaram/Vinkesh | Removed some unused code. Added few tests. Miscellaneous small refactoring

1382. By Rajaram Mallya

Merged from nova trunk

1383. By Rajaram Mallya

Rajaram/Vinkesh | Cleaned up the code a bit. Small style fixes

1384. By Rajaram Mallya

Rajaram/Vinkesh| fixed bug in melange-delete-deallocated-ips where it wasnt loading the config file

1385. By Vinkesh Banka

Rajaram/Vinkesh | Consolidated migrations. Removed soft delete

1386. By Vinkesh Banka

Rajaram/Vinkesh | Added retries while allocating ips to fix concurrency problem

1387. By Vinkesh Banka

Rajaram/Vinkesh | AllocatedIps index now does not show deallocated IPs

1388. By Vinkesh Banka

Rajaram/Vinkesh | Added IpRoute model. Started using melange.conf.sample for tests

1389. By Vinkesh Banka

Rajaram/Vinkesh | Exposed CRUD APIs for ip_routes

1390. By Vinkesh Banka

Rajaram/Vinkesh | Added CLI for IpRoute

1391. By Vinkesh Banka

Rajaram/Vinkesh | Added ip_routes in ip_allocations' payload

1392. By Vinkesh Banka

Vinkesh | Validating gateway address is a valid address before IpBlock create/update

1393. By Vinkesh Banka

Vinkesh | Displaying an error message which asks users to provide a tenant_id in CLI if needed

1394. By Rajaram Mallya

Rajaram/Vinkesh|Changed ip allocation algo to not load all allocated ips at once

1395. By Rajaram Mallya

Vinkesh/Rajaram|moved ipv4 generation algo to a plugable module

Unmerged revisions

1395. By Rajaram Mallya

Vinkesh/Rajaram|moved ipv4 generation algo to a plugable module

1394. By Rajaram Mallya

Rajaram/Vinkesh|Changed ip allocation algo to not load all allocated ips at once

1393. By Vinkesh Banka

Vinkesh | Displaying an error message which asks users to provide a tenant_id in CLI if needed

1392. By Vinkesh Banka

Vinkesh | Validating gateway address is a valid address before IpBlock create/update

1391. By Vinkesh Banka

Rajaram/Vinkesh | Added ip_routes in ip_allocations' payload

1390. By Vinkesh Banka

Rajaram/Vinkesh | Added CLI for IpRoute

1389. By Vinkesh Banka

Rajaram/Vinkesh | Exposed CRUD APIs for ip_routes

1388. By Vinkesh Banka

Rajaram/Vinkesh | Added IpRoute model. Started using melange.conf.sample for tests

1387. By Vinkesh Banka

Rajaram/Vinkesh | AllocatedIps index now does not show deallocated IPs

1386. By Vinkesh Banka

Rajaram/Vinkesh | Added retries while allocating ips to fix concurrency problem

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
The diff is not available at this time. You can reload the page or download it.