Skip to content

Commit 21120cf

Browse files
author
Aaron Sierra
committed
linode: Drop deprecated v3 API support
The v3 API became completely unsupported by Linode on July 31, 2023. https://www.linode.com/community/questions/25142/status-of-v3-api-eol
1 parent 1c35498 commit 21120cf

28 files changed

Lines changed: 2 additions & 2381 deletions

libcloud/compute/drivers/linode.py

Lines changed: 1 addition & 706 deletions
Large diffs are not rendered by default.

libcloud/dns/drivers/linode.py

Lines changed: 1 addition & 255 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,7 @@ def __new__(
8888
**kwargs,
8989
):
9090
if cls is LinodeDNSDriver:
91-
if api_version == "3.0":
92-
cls = LinodeDNSDriverV3
93-
elif api_version == "4.0":
91+
if api_version == "4.0":
9492
cls = LinodeDNSDriverV4
9593
else:
9694
raise NotImplementedError(
@@ -117,258 +115,6 @@ def _make_excp(self, error):
117115
return result
118116

119117

120-
class LinodeDNSConnection(LinodeConnection):
121-
responseCls = LinodeDNSResponse
122-
123-
124-
class LinodeDNSDriverV3(LinodeDNSDriver):
125-
connectionCls = LinodeDNSConnection
126-
127-
RECORD_TYPE_MAP = {
128-
RecordType.NS: "NS",
129-
RecordType.MX: "MX",
130-
RecordType.A: "A",
131-
RecordType.AAAA: "AAAA",
132-
RecordType.CNAME: "CNAME",
133-
RecordType.TXT: "TXT",
134-
RecordType.SRV: "SRV",
135-
}
136-
137-
def list_zones(self):
138-
params = {"api_action": "domain.list"}
139-
data = self.connection.request(API_ROOT, params=params).objects[0]
140-
zones = self._to_zones(data)
141-
return zones
142-
143-
def list_records(self, zone):
144-
params = {"api_action": "domain.resource.list", "DOMAINID": zone.id}
145-
146-
self.connection.set_context(context={"resource": "zone", "id": zone.id})
147-
data = self.connection.request(API_ROOT, params=params).objects[0]
148-
records = self._to_records(items=data, zone=zone)
149-
return records
150-
151-
def get_zone(self, zone_id):
152-
params = {"api_action": "domain.list", "DomainID": zone_id}
153-
self.connection.set_context(context={"resource": "zone", "id": zone_id})
154-
data = self.connection.request(API_ROOT, params=params).objects[0]
155-
zones = self._to_zones(data)
156-
157-
if len(zones) != 1:
158-
raise ZoneDoesNotExistError(value="", driver=self, zone_id=zone_id)
159-
160-
return zones[0]
161-
162-
def get_record(self, zone_id, record_id):
163-
zone = self.get_zone(zone_id=zone_id)
164-
params = {
165-
"api_action": "domain.resource.list",
166-
"DomainID": zone_id,
167-
"ResourceID": record_id,
168-
}
169-
self.connection.set_context(context={"resource": "record", "id": record_id})
170-
data = self.connection.request(API_ROOT, params=params).objects[0]
171-
records = self._to_records(items=data, zone=zone)
172-
173-
if len(records) != 1:
174-
raise RecordDoesNotExistError(value="", driver=self, record_id=record_id)
175-
176-
return records[0]
177-
178-
def create_zone(self, domain, type="master", ttl=None, extra=None):
179-
"""
180-
Create a new zone.
181-
182-
API docs: http://www.linode.com/api/dns/domain.create
183-
"""
184-
params = {"api_action": "domain.create", "Type": type, "Domain": domain}
185-
186-
if ttl:
187-
params["TTL_sec"] = ttl
188-
189-
merged = merge_valid_keys(params=params, valid_keys=VALID_ZONE_EXTRA_PARAMS, extra=extra)
190-
data = self.connection.request(API_ROOT, params=params).objects[0]
191-
zone = Zone(
192-
id=data["DomainID"],
193-
domain=domain,
194-
type=type,
195-
ttl=ttl,
196-
extra=merged,
197-
driver=self,
198-
)
199-
return zone
200-
201-
def update_zone(self, zone, domain=None, type=None, ttl=None, extra=None):
202-
"""
203-
Update an existing zone.
204-
205-
API docs: http://www.linode.com/api/dns/domain.update
206-
"""
207-
params = {"api_action": "domain.update", "DomainID": zone.id}
208-
209-
if type:
210-
params["Type"] = type
211-
212-
if domain:
213-
params["Domain"] = domain
214-
215-
if ttl:
216-
params["TTL_sec"] = ttl
217-
218-
merged = merge_valid_keys(params=params, valid_keys=VALID_ZONE_EXTRA_PARAMS, extra=extra)
219-
self.connection.request(API_ROOT, params=params).objects[0]
220-
updated_zone = get_new_obj(
221-
obj=zone,
222-
klass=Zone,
223-
attributes={"domain": domain, "type": type, "ttl": ttl, "extra": merged},
224-
)
225-
return updated_zone
226-
227-
def create_record(self, name, zone, type, data, extra=None):
228-
"""
229-
Create a new record.
230-
231-
API docs: http://www.linode.com/api/dns/domain.resource.create
232-
"""
233-
params = {
234-
"api_action": "domain.resource.create",
235-
"DomainID": zone.id,
236-
"Name": name,
237-
"Target": data,
238-
"Type": self.RECORD_TYPE_MAP[type],
239-
}
240-
merged = merge_valid_keys(params=params, valid_keys=VALID_RECORD_EXTRA_PARAMS, extra=extra)
241-
242-
result = self.connection.request(API_ROOT, params=params).objects[0]
243-
record = Record(
244-
id=result["ResourceID"],
245-
name=name,
246-
type=type,
247-
data=data,
248-
extra=merged,
249-
zone=zone,
250-
driver=self,
251-
ttl=merged.get("TTL_sec", None),
252-
)
253-
return record
254-
255-
def update_record(self, record, name=None, type=None, data=None, extra=None):
256-
"""
257-
Update an existing record.
258-
259-
API docs: http://www.linode.com/api/dns/domain.resource.update
260-
"""
261-
params = {
262-
"api_action": "domain.resource.update",
263-
"ResourceID": record.id,
264-
"DomainID": record.zone.id,
265-
}
266-
267-
if name:
268-
params["Name"] = name
269-
270-
if data:
271-
params["Target"] = data
272-
273-
if type is not None:
274-
params["Type"] = self.RECORD_TYPE_MAP[type]
275-
276-
merged = merge_valid_keys(params=params, valid_keys=VALID_RECORD_EXTRA_PARAMS, extra=extra)
277-
278-
self.connection.request(API_ROOT, params=params).objects[0]
279-
updated_record = get_new_obj(
280-
obj=record,
281-
klass=Record,
282-
attributes={"name": name, "data": data, "type": type, "extra": merged},
283-
)
284-
return updated_record
285-
286-
def delete_zone(self, zone):
287-
params = {"api_action": "domain.delete", "DomainID": zone.id}
288-
289-
self.connection.set_context(context={"resource": "zone", "id": zone.id})
290-
data = self.connection.request(API_ROOT, params=params).objects[0]
291-
292-
return "DomainID" in data
293-
294-
def delete_record(self, record):
295-
params = {
296-
"api_action": "domain.resource.delete",
297-
"DomainID": record.zone.id,
298-
"ResourceID": record.id,
299-
}
300-
301-
self.connection.set_context(context={"resource": "record", "id": record.id})
302-
data = self.connection.request(API_ROOT, params=params).objects[0]
303-
304-
return "ResourceID" in data
305-
306-
def _to_zones(self, items):
307-
"""
308-
Convert a list of items to the Zone objects.
309-
"""
310-
zones = []
311-
312-
for item in items:
313-
zones.append(self._to_zone(item))
314-
315-
return zones
316-
317-
def _to_zone(self, item):
318-
"""
319-
Build an Zone object from the item dictionary.
320-
"""
321-
extra = {
322-
"SOA_Email": item["SOA_EMAIL"],
323-
"status": item["STATUS"],
324-
"description": item["DESCRIPTION"],
325-
}
326-
zone = Zone(
327-
id=item["DOMAINID"],
328-
domain=item["DOMAIN"],
329-
type=item["TYPE"],
330-
ttl=item["TTL_SEC"],
331-
driver=self,
332-
extra=extra,
333-
)
334-
return zone
335-
336-
def _to_records(self, items, zone=None):
337-
"""
338-
Convert a list of items to the Record objects.
339-
"""
340-
records = []
341-
342-
for item in items:
343-
records.append(self._to_record(item=item, zone=zone))
344-
345-
return records
346-
347-
def _to_record(self, item, zone=None):
348-
"""
349-
Build a Record object from the item dictionary.
350-
"""
351-
extra = {
352-
"protocol": item["PROTOCOL"],
353-
"ttl_sec": item["TTL_SEC"],
354-
"port": item["PORT"],
355-
"weight": item["WEIGHT"],
356-
"priority": item["PRIORITY"],
357-
}
358-
type = self._string_to_record_type(item["TYPE"])
359-
record = Record(
360-
id=item["RESOURCEID"],
361-
name=item["NAME"],
362-
type=type,
363-
data=item["TARGET"],
364-
zone=zone,
365-
driver=self,
366-
ttl=item["TTL_SEC"],
367-
extra=extra,
368-
)
369-
return record
370-
371-
372118
class LinodeDNSResponseV4(LinodeResponseV4):
373119
pass
374120

libcloud/test/compute/fixtures/linode/_avail_datacenters.json

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)