Skip to content
This repository has been archived by the owner on Jan 19, 2022. It is now read-only.

Commit

Permalink
kv stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
uberj committed Aug 7, 2013
1 parent 0c4e2af commit d248cbb
Show file tree
Hide file tree
Showing 9 changed files with 985 additions and 417 deletions.
54 changes: 48 additions & 6 deletions invtool/dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
import simplejson as json
except ImportError:
import json
import requests

from gettext import gettext as _
from invtool.lib.registrar import registrar
from invtool.lib.config import REMOTE, auth


class Dispatch(object):
object_url = "/en-US/mozdns/api/v{0}_dns/{1}/{2}/"
object_list_url = "/en-US/mozdns/api/v{0}_dns/{1}/"

def format_response(self, nas, resp_msg, user_msg):
resp_list = []
if nas.p_json:
Expand All @@ -21,12 +21,11 @@ def format_response(self, nas, resp_msg, user_msg):
return resp_list

def handle_resp(self, nas, data, resp):

resp_msg = self.get_resp_dict(resp)

if resp.status_code == 404:
return 1, self.format_response(
nas, resp_msg, "http_status: 404 (file not found)"
nas, resp_msg, "http_status: 404 (not found)"
)
elif resp.status_code == 204:
if nas.p_json:
Expand All @@ -36,14 +35,16 @@ def handle_resp(self, nas, data, resp):
elif resp.status_code == 500:
resp_list = [_("SERVER ERROR! (Please email this output to a "
"code monkey)")]
return self.error_out(data, resp, resp_list=resp_list)
return self.error_out(nas, data, resp, resp_list=resp_list)
elif resp.status_code == 400:
# Bad Request
if nas.p_json:
return 1, [json.dumps(resp_msg, indent=2)]
else:
if 'error_messages' in resp_msg:
return self.get_errors(resp_msg['error_messages'])
elif 'message' in resp_msg:
return 1, [resp_msg['message']]
else:
return 1, ["http_status: 400 (bad request)"]
elif resp.status_code == 201:
Expand Down Expand Up @@ -85,10 +86,51 @@ def get_resp_dict(self, resp):
return msg

def error_out(self, nas, data, resp, resp_list=[]):
resp_list.append(resp.content)
resp_list.append(str(nas))
resp_list.append(str(data))
return 1, resp_list

def delete(self, nas):
url = "{0}{1}?format=json".format(REMOTE, self.delete_url(nas))
headers = {'content-type': 'application/json'}
resp = requests.delete(url, headers=headers, auth=auth)
return self.handle_resp(nas, {}, resp)

def detail(self, nas):
url = "{0}{1}?format=json".format(REMOTE, self.detail_url(nas))
headers = {'content-type': 'application/json'}
resp = requests.get(url, headers=headers, auth=auth)
return self.handle_resp(nas, {}, resp)

def update(self, nas):
data = self.get_update_data(nas) # Dispatch defined Hook
url = "{0}{1}".format(REMOTE, self.update_url(nas))
return self.action(nas, url, requests.patch, data)

def create(self, nas):
data = self.get_create_data(nas) # Dispatch defined Hook
url = "{0}{1}".format(REMOTE, self.create_url(nas))
return self.action(nas, url, requests.post, data)

def action(self, nas, url, method, data):
headers = {'content-type': 'application/json'}
data = json.dumps(data, indent=2)
resp = method(url, headers=headers, data=data, auth=auth)
return self.handle_resp(nas, data, resp)

def get_create_data(self, nas):
data = {}
for add_arg, extract_arg, test_method in self.create_args:
data.update(extract_arg(nas))
return data

def get_update_data(self, nas):
data = {}
for add_arg, extract_arg, test_method in self.update_args:
data.update(extract_arg(nas))
return data


def dispatch(nas):
for dispatch in registrar.dispatches:
Expand Down
207 changes: 116 additions & 91 deletions invtool/dns_dispatch.py
Original file line number Diff line number Diff line change
@@ -1,124 +1,98 @@
import requests

try:
import simplejson as json
except ImportError:
import json

