flake8 compatibility

This commit is contained in:
amitgandhinz 2014-07-07 17:58:11 -04:00
parent 42ecd49601
commit d4d6a63453
23 changed files with 271 additions and 406 deletions

View File

@ -146,7 +146,20 @@ You can check the version currently running with
Open ./cqlsh and import the /cdn/storage/cassandra/schema.cql file
Running tests
-----------------------------
First install the additional requirements:
$ pip install tox
And then run tests:
$ tox -e py27
.. _`CassandraDB` : http://cassandra.apache.org
.. _`pyenv` : https://github.com/yyuu/pyenv/
.. _`virtualenv` : https://pypi.python.org/pypi/virtualenv/

View File

@ -14,7 +14,6 @@
# limitations under the License.
import abc
import json
import traceback
import six
import sys
@ -78,17 +77,18 @@ class ServiceBase(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def update(self):
def update(self, service_name, service_json):
raise NotImplementedError
@abc.abstractmethod
def create(self):
def create(self, service_name, service_json):
raise NotImplementedError
@abc.abstractmethod
def delete(self):
def delete(self, service_name):
raise NotImplementedError
class ProviderResponse(object):
def __init__(self, provider_type):
self.provider = provider_type
@ -99,34 +99,29 @@ class ProviderResponse(object):
print "error: ", self.provider, msg, ex_type, ex
traceback.print_tb(tb)
return {
self.provider: {
"error" : msg
}
return {
self.provider: {
"error": msg
}
}
def created(self, domain):
return {
self.provider : {
return {
self.provider: {
"domain": domain
}
}
}
def updated(self, domain):
return {
self.provider : {
return {
self.provider: {
"domain": domain
}
}
}
def deleted(self, domain):
return {
self.provider : {
return {
self.provider: {
"domain": domain
}
}
}

View File

@ -44,7 +44,6 @@ class CDNProvider(provider.CDNProviderBase):
self.client = fastly.connect(self.fastly_conf.apikey)
def is_alive(self):
return True

View File

@ -14,7 +14,6 @@
# limitations under the License.
import fastly
import json
from cdn.provider import base
@ -29,7 +28,7 @@ class ServiceController(base.ServiceBase):
self.provider_resp = base.ProviderResponse("fastly")
def update(self):
def update(self, service_name, service_json):
print "update services"
def create(self, service_name, service_json):
@ -37,26 +36,26 @@ class ServiceController(base.ServiceBase):
try:
# Create a new service
service = self.client.create_service(self.current_customer.id,
service_name)
service_name)
# Create a new version of the service.
service_version = self.client.create_version(service.id)
# Create the domain for this service
for domain in service_json["domains"]:
domain = self.client.create_domain(service.id,
service_version.number,
domain["domain"])
domain = self.client.create_domain(service.id,
service_version.number,
domain["domain"])
for origin in service_json["origins"]:
# Create the origins for this domain
backend = self.client.create_backend(service.id,
service_version.number,
origin["origin"],
origin["origin"],
origin["ssl"],
origin["port"]
)
self.client.create_backend(service.id,
service_version.number,
origin["origin"],
origin["origin"],
origin["ssl"],
origin["port"]
)
return self.provider_resp.created(service.name)
@ -69,12 +68,10 @@ class ServiceController(base.ServiceBase):
try:
# Get the service
service = self.client.get_service_by_name(service_name)
# Delete the service
deleted = self.client.delete_service(service.id)
self.client.delete_service(service.id)
return self.provider_resp.deleted(service_name)
except:
return self.provider_resp.failed("failed to delete service")

View File

@ -20,8 +20,6 @@ from cdn.openstack.common import log as logging
from cdn import provider
from cdn.provider.mock import controllers
from oslo.config import cfg
LOG = logging.getLogger(__name__)

View File

@ -24,12 +24,11 @@ class ServiceController(base.ServiceBase):
self.provider_resp = base.ProviderResponse("mock")
def update(self):
def update(self, service_name, service_json):
return self.provider_resp.updated(service_name)
def create(self, service_name, service_json):
return self.provider_resp.created(service_name)
def delete(self, service_name):
return self.provider_resp.deleted(service_name)

View File

@ -97,10 +97,13 @@ class ServicesBase(ControllerBase):
@abc.abstractmethod
def list(self, project_id):
raise NotImplementedError
@abc.abstractmethod
def create(self, project_id, service_name, service_json):
return self.driver.providers.map(self.wrapper.create, service_name, service_json)
return self.driver.providers.map(
self.wrapper.create,
service_name,
service_json)
@abc.abstractmethod
def update(self, project_id, service_name):
@ -125,5 +128,3 @@ class ProviderWrapper(object):
def delete(self, ext, service_name):
return ext.obj.service_controller.delete(service_name)

View File

@ -54,7 +54,6 @@ class StorageDriver(storage.StorageDriverBase):
def is_alive(self):
return True
@decorators.lazy_property(write=False)
def connection(self):
"""Cassandra connection instance."""

View File

@ -14,30 +14,49 @@
# limitations under the License.
import json
import uuid
from cdn.storage import base
CQL_GET_ALL_SERVICES = '''
SELECT project_id, service_name, domains, origins, caching_rules, restrictions
FROM services
SELECT project_id,
service_name,
domains,
origins,
caching_rules,
restrictions
FROM services
WHERE project_id = %(project_id)s
'''
CQL_GET_SERVICE = '''
SELECT project_id, service_name, domains, origins, caching_rules, restrictions
FROM services
SELECT project_id,
service_name,
domains,
origins,
caching_rules,
restrictions
FROM services
WHERE project_id = %(project_id)s AND service_name = %(service_name)s
'''
CQL_DELETE_SERVICE = '''
DELETE FROM services
DELETE FROM services
WHERE project_id = %(project_id)s AND service_name = %(service_name)s
'''
CQL_CREATE_SERVICE = '''
INSERT INTO services (project_id, service_name, domains, origins, caching_rules, restrictions)
VALUES (%(project_id)s, %(service_name)s, %(domains)s, %(origins)s, %(caching_rules)s, %(restrictions)s)
INSERT INTO services (project_id,
service_name,
domains,
origins,
caching_rules,
restrictions)
VALUES (%(project_id)s,
%(service_name)s,
%(domains)s,
%(origins)s,
%(caching_rules)s,
%(restrictions)s)
'''
CQL_UPDATE_DOMAINS = '''
@ -72,86 +91,31 @@ class ServicesController(base.ServicesBase):
self._session = self.driver.service_database
def list(self, project_id):
# get all services
args = {
'project_id' : project_id
}
'project_id': project_id
}
result = self._session.execute(CQL_GET_ALL_SERVICES, args)
# TODO (amitgandhinz) : build the formatted json structure from the result
services = {
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.myothersite.com&limit=20"
}
],
"services" : [
{
"name" : "mywebsite",
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{ "name" : "default", "ttl" : 3600 },
{
"name" : "home",
"ttl" : 17200,
"rules" : [
{ "name" : "index", "request_url" : "/index.htm" }
]
},
{
"name" : "images",
"ttl" : 12800,
"rules" : [
{ "name" : "images", "request_url" : "*.png" }
]
}
],
"restrictions" : [
{
"name" : "website only",
"rules" : [ { "name" : "mywebsite.com", "http_host" : "www.mywebsite.com" } ]
}
],
"links" : [
{
"href": "/v1.0/services/mywebsite",
"rel" : "self"
}
]
}
]
}
#TODO (amitgandhinz): return services instead once its formatted.
# TODO (amitgandhinz) : build the formatted json structure from the
# result
# TODO (amitgandhinz): return services instead once its formatted.
return result
def get(self, project_id, service_name):
# get the requested service from storage
args = {
'project_id' : project_id ,
'service_name' : service_name
}
'project_id': project_id,
'service_name': service_name
}
result = self._session.execute(CQL_GET_SERVICE, args)
# TODO (amitgandhinz): need to format this return result in the correct format.
# TODO (amitgandhinz): need to format this return result in the correct
# format.
return result
def create(self, project_id, service_name, service_json):
@ -161,24 +125,26 @@ class ServicesController(base.ServicesBase):
domains = [json.dumps(domain) for domain in service["domains"]]
origins = [json.dumps(origin) for origin in service["origins"]]
caching_rules = [json.dumps(caching_rule) for caching_rule in service["caching"]]
restrictions = [json.dumps(restriction )for restriction in service["restrictions"]]
caching_rules = [json.dumps(caching_rule)
for caching_rule in service["caching"]]
restrictions = [json.dumps(restriction)
for restriction in service["restrictions"]]
# creates a new service
args = {
'project_id' : project_id,
'service_name' : service_name,
'domains' : domains,
'origins' : origins,
'caching_rules' : caching_rules,
'restrictions' : restrictions
}
'project_id': project_id,
'service_name': service_name,
'domains': domains,
'origins': origins,
'caching_rules': caching_rules,
'restrictions': restrictions
}
result = self._session.execute(CQL_CREATE_SERVICE, args)
self._session.execute(CQL_CREATE_SERVICE, args)
# create at providers
providers = super(ServicesController, self).create(project_id, service_name, service)
providers = super(ServicesController, self).create(
project_id, service_name, service)
return providers
@ -190,17 +156,17 @@ class ServicesController(base.ServicesBase):
# update those columns provided only.
# update at providers
return super(ServicesController, self).update(project_id, service_name, service_json)
return super(ServicesController, self).update(project_id,
service_name,
service_json)
def delete(self, project_id, service_name):
# delete local configuration from storage
args = {
'project_id' : project_id ,
'service_name' : service_name
}
res = self._session.execute(CQL_DELETE_SERVICE, args)
'project_id': project_id,
'service_name': service_name
}
self._session.execute(CQL_DELETE_SERVICE, args)
# delete from providers
return super(ServicesController, self).delete(project_id, service_name)

View File

@ -33,8 +33,6 @@ MOCKDB_GROUP = 'drivers:storage:mockdb'
def _connection():
return None
@ -50,7 +48,6 @@ class StorageDriver(storage.StorageDriverBase):
def is_alive(self):
return True
@decorators.lazy_property(write=False)
def connection(self):
"""Connection instance."""

View File

@ -13,8 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import uuid
from cdn.storage import base
@ -25,64 +23,69 @@ class ServicesController(base.ServicesBase):
self._session = self.driver.service_database
def list(self, project_id):
services = {
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.myothersite.com&limit=20"
}
],
"services" : [
{
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{ "name" : "default", "ttl" : 3600 },
{
"name" : "home",
"ttl" : 17200,
"rules" : [
{ "name" : "index", "request_url" : "/index.htm" }
]
},
{
"name" : "images",
"ttl" : 12800,
"rules" : [
{ "name" : "images", "request_url" : "*.png" }
]
}
],
"restrictions" : [
{
"name" : "website only",
"rules" : [ { "name" : "mywebsite.com", "http_host" : "www.mywebsite.com" } ]
}
],
"links" : [
{
"href": "/v1.0/services/mywebsite",
"rel" : "self"
}
]
}
]
}
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.test.com&limit=20"
}
],
"services": [
{
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{"name": "default", "ttl": 3600},
{
"name": "home",
"ttl": 17200,
"rules": [
{"name": "index",
"request_url": "/index.htm"}
]
},
{
"name": "images",
"ttl": 12800,
"rules": [
{"name": "images", "request_url": "*.png"}
]
}
],
"restrictions": [
{
"name": "website only",
"rules": [
{
"name": "mywebsite.com",
"http_host": "www.mywebsite.com"
}
]
}
],
"links": [
{
"href": "/v1.0/services/mywebsite",
"rel": "self"
}
]
}
]
}
return services
def get(self, project_id):
# get the requested service from storage
print "get service"
@ -90,7 +93,8 @@ class ServicesController(base.ServicesBase):
def create(self, project_id, service_name, service_json):
# create at providers
providers = super(ServicesController, self).create(project_id, service_name, service_json)
providers = super(ServicesController, self).create(
project_id, service_name, service_json)
return providers
@ -98,11 +102,11 @@ class ServicesController(base.ServicesBase):
# update configuration in storage
# update at providers
return super(ServicesController, self).update(project_id, service_name, service_json)
return super(ServicesController, self).update(project_id,
service_name,
service_json)
def delete(self, project_id, service_name):
# delete from providers
return super(ServicesController, self).delete(project_id, service_name)

View File

@ -22,6 +22,6 @@ Field Mappings:
updated and documented in each controller class.
"""
from cdn.storage.mongodb import hosts
from cdn.storage.mongodb import services
ServicesController = servicess.ServicesController
ServicesController = services.ServicesController

View File

@ -97,5 +97,3 @@ class StorageDriver(storage.StorageDriverBase):
name = self.mongodb_conf.database + '_services'
return self.connection[name]

View File

@ -21,58 +21,64 @@ class ServicesController(base.ServicesBase):
def list(self, project_id):
services = {
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.myothersite.com&limit=20"
}
],
"services" : [
{
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{ "name" : "default", "ttl" : 3600 },
{
"name" : "home",
"ttl" : 17200,
"rules" : [
{ "name" : "index", "request_url" : "/index.htm" }
]
},
{
"name" : "images",
"ttl" : 12800,
"rules" : [
{ "name" : "images", "request_url" : "*.png" }
]
}
],
"restrictions" : [
{
"name" : "website only",
"rules" : [ { "name" : "mywebsite.com", "http_host" : "www.mywebsite.com" } ]
}
],
"links" : [
{
"href": "/v1.0/services/mywebsite",
"rel" : "self"
}
]
}
]
}
"links": [
{
"rel": "next",
"href": "/v1.0/services?marker=www.test.com&limit=20"
}
],
"services": [
{
"domains": [
{
"domain": "www.mywebsite.com"
}
],
"origins": [
{
"origin": "mywebsite.com",
"port": 80,
"ssl": False
}
],
"caching": [
{"name": "default", "ttl": 3600},
{
"name": "home",
"ttl": 17200,
"rules": [
{"name": "index",
"request_url": "/index.htm"}
]
},
{
"name": "images",
"ttl": 12800,
"rules": [
{"name": "images", "request_url": "*.png"}
]
}
],
"restrictions": [
{
"name": "website only",
"rules": [
{
"name": "mywebsite.com",
"http_host": "www.mywebsite.com"
}
]
}
],
"links": [
{
"href": "/v1.0/services/mywebsite",
"rel": "self"
}
]
}
]
}
return services
@ -86,18 +92,20 @@ class ServicesController(base.ServicesBase):
service = service_json
# create at providers
return super(ServicesController, self).create(project_id, service_name, service)
return super(ServicesController, self).create(project_id,
service_name,
service)
def update(self, project_id, service_name, service_json):
# update configuration in storage
# update at providers
return super(ServicesController, self).update(project_id, service_name, service_json)
return super(ServicesController, self).update(project_id,
service_name,
service_json)
def delete(self, project_id, service_name):
# delete local configuration from storage
# delete from providers
return super(ServicesController, self).delete(project_id, service_name)

View File

@ -61,7 +61,6 @@ class TransportDriver(transport.DriverBase):
prefix = version_path + project_id
# init the controllers
service_controller = self._storage.service_controller

View File

@ -45,7 +45,9 @@ class ServiceResource:
"""
service_json = json.loads(req.stream.read(req.content_length))
service = self.service_controller.create(project_id, service_name, service_json)
service = self.service_controller.create(project_id,
service_name,
service_json)
resp.status = falcon.HTTP_200
resp.body = json.dumps(service)

View File

@ -18,24 +18,24 @@ import json
# NOTE(amitgandhinz): http://tools.ietf.org/html/draft-nottingham-json-home-03
JSON_HOME = {
"resources": {
"rel/cdn": {
"href-template": "services{?marker,limit}",
"href-vars": {
"marker": "param/marker",
"limit": "param/limit"
},
"hints": {
"allow": [
"GET"
],
"formats": {
"application/json": {}
}
}
}
"resources": {
"rel/cdn": {
"href-template": "services{?marker,limit}",
"href-vars": {
"marker": "param/marker",
"limit": "param/limit"
},
"hints": {
"allow": [
"GET"
],
"formats": {
"application/json": {}
}
}
}
}
}
class V1Resource(object):

View File

@ -1,22 +0,0 @@
# Metrics and style
hacking>=0.5.6,<0.8
# Packaging
mock>=1.0
# Unit testing
ddt>=0.4.0
discover
fixtures>=0.3.14
httpretty>=0.6.3
python-subunit
testrepository>=0.0.17
testtools>=0.9.32
# Functional Tests
requests>=1.1
# Test runner
nose
nose-exclude
openstack.nose_plugin>=0.7

View File

@ -1,36 +0,0 @@
# Copyright (c) 2014 Rackspace, 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.
import os
from pecan import set_config
from pecan.testing import load_test_app
from unittest import TestCase
__all__ = ['FunctionalTest']
class FunctionalTest(TestCase):
"""Used for functional tests where you need to test your
literal application and its integration with the framework.
"""
def setUp(self):
self.app = load_test_app(os.path.join(
os.path.dirname(__file__),
'config.py'
))
def tearDown(self):
set_config({}, overwrite=True)

View File

@ -12,28 +12,10 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Server Specific Configurations
server = {
'port': '8080',
'host': '0.0.0.0'
}
# Pecan Application Configurations
app = {
'root': 'cdn.controllers.root.RootController',
'modules': ['cdn'],
'static_root': '%(confdir)s/../../public',
'template_path': '%(confdir)s/../templates',
'debug': True,
'errors': {
'404': '/error/404',
'__force_dict__': True
}
}
# Custom Configurations must be in Python dictionary format::
#
# foo = {'bar':'baz'}
#
# All configurations are accessible at::
# pecan.conf

View File

@ -1,35 +0,0 @@
# Copyright (c) 2014 Rackspace, 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 cdn.tests import FunctionalTest
class TestRootController(FunctionalTest):
def test_get(self):
response = self.app.get('/')
assert response.status_int == 200
def test_search(self):
response = self.app.post('/', params={'q': 'RestController'})
assert response.status_int == 302
assert response.headers['Location'] == (
'http://pecan.readthedocs.org/en/latest/search.html'
'?q=RestController'
)
def test_get_not_found(self):
response = self.app.get('/a/bogus/url', expect_errors=True)
assert response.status_int == 404

View File

@ -1,10 +1,11 @@
import testtools
class UnitTestBase(testtools.TestCase):
def setUp(self):
super(UnitTestBase, self).setUp()
def setUp(self):
super(UnitTestBase, self).setUp()
def tearDown(self):
super(UnitTestBase, self).tearDown()
def tearDown(self):
super(UnitTestBase, self).tearDown()

View File

@ -14,8 +14,8 @@ setenv = VIRTUAL_ENV={envdir}
NOSE_OPENSTACK_YELLOW=0.025
NOSE_OPENSTACK_SHOW_ELAPSED=1
NOSE_OPENSTACK_STDOUT=1
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
deps = -r{toxinidir}/requirements/requirements.txt
-r{toxinidir}/tests/test-requirements.txt
commands = nosetests {posargs}
[tox:jenkins]
@ -31,7 +31,7 @@ setenv = NOSE_WITH_COVERAGE=1
commands = {posargs}
[flake8]
builtins = __MARCONI_SETUP__
builtins = __CDN_SETUP__
exclude = .venv*,venv*,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*.egg,.update-venv
[hacking]