diff --git a/README.md b/README.md index 07b45d1..db36658 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,9 @@ does not require the clustered nodes to be on the same subnet. Currently the DNS HA feature is only available for MAAS 2.0 or greater environments. MAAS 2.0 requires Juju 2.0 or greater. The MAAS 2.0 client requires Ubuntu 16.04 or greater. The clustered nodes must have static or -"reserved" IP addresses registered in MAAS. The DNS hostname(s) must be -pre-registered in MAAS before use with DNS HA. +"reserved" IP addresses registered in MAAS. If using a version of MAAS earlier +than 2.3 the DNS hostname(s) should be pre-registered in MAAS before use with +DNS HA. The charm will throw an exception in the following circumstances: If running on a version of Ubuntu less than Xenial 16.04 diff --git a/hooks/hooks.py b/hooks/hooks.py index 365b421..f304590 100755 --- a/hooks/hooks.py +++ b/hooks/hooks.py @@ -99,7 +99,7 @@ COROSYNC_CONF_FILES = [ ] PACKAGES = ['crmsh', 'corosync', 'pacemaker', 'python-netaddr', 'ipmitool', - 'libnagios-plugin-perl'] + 'libnagios-plugin-perl', 'python3-requests-oauthlib'] SUPPORTED_TRANSPORTS = ['udp', 'udpu', 'multicast', 'unicast'] DEPRECATED_TRANSPORT_VALUES = {"multicast": "udp", "unicast": "udpu"} diff --git a/ocf/maas/maas_dns.py b/ocf/maas/maas_dns.py index 1117698..ca4d9a7 100755 --- a/ocf/maas/maas_dns.py +++ b/ocf/maas/maas_dns.py @@ -14,10 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import maasclient import argparse -import sys +import requests_oauthlib import logging +import sys + +import maasclient class MAASDNS(object): @@ -33,6 +35,8 @@ class MAASDNS(object): self.ttl = str(options.ttl) # String representation of the ip self.ip = options.ip_address + self.maas_server = options.maas_server + self.maas_creds = options.maas_credentials def get_dnsresource(self): """ Get a dnsresource object """ @@ -56,11 +60,29 @@ class MAASDNS(object): def create_dnsresource(self): """ Create a DNS resource object Due to https://bugs.launchpad.net/maas/+bug/1555393 - This is currently unused + this is implemented outside of the maas lib. """ - return self.maas.create_dnsresource(self.fqdn, - self.ip, - self.ttl) + dns_url = '{}/api/2.0/dnsresources/?format=json'.format( + self.maas_server) + (consumer_key, access_token, token_secret) = self.maas_creds.split(':') + + # The use of PLAINTEXT signature is inline with libmaas + # https://goo.gl/EJPrM7 but as noted there should be switched + # to HMAC once it works server-side. + maas_session = requests_oauthlib.OAuth1Session( + consumer_key, + signature_method='PLAINTEXT', + resource_owner_key=access_token, + resource_owner_secret=token_secret) + fqdn_list = self.fqdn.split('.') + payload = { + 'fqdn': self.fqdn, + 'name': fqdn_list[0], + 'domain': '.'.join(fqdn_list[1:]), + 'address_ttl': self.ttl, + 'ip_addresses': self.ip, + } + return maas_session.post(dns_url, data=payload) class MAASIP(object): @@ -144,8 +166,7 @@ def dns_ha(): dns_obj = MAASDNS(options) if not dns_obj.dnsresource: - logging.info('DNS Resource does not exist. ' - 'Create it with the maas cli.') + dns_obj.create_dnsresource() elif dns_obj.dnsresource.get('ip_addresses'): # TODO: Handle multiple IPs returned for ip_addresses for ip in dns_obj.dnsresource['ip_addresses']: diff --git a/tox.ini b/tox.ini index 4319064..c97972f 100644 --- a/tox.ini +++ b/tox.ini @@ -30,7 +30,7 @@ deps = -r{toxinidir}/requirements.txt basepython = python2.7 deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt -commands = flake8 {posargs} hooks unit_tests tests actions lib +commands = flake8 {posargs} hooks unit_tests tests actions lib ocf/maas charm-proof [testenv:venv]