from invtool.dispatch import Dispatch
from invtool.lib.registrar import registrar
from invtool.lib.config import API_MAJOR_VERSION, REMOTE, auth
from invtool.lib.options import (
from invtool.lib.config import API_MAJOR_VERSION
from invtool.lib.dns_options import (
fqdn_argument, ttl_argument, ip_argument, view_arguments,
description_argument, comment_argument, update_pk_argument,
delete_pk_argument, target_argument, detail_pk_argument, priority_argument,
port_argument, weight_argument
port_argument, weight_argument, system_argument, mac_argument,
interface_name_argument
)


class DNSDispatch(Dispatch):
object_url = "/en-US/mozdns/api/v{0}_dns/{1}/{2}/"
object_list_url = "/en-US/mozdns/api/v{0}_dns/{1}/"

def route(self, nas):
if self.dtype.lower() == nas.dtype.lower():
return getattr(self, nas.action.lower())(nas)

def delete(self, nas):
url = self.object_url.format(API_MAJOR_VERSION, self.resource_name,
nas.pk)
url = "{0}{1}?format=json".format(REMOTE, url)
headers = {'content-type': 'application/json'}
resp = requests.delete(url, headers=headers, auth=auth())
return self.handle_resp(nas, {}, resp)

def detail(self, nas):
url = self.object_url.format(API_MAJOR_VERSION, self.resource_name,
nas.pk)
url = "{0}{1}?format=json".format(REMOTE, url)
headers = {'content-type': 'application/json'}
resp = requests.get(url, headers=headers, auth=auth())
return self.handle_resp(nas, {}, resp)

def update(self, nas):
data = self.get_update_data(nas) # Dispatch defined Hook
tmp_url = self.object_url.format(API_MAJOR_VERSION, self.resource_name,
nas.pk)
url = "{0}{1}".format(REMOTE, tmp_url)
return self.action(nas, url, requests.patch, data)

def create(self, nas):
data = self.get_create_data(nas) # Dispatch defined Hook
tmp_url = self.object_list_url.format(API_MAJOR_VERSION,
self.resource_name)
url = "{0}{1}".format(REMOTE, tmp_url)
return self.action(nas, url, requests.post, data)

def action(self, nas, url, method, data):
headers = {'content-type': 'application/json'}
data = json.dumps(data, indent=2)
resp = method(url, headers=headers, data=data, auth=auth())
return self.handle_resp(nas, data, resp)

def get_create_data(self, nas):
data = {}
for add_arg, extract_arg, test_method in self.create_args:
data.update(extract_arg(nas))
return data
# TODO, dedup this code
def delete_url(self, nas):
return self.object_url.format(
API_MAJOR_VERSION, self.resource_name, nas.pk
)

def get_update_data(self, nas):
data = {}
for add_arg, extract_arg, test_method in self.update_args:
data.update(extract_arg(nas))
return data
def detail_url(self, nas):
return self.object_url.format(
API_MAJOR_VERSION, self.resource_name, nas.pk
)

def update_url(self, nas):
return self.object_url.format(
API_MAJOR_VERSION, self.resource_name, nas.pk
)

def build_create_parser(dispatch, action_parser):
create_parser = action_parser.add_parser('create', help="Create "
"a(n) {0} record".format(
dispatch.dtype))
for add_arg, extract_arg, test_method in dispatch.create_args:
add_arg(create_parser)
def create_url(self, nas):
return self.object_list_url.format(
API_MAJOR_VERSION, self.resource_name
)


def build_update_parser(dispatch, action_parser):
update_parser = action_parser.add_parser('update', help="Update "
"a(n) {0} record".format(
dispatch.dtype))
for add_arg, extract_arg, test_method in dispatch.update_args:
add_arg(update_parser, required=False)
class DispatchINTR(DNSDispatch):
resource_name = 'staticinterface'
dtype = 'INTR'
dgroup = 'dns'
ip_type = '4' # Used for testing

update_args = [
fqdn_argument('fqdn', dtype),
mac_argument('mac'),
interface_name_argument('interface_name'),
ttl_argument('ttl'),
ip_argument('ip_str', ip_type),
view_arguments('views'),
description_argument('description'),
comment_argument('comment')
]

def build_delete_parser(dispatch, action_parser):
delete_parser = action_parser.add_parser('delete', help="Delete "
"a(n) {0} record".format(
dispatch.dtype))
for add_arg, extract_arg, test_method in dispatch.delete_args:
add_arg(delete_parser)
create_args = update_args + [
system_argument('system_hostname'),
]

update_args = update_args + [
update_pk_argument('pk', dtype)
]

def build_detail_parser(dispatch, action_parser):
detail_parser = action_parser.add_parser('detail', help="Detail "
"a(n) {0} record".format(
dispatch.dtype))
for add_arg, extract_arg, test_method in dispatch.detail_args:
add_arg(detail_parser)
delete_args = [
delete_pk_argument('pk', dtype)
]

detail_args = [detail_pk_argument('pk', dtype)]

def build_dns_parsers(base_parser):
# Build all the records
def get_create_data(self, nas):
data = super(DispatchINTR, self).get_create_data(nas)
if 'ip_str' in data:
if data['ip_str'].find(':') < 0:
data['ip_type'] = '4'
else:
data['ip_type'] = '4'
return data

for dispatch in [d for d in registrar.dispatches if d.dgroup == 'dns']:
record_base_parser = base_parser.add_parser(
dispatch.dtype,
help="The interface for {0} records".format(dispatch.dtype),
add_help=True
)
action_parser = record_base_parser.add_subparsers(
help="{0} record actions".format(dispatch.dtype),
dest='action'
)
build_create_parser(dispatch, action_parser)
build_update_parser(dispatch, action_parser)
build_delete_parser(dispatch, action_parser)
build_detail_parser(dispatch, action_parser)
def get_update_data(self, nas):
data = super(DispatchINTR, self).get_update_data(nas)
if 'ip_str' in data:
if data['ip_str'].find(':') < 0:
data['ip_type'] = '4'
else:
data['ip_type'] = '4'
return data


class DispatchA(DNSDispatch):
Expand Down Expand Up @@ -328,10 +302,61 @@ class DispatchTXT(DNSDispatch):
detail_args = [detail_pk_argument('pk', dtype)]


registrar.register(DispatchINTR())
registrar.register(DispatchA())
registrar.register(DispatchAAAA())
registrar.register(DispatchCNAME())
registrar.register(DispatchMX())
registrar.register(DispatchPTR())
registrar.register(DispatchSRV())
registrar.register(DispatchTXT())


def build_create_parser(dispatch, action_parser):
create_parser = action_parser.add_parser(
'create', help="Create a(n) {0} record".format(dispatch.dtype)
)
for add_arg, extract_arg, test_method in dispatch.create_args:
add_arg(create_parser)


def build_update_parser(dispatch, action_parser):
update_parser = action_parser.add_parser(
'update', help="Update a(n) {0} record".format(dispatch.dtype)
)
for add_arg, extract_arg, test_method in dispatch.update_args:
add_arg(update_parser, required=False)


def build_delete_parser(dispatch, action_parser):
delete_parser = action_parser.add_parser(
'delete', help="Delete a(n) {0} record".format(dispatch.dtype)
)
for add_arg, extract_arg, test_method in dispatch.delete_args:
add_arg(delete_parser)


def build_detail_parser(dispatch, action_parser):
detail_parser = action_parser.add_parser(
'detail', help="Detail a(n) {0} record".format(dispatch.dtype)
)
for add_arg, extract_arg, test_method in dispatch.detail_args:
add_arg(detail_parser)


def build_dns_parsers(base_parser):
# Build all the records
for dispatch in [d for d in registrar.dispatches if d.dgroup == 'dns']:
record_base_parser = base_parser.add_parser(
dispatch.dtype,
help="The interface for {0} records".format(dispatch.dtype),
add_help=True
)
action_parser = record_base_parser.add_subparsers(
help="{0} record actions".format(dispatch.dtype),
dest='action'
)
build_create_parser(dispatch, action_parser)
build_update_parser(dispatch, action_parser)
build_delete_parser(dispatch, action_parser)
build_detail_parser(dispatch, action_parser)
Loading

0 comments on commit d248cbb

Please sign in to comment.