import SoftLayer
from ibmcloud_python_sdk.config import params
from ibmcloud_python_sdk.utils.common import resource_not_found
from ibmcloud_python_sdk.utils.common import check_args
[docs]class Dns():
"""Public dns class
"""
def __init__(self):
self.cfg = params()
self.client = SoftLayer.create_client_from_env(
username=self.cfg['cis_username'],
api_key=self.cfg['cis_apikey'])
self.dns = SoftLayer.DNSManager(self.client)
[docs] def create_zone(self, zone, serial=None):
"""Create a zone for the specified zone
:param zone: Zone name
:type zone: str
:param serial: serial value on the zone, defaults to
`strftime(%Y%m%d01)`
:type serial: str
"""
try:
return self.dns.create_zone(zone, serial)
except Exception as error:
print("Error creating dns zones. {}".format(error))
raise
[docs] def create_record(self, **kwargs):
"""Create a resource record on a domain
:param zone: Zone name
:type zone: str
:param record: Record name
:type record: str
:param record_type: Type of record (A, AAAA, CNAME, TXT, etc...)
:type record_type: str
:param data: Record's value
:type data: str
:param ttl: Time-To-Live, defaults to `60`
:type ttl: int
"""
args = set(["zone", "record", "record_type", "data"])
check_args(args, **kwargs)
zone_id = self.get_zone_id(kwargs.get('zone'))
if not isinstance(zone_id, int):
if "errors" in zone_id:
for key_name in zone_id["errors"]:
if key_name["code"] == "not_found":
return resource_not_found()
return zone_id
# Set default value is not required paramaters are not defined
args = {
'zone': zone_id,
'record': kwargs.get('record'),
'record_type': kwargs.get('record_type'),
'data': kwargs.get('data'),
'ttl': kwargs.get('ttl', 60),
}
try:
return (self.dns.create_record(args['zone'], args['record'],
args['record_type'],
args['data'], args['ttl']))
except Exception as error:
print("Error creating dns record. {}".format(error))
raise
[docs] def get_records(self, **kwargs):
"""Get record list for a specified zone
:param zone: Zone name
:type zone: str
"""
zone_id = self.get_zone_id(kwargs.get('zone'))
if not isinstance(zone_id, int):
if "errors" in zone_id:
for key_name in zone_id["errors"]:
if key_name["code"] == "not_found":
return resource_not_found()
return zone_id
# Build dict of argument and assign default value when needed
args = {
'ttl': kwargs.get('ttl') or None,
'data': kwargs.get('data') or None,
'host': kwargs.get('host') or None,
'record_type': kwargs.get('record_type') or None
}
return self.dns.get_records(zone_id=zone_id, **args)
[docs] def get_zone_id(self, name):
"""Get zone id
:param name: zone name
"""
zones = self.list_zones()
for zone in zones:
if zone["name"] == name:
return zone["id"]
return resource_not_found()
[docs] def list_zones(self, **kwargs):
"""Get all zones
"""
try:
return self.dns.list_zones(**kwargs)
except Exception as error:
print("Error listing dns zones. {}".format(error))
raise
[docs] def delete_zone(self, name):
"""Delete a zone
"""
zone_id = self.get_zone_id(name)
if not isinstance(zone_id, int):
if "errors" in zone_id:
for key_name in zone_id["errors"]:
if key_name["code"] == "not_found":
return zone_id
try:
self.dns.delete_zone(zone_id)
except Exception as error:
print("Error deleting dns zone. {}".format(error))
raise
[docs] def get_record(self, **kwargs):
"""Find a record by name or value
"""
required_args = set(["record", "zone"])
check_args(required_args, **kwargs)
args = {
'record': kwargs.get('record'),
'zone': kwargs.get('zone'),
}
by_name = self.get_record_by_name(record=args["record"],
zone=args["zone"])
if "errors" in by_name:
for key_name in by_name["errors"]:
if key_name["code"] == "not_found":
by_value = self.get_record_by_value(record=args["record"],
zone=args["zone"])
if "errors" in by_value:
return by_value
return by_value
return by_name
return by_name
[docs] def get_record_by_name(self, **kwargs):
"""Get record by name
:param record: Record name
:type record: str
:param zone: Zone name
:type zone: str
"""
required_args = set(["record", "zone"])
check_args(required_args, **kwargs)
args = {
'record': kwargs.get('record'),
'zone': kwargs.get('zone'),
}
zone_id = self.get_zone_id(args['zone'])
if not isinstance(zone_id, int):
if "errors" in zone_id:
for key_name in zone_id["errors"]:
if key_name["code"] == "not_found":
return resource_not_found()
records = self.get_records(zone=args["zone"])
for record in records:
if record["host"] == args["record"]:
return record
return resource_not_found()
[docs] def get_record_by_value(self, **kwargs):
"""Get record by value
:param record: Record value
:type record: str
:param zone: Zone name
:type zone: str
"""
args = set(["record", "zone"])
check_args(args, **kwargs)
args = {
'record': kwargs.get('record'),
'zone': kwargs.get('zone'),
}
records = self.get_records(zone=args["zone"])
if "errors" in records:
for key_name in records["errors"]:
if key_name["code"] == "not_found":
return resource_not_found()
for record in records:
if record["data"] == args["record"]:
return record
return resource_not_found()
[docs] def delete_record(self, **kwargs):
"""Delete a record
:param record: Record name
:type record: str
:param zone: Zone name
:type zone: str
"""
args = set(["record", "zone"])
check_args(args, **kwargs)
args = {
'record': kwargs.get('record'),
'zone': kwargs.get('zone'),
}
record = self.get_record(record=args["record"],
zone=args["zone"])
if "errors" in record:
for key_name in record["errors"]:
if key_name["code"] == "not_found":
return resource_not_found()
try:
self.dns.delete_record(record["id"])
except Exception as error:
print("Error while deleting record. {}".format(error))
raise
[docs] def check_availability(self, **kwargs):
"""Check zone availability
"""
pass