-
Notifications
You must be signed in to change notification settings - Fork 116
Expand file tree
/
Copy pathavailability_zone.cpp
More file actions
86 lines (67 loc) · 2.06 KB
/
availability_zone.cpp
File metadata and controls
86 lines (67 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/// Copyright 2016 Pinterest Inc.
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
//
// @author bol (bol@pinterest.com)
//
#include "common/availability_zone.h"
#include <folly/ScopeGuard.h>
#include <glog/logging.h>
#include <cstdio>
#include <set>
#include <string>
namespace {
bool isAllowedAz(const std::string& az) {
static const std::set<std::string> allowed_azs = {
"us-east-1a",
"us-east-1c",
"us-east-1d",
"us-east-1e",
"eu-west-1a",
"eu-west-1b",
};
return allowed_azs.find(az) != allowed_azs.end();
}
std::string getAvailabilityZoneImpl() {
static const std::string command =
"TOKEN=$(curl -X PUT -H \"X-aws-ec2-metadata-token-ttl-seconds: 300\" "
"http://169.254.169.254/latest/api/token 2> /dev/null) && "
"curl --silent --max-time 10 --connect-timeout 5 -H \"X-aws-ec2-metadata-token: $TOKEN\" "
"http://169.254.169.254/latest/meta-data/placement/availability-zone";
auto f = popen(command.c_str(), "re");
if (f == nullptr) {
LOG(ERROR) << "Failed to popen() with errno: " << errno;
return "";
}
SCOPE_EXIT {
pclose(f);
};
char buf[128];
auto len = fread(buf, 1, sizeof(buf), f);
if (ferror(f)) {
LOG(ERROR) << "fread() failed with errno: " << errno;
return "";
}
std::string az(buf, len);
if (isAllowedAz(az)) {
return az;
}
LOG(ERROR) << "Got invalid az: " << az;
return "";
}
} // namespace
namespace common {
const std::string& getAvailabilityZone() {
static const std::string local_az = getAvailabilityZoneImpl();
return local_az;
}
} // namespace common