1 package com
.google
.appengine
.api
.labs
.servers
;
3 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetDefaultVersionRequest
;
4 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetDefaultVersionResponse
;
5 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetHostnameRequest
;
6 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetHostnameResponse
;
7 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetNumInstancesRequest
;
8 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetNumInstancesResponse
;
9 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetServersRequest
;
10 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetServersResponse
;
11 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetVersionsRequest
;
12 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.GetVersionsResponse
;
13 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.ServersServiceError
.ErrorCode
;
14 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.SetNumInstancesRequest
;
15 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.StartServerRequest
;
16 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.StartServerResponse
;
17 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.StopServerRequest
;
18 import com
.google
.appengine
.api
.labs
.servers
.ServersServicePb
.StopServerResponse
;
19 import com
.google
.apphosting
.api
.ApiProxy
;
20 import com
.google
.apphosting
.api
.ApiProxy
.Environment
;
21 import com
.google
.common
.base
.Pair
;
22 import com
.google
.common
.base
.Splitter
;
23 import com
.google
.common
.collect
.Sets
;
24 import com
.google
.protobuf
.InvalidProtocolBufferException
;
25 import com
.google
.protobuf
.Message
;
27 import java
.util
.List
;
31 class ServersServiceImpl
implements ServersService
{
32 protected static final String PACKAGE
= "servers";
35 * Environment attribute key where the instance id is stored.
37 * @see ServersService#getCurrentInstanceId()
39 private static final String INSTANCE_ID_ENV_ATTRIBUTE
= "com.google.appengine.instance.id";
41 private Pair
<String
, String
> getCurrentServerAndVersion() {
42 Environment env
= ApiProxy
.getCurrentEnvironment();
43 String majorVersion
= Splitter
.on('.').split(env
.getVersionId()).iterator().next();
44 if (majorVersion
.contains(":")) {
45 List
<String
> result
= Splitter
.on(':').splitToList(majorVersion
);
46 return Pair
.of(result
.get(0), result
.get(1));
48 return Pair
.of("default", majorVersion
);
53 public String
getCurrentServer() {
54 return getCurrentServerAndVersion().first
;
58 public String
getCurrentVersion() {
59 return getCurrentServerAndVersion().second
;
62 private static Map
<String
, Object
> getThreadLocalAttributes() {
63 return ApiProxy
.getCurrentEnvironment().getAttributes();
67 public String
getCurrentInstanceId() {
68 Map
<String
, Object
> env
= getThreadLocalAttributes();
69 if (!env
.containsKey(INSTANCE_ID_ENV_ATTRIBUTE
)) {
70 throw new ServersException("No valid instance id for this instance.");
72 String instanceId
= (String
) getThreadLocalAttributes().get(INSTANCE_ID_ENV_ATTRIBUTE
);
73 if (instanceId
== null) {
74 throw new ServersException("No valid instance id for this instance.");
79 private static void makeSyncCall(String method
, Message
.Builder request
, Message
.Builder response
)
80 throws ServersException
{
83 responseBytes
= ApiProxy
.makeSyncCall(PACKAGE
, method
, request
.build().toByteArray());
84 response
.mergeFrom(responseBytes
);
85 } catch (ApiProxy
.ApplicationException e
) {
86 switch(ErrorCode
.valueOf(e
.getApplicationError())) {
88 throw new InvalidServerException("Given server is not known.");
90 throw new InvalidVersionException("Given server version is not known.");
91 case INVALID_INSTANCES
:
92 throw new InvalidInstanceException("Given instances value is invalid.");
93 case UNEXPECTED_STATE
:
94 if (method
.equals("StartServer")) {
95 throw new ServerAlreadyStartedException("Given server version is already started.");
96 } else if (method
.equals("StopServer")) {
97 throw new ServerAlreadyStoppedException("Given server version is already stopped.");
100 throw new ServersException("Unknown error occurred.");
102 } catch (InvalidProtocolBufferException e
) {
103 throw new RuntimeException("Internal logic error: Response PB could not be parsed.", e
);
108 public Set
<String
> getServers() {
109 GetServersResponse
.Builder response
= GetServersResponse
.newBuilder();
110 makeSyncCall("GetServers", GetServersRequest
.newBuilder(), response
);
111 return Sets
.newHashSet(response
.getServerList());
115 public Set
<String
> getVersions(String server
) {
116 GetVersionsRequest
.Builder request
= GetVersionsRequest
.newBuilder();
117 request
.setServer(server
);
118 GetVersionsResponse
.Builder response
= GetVersionsResponse
.newBuilder();
119 makeSyncCall("GetVersions", request
, response
);
120 return Sets
.newHashSet(response
.getVersionList());
124 public String
getDefaultVersion(String server
) {
125 GetDefaultVersionRequest
.Builder request
= GetDefaultVersionRequest
.newBuilder();
126 request
.setServer(server
);
127 GetDefaultVersionResponse
.Builder response
= GetDefaultVersionResponse
.newBuilder();
128 makeSyncCall("GetDefaultVersion", request
, response
);
129 return response
.getVersion();
133 public long getNumInstances(String server
, String version
) {
134 GetNumInstancesRequest
.Builder request
= GetNumInstancesRequest
.newBuilder();
135 request
.setServer(server
);
136 request
.setVersion(version
);
137 GetNumInstancesResponse
.Builder response
= GetNumInstancesResponse
.newBuilder();
138 makeSyncCall("GetNumInstances", request
, response
);
139 return response
.getInstances();
143 public void setNumInstances(String server
, String version
, long instances
) {
144 SetNumInstancesRequest
.Builder request
= SetNumInstancesRequest
.newBuilder();
145 request
.setServer(server
);
146 request
.setVersion(version
);
147 request
.setInstances(instances
);
148 makeSyncCall("SetNumInstances", request
, SetNumInstancesRequest
.newBuilder());
152 public void startServer(String server
, String version
) {
153 StartServerRequest
.Builder request
= StartServerRequest
.newBuilder();
154 request
.setServer(server
);
155 request
.setVersion(version
);
156 makeSyncCall("StartServer", request
, StartServerResponse
.newBuilder());
160 public void stopServer(String server
, String version
) {
161 StopServerRequest
.Builder request
= StopServerRequest
.newBuilder();
162 request
.setServer(server
);
163 request
.setVersion(version
);
164 makeSyncCall("StopServer", request
, StopServerResponse
.newBuilder());
167 private String
getHostname(GetHostnameRequest
.Builder request
) {
168 GetHostnameResponse
.Builder response
= GetHostnameResponse
.newBuilder();
169 makeSyncCall("GetHostname", request
, response
);
170 return response
.getHostname();
174 public String
getServerHostname(String server
, String version
) {
175 GetHostnameRequest
.Builder request
= GetHostnameRequest
.newBuilder();
176 request
.setServer(server
);
177 request
.setVersion(version
);
178 return getHostname(request
);
182 public String
getServerHostname(String server
, String version
, int instance
) {
183 GetHostnameRequest
.Builder request
= GetHostnameRequest
.newBuilder();
184 request
.setServer(server
);
185 request
.setVersion(version
);
186 request
.setInstance(Integer
.toString(instance
));
187 return getHostname(request
);
190 ServersServiceImpl() { }