sumomo 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -2
- data/data/sumomo/custom_resource_utils.js +151 -0
- data/data/sumomo/custom_resources/AMILookup.js +106 -0
- data/data/sumomo/custom_resources/AvailabilityZones.js +89 -0
- data/data/sumomo/custom_resources/CloudflareCNAME.js +231 -0
- data/data/sumomo/custom_resources/DeployTime.js +15 -0
- data/data/sumomo/custom_resources/SelectSpot.js +294 -0
- data/data/sumomo/sources/spot-watcher-poller.sh +22 -0
- data/data/sumomo/sources/spot-watcher.sh +45 -0
- data/lib/sumomo.rb +193 -1
- data/lib/sumomo/ec2.rb +414 -0
- data/lib/sumomo/momo_extensions/resource.rb +10 -0
- data/lib/sumomo/momo_extensions/stack.rb +6 -0
- data/lib/sumomo/network.rb +70 -0
- data/lib/sumomo/stack.rb +152 -0
- data/lib/sumomo/version.rb +1 -1
- data/sumomo.gemspec +2 -0
- metadata +44 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb1aedf8b2967520988740daf5e85b6c068302b4
|
4
|
+
data.tar.gz: 7fa8031ebf8b52c3ffbe9450d0ed3f7c7672a1c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83a0194a2aeb0a63ee35bed97c7521546511ab9fa7677d5e282c1bbeb5caed9f3091a70f63df81ae4dcb574732ee2a10059ede53e99491078a79c42914d0ea3c
|
7
|
+
data.tar.gz: 775a27622a8deb089fb94921644566baa1937b1beba30811055ba21f4ebb117fa4b45a9d951b65bc92bd4a3ce50f9ea8414cf0a95b924b462108f4e6b89c5f26
|
data/README.md
CHANGED
@@ -20,7 +20,21 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
23
|
+
This gem lets you use all of the syntax in the [momo](https://github.com/davidsiaw/momo) and more!
|
24
|
+
|
25
|
+
You need to setup your AWS credentials using `aws configure`.
|
26
|
+
|
27
|
+
```
|
28
|
+
require "sumomo"
|
29
|
+
|
30
|
+
Sumomo::update_stack(name: "mystack", region: "ap-northeast-1") do
|
31
|
+
x = hidden_value "meow"
|
32
|
+
|
33
|
+
output "Haha", x
|
34
|
+
end
|
35
|
+
|
36
|
+
Sumomo::wait_for_stack(name: "kurosawa", region: "ap-northeast-1")
|
37
|
+
```
|
24
38
|
|
25
39
|
## Development
|
26
40
|
|
@@ -30,5 +44,5 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
30
44
|
|
31
45
|
## Contributing
|
32
46
|
|
33
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
47
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/davidsiaw/sumomo.
|
34
48
|
|
@@ -0,0 +1,151 @@
|
|
1
|
+
var aws = require("aws-sdk");
|
2
|
+
|
3
|
+
Cloudformation = {}
|
4
|
+
Cloudformation.SUCCESS = "SUCCESS";
|
5
|
+
Cloudformation.FAILED = "FAILED";
|
6
|
+
Cloudformation.status_sent = false;
|
7
|
+
Cloudformation.send = function(request, context, responseStatus, responseData, reason, physicalResourceId) {
|
8
|
+
|
9
|
+
var responseBody = JSON.stringify({
|
10
|
+
Status: responseStatus,
|
11
|
+
Reason: reason + " Log Stream: " + context.logStreamName,
|
12
|
+
PhysicalResourceId: physicalResourceId || context.logStreamName,
|
13
|
+
StackId: request.StackId,
|
14
|
+
RequestId: request.RequestId,
|
15
|
+
LogicalResourceId: request.LogicalResourceId,
|
16
|
+
Data: responseData
|
17
|
+
});
|
18
|
+
|
19
|
+
console.log("Response body:\n", responseBody);
|
20
|
+
|
21
|
+
var https = require("https");
|
22
|
+
var url = require("url");
|
23
|
+
|
24
|
+
var parsedUrl = url.parse(request.ResponseURL);
|
25
|
+
var options = {
|
26
|
+
hostname: parsedUrl.hostname,
|
27
|
+
port: 443,
|
28
|
+
path: parsedUrl.path,
|
29
|
+
method: "PUT",
|
30
|
+
headers: {
|
31
|
+
"content-type": "",
|
32
|
+
"content-length": responseBody.length
|
33
|
+
}
|
34
|
+
};
|
35
|
+
|
36
|
+
var request = https.request(options, function(response) {
|
37
|
+
console.log("Status code: " + response.statusCode);
|
38
|
+
console.log("Status message: " + response.statusMessage);
|
39
|
+
context.done();
|
40
|
+
});
|
41
|
+
|
42
|
+
request.on("error", function(error) {
|
43
|
+
console.log("send(..) failed executing https.request(..): " + error);
|
44
|
+
context.done();
|
45
|
+
});
|
46
|
+
|
47
|
+
request.write(responseBody);
|
48
|
+
request.end();
|
49
|
+
Cloudformation.status_sent = true;
|
50
|
+
}
|
51
|
+
|
52
|
+
function Storage(bucket, prefix, region)
|
53
|
+
{
|
54
|
+
var s3 = new aws.S3({region: region});
|
55
|
+
|
56
|
+
this.put = function(key, value, onComplete, onError) {
|
57
|
+
|
58
|
+
s3.putObject({
|
59
|
+
Bucket: bucket,
|
60
|
+
Key: "data/" + prefix + "/" + key,
|
61
|
+
Body: value
|
62
|
+
}, function(err, data) {
|
63
|
+
if (err)
|
64
|
+
{
|
65
|
+
if (onError)
|
66
|
+
{
|
67
|
+
onError(err);
|
68
|
+
}
|
69
|
+
else
|
70
|
+
{
|
71
|
+
throw(err);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
else
|
75
|
+
{
|
76
|
+
if (onComplete)
|
77
|
+
{
|
78
|
+
onComplete();
|
79
|
+
}
|
80
|
+
}
|
81
|
+
})
|
82
|
+
}
|
83
|
+
|
84
|
+
this.get = function(key, onComplete, onError) {
|
85
|
+
|
86
|
+
s3.getObject({
|
87
|
+
Bucket: bucket,
|
88
|
+
Key: "data/" + prefix + "/" + key
|
89
|
+
}, function(err, data) {
|
90
|
+
if (err)
|
91
|
+
{
|
92
|
+
if (onError)
|
93
|
+
{
|
94
|
+
onError(err);
|
95
|
+
}
|
96
|
+
else
|
97
|
+
{
|
98
|
+
throw(err);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
else
|
102
|
+
{
|
103
|
+
if (onComplete)
|
104
|
+
{
|
105
|
+
onComplete(data.Body.toString());
|
106
|
+
}
|
107
|
+
}
|
108
|
+
})
|
109
|
+
}
|
110
|
+
|
111
|
+
return this;
|
112
|
+
}
|
113
|
+
|
114
|
+
Global = {}
|
115
|
+
|
116
|
+
process.on('uncaughtException', function(err) {
|
117
|
+
console.log("Sending the following error to cloudformation: ");
|
118
|
+
console.log(err);
|
119
|
+
Cloudformation.send(Global.request, Global.context, Cloudformation.FAILED, {}, err);
|
120
|
+
});
|
121
|
+
|
122
|
+
process.on('exit', function() {
|
123
|
+
if (!Cloudformation.status_sent)
|
124
|
+
{
|
125
|
+
console.log("No status sent to cloudformation, assuming FAILED");
|
126
|
+
Cloudformation.send(Global.request, Global.context, Cloudformation.FAILED, {}, "No status sent to cloudformation");
|
127
|
+
}
|
128
|
+
});
|
129
|
+
|
130
|
+
exports.handler = function(request, context)
|
131
|
+
{
|
132
|
+
console.log("Request:");
|
133
|
+
console.log(request);
|
134
|
+
console.log("Context:");
|
135
|
+
console.log(context);
|
136
|
+
|
137
|
+
Global.request = request;
|
138
|
+
Global.context = context;
|
139
|
+
var store = Storage(request.ResourceProperties.Bucket, request.LogicalResourceId, request.ResourceProperties.Region);
|
140
|
+
|
141
|
+
try
|
142
|
+
{
|
143
|
+
{{ CODE }}
|
144
|
+
}
|
145
|
+
catch (err)
|
146
|
+
{
|
147
|
+
console.log("Sending the following error to cloudformation: ");
|
148
|
+
console.log(err);
|
149
|
+
Cloudformation.send(request, context, Cloudformation.FAILED, {}, err);
|
150
|
+
}
|
151
|
+
}
|
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
var typeToArch = {
|
3
|
+
"t1.micro" : "PV64" ,
|
4
|
+
"t2.nano" : "HVM64",
|
5
|
+
"t2.micro" : "HVM64",
|
6
|
+
"t2.small" : "HVM64",
|
7
|
+
"t2.medium" : "HVM64",
|
8
|
+
"t2.large" : "HVM64",
|
9
|
+
"m1.small" : "PV64" ,
|
10
|
+
"m1.medium" : "PV64" ,
|
11
|
+
"m1.large" : "PV64" ,
|
12
|
+
"m1.xlarge" : "PV64" ,
|
13
|
+
"m2.xlarge" : "PV64" ,
|
14
|
+
"m2.2xlarge" : "PV64" ,
|
15
|
+
"m2.4xlarge" : "PV64" ,
|
16
|
+
"m3.medium" : "HVM64",
|
17
|
+
"m3.large" : "HVM64",
|
18
|
+
"m3.xlarge" : "HVM64",
|
19
|
+
"m3.2xlarge" : "HVM64",
|
20
|
+
"m4.large" : "HVM64",
|
21
|
+
"m4.xlarge" : "HVM64",
|
22
|
+
"m4.2xlarge" : "HVM64",
|
23
|
+
"m4.4xlarge" : "HVM64",
|
24
|
+
"m4.10xlarge" : "HVM64",
|
25
|
+
"c1.medium" : "PV64" ,
|
26
|
+
"c1.xlarge" : "PV64" ,
|
27
|
+
"c3.large" : "HVM64",
|
28
|
+
"c3.xlarge" : "HVM64",
|
29
|
+
"c3.2xlarge" : "HVM64",
|
30
|
+
"c3.4xlarge" : "HVM64",
|
31
|
+
"c3.8xlarge" : "HVM64",
|
32
|
+
"c4.large" : "HVM64",
|
33
|
+
"c4.xlarge" : "HVM64",
|
34
|
+
"c4.2xlarge" : "HVM64",
|
35
|
+
"c4.4xlarge" : "HVM64",
|
36
|
+
"c4.8xlarge" : "HVM64",
|
37
|
+
"g2.2xlarge" : "HVMG2",
|
38
|
+
"g2.8xlarge" : "HVMG2",
|
39
|
+
"r3.large" : "HVM64",
|
40
|
+
"r3.xlarge" : "HVM64",
|
41
|
+
"r3.2xlarge" : "HVM64",
|
42
|
+
"r3.4xlarge" : "HVM64",
|
43
|
+
"r3.8xlarge" : "HVM64",
|
44
|
+
"i2.xlarge" : "HVM64",
|
45
|
+
"i2.2xlarge" : "HVM64",
|
46
|
+
"i2.4xlarge" : "HVM64",
|
47
|
+
"i2.8xlarge" : "HVM64",
|
48
|
+
"d2.xlarge" : "HVM64",
|
49
|
+
"d2.2xlarge" : "HVM64",
|
50
|
+
"d2.4xlarge" : "HVM64",
|
51
|
+
"d2.8xlarge" : "HVM64",
|
52
|
+
"hi1.4xlarge" : "HVM64",
|
53
|
+
"hs1.8xlarge" : "HVM64",
|
54
|
+
"cr1.8xlarge" : "HVM64",
|
55
|
+
"cc2.8xlarge" : "HVM64"
|
56
|
+
}
|
57
|
+
|
58
|
+
var archToAMINamePattern = {
|
59
|
+
"PV64": "amzn-ami-pv*.x86_64-ebs",
|
60
|
+
"HVM64": "amzn-ami-hvm*.x86_64-gp2",
|
61
|
+
"HVMG2": "amzn-ami-graphics-hvm-*x86_64-ebs*"
|
62
|
+
};
|
63
|
+
|
64
|
+
var ec2 = new aws.EC2({region: request.ResourceProperties.Region});
|
65
|
+
|
66
|
+
var describeImagesParams = {
|
67
|
+
Filters: [{ Name: "name", Values: [archToAMINamePattern[typeToArch[request.ResourceProperties.InstanceType]]]}],
|
68
|
+
Owners: [request.ResourceProperties.Architecture == "HVMG2" ? "679593333241" : "amazon"]
|
69
|
+
};
|
70
|
+
|
71
|
+
// Check if the image is a beta or rc image. The Lambda function won't return any of those images.
|
72
|
+
function isBeta(imageName) {
|
73
|
+
return imageName.toLowerCase().indexOf("beta") > -1 || imageName.toLowerCase().indexOf(".rc") > -1;
|
74
|
+
}
|
75
|
+
|
76
|
+
// Get AMI IDs with the specified name pattern and owner
|
77
|
+
ec2.describeImages(describeImagesParams, function(err, describeImagesResult)
|
78
|
+
{
|
79
|
+
if (err)
|
80
|
+
{
|
81
|
+
console.log(err, err.stack); // an error occurred
|
82
|
+
Cloudformation.send(request, context, Cloudformation.FAILED, {}, JSON.stringify(err));
|
83
|
+
}
|
84
|
+
else
|
85
|
+
{
|
86
|
+
var response = {}
|
87
|
+
var id = "NONE";
|
88
|
+
var images = describeImagesResult.Images;
|
89
|
+
// Sort images by name in decscending order. The names contain the AMI version, formatted as YYYY.MM.Ver.
|
90
|
+
images.sort(function(x, y) { return y.Name.localeCompare(x.Name); });
|
91
|
+
for (var j = 0; j < images.length; j++)
|
92
|
+
{
|
93
|
+
if (isBeta(images[j].Name)) continue;
|
94
|
+
id = images[j].ImageId;
|
95
|
+
response["Name"] = images[j].Name;
|
96
|
+
response["ImageType"] = images[j].ImageType;
|
97
|
+
response["CreationDate"] = images[j].CreationDate;
|
98
|
+
response["Description"] = images[j].Description;
|
99
|
+
response["RootDeviceType"] = images[j].RootDeviceType;
|
100
|
+
response["RootDeviceName"] = images[j].RootDeviceName;
|
101
|
+
response["VirtualizationType"] = images[j].VirtualizationType;
|
102
|
+
break;
|
103
|
+
}
|
104
|
+
Cloudformation.send(request, context, Cloudformation.SUCCESS, response, "Success", id);
|
105
|
+
}
|
106
|
+
});
|
@@ -0,0 +1,89 @@
|
|
1
|
+
// return number of zones
|
2
|
+
// Zones = comma separated availability zone names
|
3
|
+
|
4
|
+
physicalId = "0"
|
5
|
+
response = {}
|
6
|
+
|
7
|
+
function send_success()
|
8
|
+
{
|
9
|
+
if (request.RequestType == "Create")
|
10
|
+
{
|
11
|
+
Cloudformation.send(request, context, Cloudformation.SUCCESS, response, "Success", physicalId);
|
12
|
+
}
|
13
|
+
|
14
|
+
if (request.RequestType == "Update")
|
15
|
+
{
|
16
|
+
Cloudformation.send(request, context, Cloudformation.SUCCESS, response, "Success", physicalId);
|
17
|
+
}
|
18
|
+
|
19
|
+
if (request.RequestType == "Delete")
|
20
|
+
{
|
21
|
+
Cloudformation.send(request, context, Cloudformation.SUCCESS, {}, "Success");
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
function get_spot_prices(instance, zones, number)
|
26
|
+
{
|
27
|
+
if (zones.length == 0)
|
28
|
+
{
|
29
|
+
send_success();
|
30
|
+
}
|
31
|
+
else
|
32
|
+
{
|
33
|
+
ec2.describeSpotPriceHistory({
|
34
|
+
AvailabilityZone: zones[0],
|
35
|
+
InstanceTypes: [instance],
|
36
|
+
MaxResults: 10
|
37
|
+
}, function(err, data) {
|
38
|
+
if (err)
|
39
|
+
{
|
40
|
+
console.log(err, err.stack); // an error occurred
|
41
|
+
Cloudformation.send(request, context, Cloudformation.FAILED, {}, JSON.stringify(err));
|
42
|
+
}
|
43
|
+
else
|
44
|
+
{
|
45
|
+
console.log("HISTORY")
|
46
|
+
console.log(JSON.stringify(data.SpotPriceHistory))
|
47
|
+
var price = data.SpotPriceHistory[0].SpotPrice
|
48
|
+
if (response["ZoneSpotPrices"])
|
49
|
+
{
|
50
|
+
response["ZoneSpotPrices"] += ","
|
51
|
+
}
|
52
|
+
response["ZoneSpotPrices"] += price;
|
53
|
+
response["ZoneSpotPrice" + number] = price;
|
54
|
+
zones.splice(0,1);
|
55
|
+
get_spot_prices(instance, zones, number+1);
|
56
|
+
}
|
57
|
+
});
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
var ec2 = new aws.EC2({region: request.ResourceProperties.Region});
|
62
|
+
ec2.describeAvailabilityZones({}, function(err, data) {
|
63
|
+
if (err)
|
64
|
+
{
|
65
|
+
console.log(err, err.stack); // an error occurred
|
66
|
+
Cloudformation.send(request, context, Cloudformation.FAILED, {}, JSON.stringify(err));
|
67
|
+
}
|
68
|
+
else
|
69
|
+
{
|
70
|
+
var zones = data.AvailabilityZones.map(function(x) {return x.ZoneName;});
|
71
|
+
|
72
|
+
physicalId = String(zones.length);
|
73
|
+
response["Zones"] = zones.join();
|
74
|
+
for(var i=0; i<zones.length; i++)
|
75
|
+
{
|
76
|
+
response["Zone"+i] = zones[i];
|
77
|
+
}
|
78
|
+
|
79
|
+
if (request.ResourceProperties.GetSpotPriceFor)
|
80
|
+
{
|
81
|
+
response["ZoneSpotPrices"] = ""
|
82
|
+
get_spot_prices(request.ResourceProperties.GetSpotPriceFor, zones, 1);
|
83
|
+
}
|
84
|
+
else
|
85
|
+
{
|
86
|
+
send_success();
|
87
|
+
}
|
88
|
+
}
|
89
|
+
});
|
@@ -0,0 +1,231 @@
|
|
1
|
+
// Key: Cloudflare API key
|
2
|
+
// Email: Cloudflare API email
|
3
|
+
// Domain: Cloudflare domain
|
4
|
+
// Entry: DNS entry text
|
5
|
+
// CNAME: The CNAME record
|
6
|
+
// return Record ID of the CNAME record
|
7
|
+
|
8
|
+
var querystring = require('querystring');
|
9
|
+
var https = require('https');
|
10
|
+
|
11
|
+
key = request.ResourceProperties.Key
|
12
|
+
email = request.ResourceProperties.Email
|
13
|
+
domain = request.ResourceProperties.Domain
|
14
|
+
entry = request.ResourceProperties.Entry
|
15
|
+
cname = request.ResourceProperties.Cname
|
16
|
+
|
17
|
+
function get(path, query, on_complete)
|
18
|
+
{
|
19
|
+
var query_string = querystring.stringify(query);
|
20
|
+
|
21
|
+
var get_options = {
|
22
|
+
host: 'api.cloudflare.com',
|
23
|
+
port: '443',
|
24
|
+
path: '/client/v4' + path + "/?" + query_string,
|
25
|
+
method: 'GET',
|
26
|
+
headers: {
|
27
|
+
'X-Auth-Key': key,
|
28
|
+
'X-Auth-Email': email
|
29
|
+
}
|
30
|
+
};
|
31
|
+
|
32
|
+
var req = https.request(get_options, function(res) {
|
33
|
+
//console.log('statusCode: ', res.statusCode);
|
34
|
+
//console.log('headers: ', res.headers);
|
35
|
+
var body = "";
|
36
|
+
res.setEncoding('utf8');
|
37
|
+
res.on('data', function(d) {
|
38
|
+
body += d;
|
39
|
+
});
|
40
|
+
res.on('end', function() {
|
41
|
+
on_complete(JSON.parse(body));
|
42
|
+
});
|
43
|
+
req.on('error', function(e) {
|
44
|
+
console.error(e);
|
45
|
+
});
|
46
|
+
});
|
47
|
+
req.end();
|
48
|
+
}
|
49
|
+
|
50
|
+
function http_request(method, path, data, on_complete)
|
51
|
+
{
|
52
|
+
post_data = JSON.stringify(data);
|
53
|
+
|
54
|
+
var post_options = {
|
55
|
+
host: 'api.cloudflare.com',
|
56
|
+
port: '443',
|
57
|
+
path: '/client/v4' + path,
|
58
|
+
method: method,
|
59
|
+
headers: {
|
60
|
+
'Content-Type': 'application/json',
|
61
|
+
'Content-Length': Buffer.byteLength(post_data),
|
62
|
+
'X-Auth-Key': key,
|
63
|
+
'X-Auth-Email': email
|
64
|
+
}
|
65
|
+
};
|
66
|
+
|
67
|
+
var req = https.request(post_options, function(res) {
|
68
|
+
//console.log('statusCode: ', res.statusCode);
|
69
|
+
//console.log('headers: ', res.headers);
|
70
|
+
var body = "";
|
71
|
+
res.setEncoding('utf8');
|
72
|
+
res.on('data', function(d) {
|
73
|
+
body += d;
|
74
|
+
});
|
75
|
+
res.on('end', function() {
|
76
|
+
on_complete(JSON.parse(body));
|
77
|
+
});
|
78
|
+
req.on('error', function(e) {
|
79
|
+
console.error(e);
|
80
|
+
});
|
81
|
+
});
|
82
|
+
req.write(post_data);
|
83
|
+
req.end();
|
84
|
+
}
|
85
|
+
|
86
|
+
function post(path, data, on_complete)
|
87
|
+
{
|
88
|
+
http_request("POST", path, data, on_complete)
|
89
|
+
}
|
90
|
+
|
91
|
+
function del(path, data, on_complete)
|
92
|
+
{
|
93
|
+
http_request("DELETE", path, data, on_complete)
|
94
|
+
}
|
95
|
+
|
96
|
+
function get_zone_id(zone_name, on_complete)
|
97
|
+
{
|
98
|
+
get("/zones", {name: zone_name}, function (data)
|
99
|
+
{
|
100
|
+
on_complete(data["result"][0]["id"])
|
101
|
+
});
|
102
|
+
}
|
103
|
+
|
104
|
+
function get_dns_record_named(zone_id, name, on_complete)
|
105
|
+
{
|
106
|
+
get("/zones/"+zone_id+"/dns_records", {name: name}, function (data)
|
107
|
+
{
|
108
|
+
on_complete(data["result"])
|
109
|
+
});
|
110
|
+
}
|
111
|
+
|
112
|
+
function create_cname_dns_record(zone_id, type, name, content, on_complete)
|
113
|
+
{
|
114
|
+
post("/zones/"+zone_id+"/dns_records", {
|
115
|
+
type: type,
|
116
|
+
name: name,
|
117
|
+
content: content
|
118
|
+
}, function(data) {
|
119
|
+
on_complete(data)
|
120
|
+
});
|
121
|
+
};
|
122
|
+
|
123
|
+
function delete_cname_dns_record(zone_id, record_id, on_complete)
|
124
|
+
{
|
125
|
+
del("/zones/"+zone_id+"/dns_records/"+record_id, {}, function(data) {
|
126
|
+
on_complete(data)
|
127
|
+
});
|
128
|
+
};
|
129
|
+
|
130
|
+
|
131
|
+
console.log('REQUEST RECEIVED:\n', JSON.stringify(request));
|
132
|
+
|
133
|
+
function send_success(record_id)
|
134
|
+
{
|
135
|
+
Cloudformation.send(request, context, Cloudformation.SUCCESS, {}, "Success", record_id);
|
136
|
+
}
|
137
|
+
|
138
|
+
function send_failure(reason)
|
139
|
+
{
|
140
|
+
Cloudformation.send(request, context, Cloudformation.FAILED, {}, reason);
|
141
|
+
}
|
142
|
+
|
143
|
+
function save_data(domain_id, record_id, on_complete, on_error)
|
144
|
+
{
|
145
|
+
store.put("domain_id", domain_id, function() {
|
146
|
+
store.put("record_id", record_id, on_complete, on_error);
|
147
|
+
}, on_error);
|
148
|
+
}
|
149
|
+
|
150
|
+
function load_data(on_complete, on_error)
|
151
|
+
{
|
152
|
+
store.get("domain_id", function(domain_id) {
|
153
|
+
store.get("record_id", function(record_id) {
|
154
|
+
on_complete(domain_id, record_id);
|
155
|
+
}, on_error);
|
156
|
+
}, on_error);
|
157
|
+
}
|
158
|
+
|
159
|
+
if (request.RequestType == "Create") {
|
160
|
+
|
161
|
+
get_zone_id(domain, function(id)
|
162
|
+
{
|
163
|
+
get_dns_record_named(id, entry, function(data)
|
164
|
+
{
|
165
|
+
if (data.length == 0)
|
166
|
+
{
|
167
|
+
create_cname_dns_record(id, "CNAME", entry, cname, function(data) {
|
168
|
+
console.log("CREATE RECORD: " + JSON.stringify(data));
|
169
|
+
if (data.result)
|
170
|
+
{
|
171
|
+
save_data(id, data.result.id,
|
172
|
+
function() {
|
173
|
+
send_success(data.result.id)
|
174
|
+
},
|
175
|
+
function() {
|
176
|
+
send_failure("Failed to save data")
|
177
|
+
}
|
178
|
+
);
|
179
|
+
}
|
180
|
+
else
|
181
|
+
{
|
182
|
+
send_failure(JSON.stringify(data));
|
183
|
+
}
|
184
|
+
});
|
185
|
+
}
|
186
|
+
else
|
187
|
+
{
|
188
|
+
send_failure("Entry " + entry + " already exists");
|
189
|
+
}
|
190
|
+
console.log(data);
|
191
|
+
});
|
192
|
+
});
|
193
|
+
|
194
|
+
return;
|
195
|
+
}
|
196
|
+
|
197
|
+
if (request.RequestType == "Update") {
|
198
|
+
|
199
|
+
load_data(function(domain_id, record_id) {
|
200
|
+
|
201
|
+
delete_cname_dns_record(domain_id, record_id, function() {
|
202
|
+
create_cname_dns_record(domain_id, "CNAME", entry, cname, function(data) {
|
203
|
+
console.log(data);
|
204
|
+
save_data(domain_id, data.result.id,
|
205
|
+
function() {
|
206
|
+
send_success(data.result.id)
|
207
|
+
},
|
208
|
+
function() {
|
209
|
+
send_failure("Failed to save data")
|
210
|
+
}
|
211
|
+
);
|
212
|
+
});
|
213
|
+
});
|
214
|
+
|
215
|
+
}, send_failure.bind("Failed to load data"));
|
216
|
+
|
217
|
+
|
218
|
+
return;
|
219
|
+
}
|
220
|
+
|
221
|
+
if (request.RequestType == "Delete") {
|
222
|
+
|
223
|
+
load_data(function(domain_id, record_id) {
|
224
|
+
|
225
|
+
delete_cname_dns_record(domain_id, record_id, function() {
|
226
|
+
send_success(record_id)
|
227
|
+
});
|
228
|
+
|
229
|
+
}, send_failure.bind("Failed to load data"));
|
230
|
+
return;
|
231
|
+
}
|