blob: 85532b474bccd03d50f053c675dea9e924808b22 [file] [log] [blame]
<?php
/**
* Copyright 2007 Google 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.
*/
/**
* An API for fetching information about and controlling App Engine Modules.
*
*/
namespace google\appengine\api\modules;
require_once 'google/appengine/api/modules/modules_service_pb.php';
require_once "google/appengine/api/modules/InvalidModuleStateException.php";
require_once "google/appengine/api/modules/ModulesException.php";
require_once "google/appengine/api/modules/TransientModulesException.php";
require_once 'google/appengine/runtime/ApiProxy.php';
require_once 'google/appengine/runtime/ApplicationError.php';
use google\appengine\runtime\ApiProxy;
use google\appengine\runtime\ApplicationError;
use google\appengine\GetDefaultVersionRequest;
use google\appengine\GetDefaultVersionResponse;
use google\appengine\GetHostnameRequest;
use google\appengine\GetHostnameResponse;
use google\appengine\GetModulesRequest;
use google\appengine\GetModulesResponse;
use google\appengine\GetNumInstancesRequest;
use google\appengine\GetNumInstancesResponse;
use google\appengine\GetVersionsRequest;
use google\appengine\GetVersionsResponse;
use google\appengine\ModulesServiceError\ErrorCode;
use google\appengine\SetNumInstancesRequest;
use google\appengine\SetNumInstancesResponse;
use google\appengine\StartModuleRequest;
use google\appengine\StartModuleResponse;
use google\appengine\StopModuleRequest;
use google\appengine\StopModuleResponse;
final class ModulesService {
private static function errorCodeToException($error) {
switch($error) {
case ErrorCode::INVALID_MODULE:
return new ModulesException('Invalid module.');
case ErrorCode::INVALID_VERSION:
return new ModulesException('Invalid version.');
case ErrorCode::INVALID_INSTANCES:
return new ModulesException('Invalid instances.');
case ErrorCode::TRANSIENT_ERROR:
return new TransientModulesException();
case ErrorCode::UNEXPECTED_STATE:
return new InvalidModuleStateException();
default:
return new ModulesException('Error Code: ' . $error);
}
}
/**
* Gets the name of the currently running module.
*
* @return string The name of the current module. For example, if this is
* version "v1" of module "module5" for app "my-app", this function
* will return "module5".
*/
public static function getCurrentModuleName() {
return $_SERVER['CURRENT_MODULE_ID'];
}
/**
* Gets the version of the currently running module.
*
* @return string The name of the current module. For example, if this is
* version "v1" of module "module5" for app "my-app", this function
* will return "v1".
*/
public static function getCurrentVersionName() {
return explode('.', $_SERVER['CURRENT_VERSION_ID'])[0];
}
/**
* Gets the id of the currently running instance.
*
* @return string The name of the current module. For example, if this is
* instance 2 of version "v1" of module "module5" for app "my-app", this
* function will return "2". For automatically-scaled modules, this function
* will return a unique hex string for the instance (e.g.
* "00c61b117c7f7fd0ce9e1325a04b8f0df30deaaf").
*/
public static function getCurrentInstanceId() {
return $_SERVER['INSTANCE_ID'];
}
/**
* Gets an array of all the modules for the application.
*
* @return string[] An array of string containing the names of the modules
* associated with the application. The 'default' module will be included if
* it exists, as will the name of the module that is associated with the
* instance that calls this function.
*/
public static function getModules() {
$req = new GetModulesRequest();
$resp = new GetModulesResponse();
ApiProxy::makeSyncCall('modules', 'GetModules', $req, $resp);
return $resp->getModuleList();
}
/**
* Get an array of all versions associated with a module.
*
* @param string $module The name of the module to retrieve the versions for.
* If null then the versions for the current module will be retrieved.
*
* @return string[] An array of strings containing the names of versions
* associated with the module. The current version will also be included in
* this list.
*
* @throws \InvalidArgumentException If $module is not a string.
* @throws ModulesException If the given $module isn't valid.
* @throws TransientModulesException if there is an issue fetching the
* information.
*/
public static function getVersions($module = null) {
$req = new GetVersionsRequest();
$resp = new GetVersionsResponse();
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
try {
ApiProxy::makeSyncCall('modules', 'GetVersions', $req, $resp);
} catch (ApplicationError $e) {
throw errorCodeToException($e->getApplicationError());
}
return $resp->getVersionList();
}
/**
* Get the default version of a module.
*
* @param string $module The name of the module to retrieve the default
* versions for. If null then the default versions for the current module
* will be retrieved.
*
* @return string The default version of the module.
*
* @throws \InvalidArgumentException If $module is not a string.
* @throws ModulesException If the given $module is invalid or if no default
* version could be found.
*/
public static function getDefaultVersion($module = null) {
$req = new GetDefaultVersionRequest();
$resp = new GetDefaultVersionResponse();
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
try {
ApiProxy::makeSyncCall('modules', 'GetDefaultVersion', $req, $resp);
} catch (ApplicationError $e) {
throw errorCodeToException($e->getApplicationError());
}
return $resp->getVersion();
}
/**
* Get the number of instances set for a version of a module.
*
* This function does not work on automatically-scaled modules.
*
* @param string $module The name of the module to retrieve the count for. If
* null then the count for the current module will be retrieved.
*
* @param string $version The version of the module to retrieve the count for.
* If null then the count for the version of the current instance will be
* retrieved.
*
* @return integer The number of instances set for the current module
* version.
*
* @throws \InvalidArgumentException If $module or $version is not a string.
* @throws ModulesException if the given combination of $module and $version
* is invalid.
*/
public static function getNumInstances($module = null, $version = null) {
$req = new GetNumInstancesRequest();
$resp = new GetNumInstancesResponse();
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
if ($version !== null) {
if (!is_string($version)) {
throw new \InvalidArgumentException(
'$version must be a string. Actual type: ' . gettype($version));
}
$req->setVersion($version);
}
try {
ApiProxy::makeSyncCall('modules', 'GetNumInstances', $req, $resp);
} catch (ApplicationError $e) {
throw self::errorCodeToException($e->getApplicationError());
}
return (int) $resp->getInstances();
}
/**
* Set the number of instances for a version of a module.
*
* This function does not work on automatically-scaled modules.
*
* @param string $module The name of the module to set the instance count for.
* If null then the instance count for the current module will be set.
*
* @param string $version The version of the module to set the instance count
* for. If null then the count for the version of the current instance will
* be set.
*
* @throws \InvalidArgumentException If $instances is not an integer or if
* $module or $version is not a string.
* @throws ModulesException if the given combination of $module and $version
* is invalid.
* @throws TransientModulesException if there is an issue setting the
* instance count.
*/
public static function setNumInstances($instances,
$module = null,
$version = null) {
$req = new SetNumInstancesRequest();
$resp = new SetNumInstancesResponse();
if (!is_int($instances)) {
throw new \InvalidArgumentException(
'$instances must be an integer. Actual type: ' . gettype($instances));
}
$req->setInstances($instances);
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
if ($version !== null) {
if (!is_string($version)) {
throw new \InvalidArgumentException(
'$version must be a string. Actual type: ' . gettype($version));
}
$req->setVersion($version);
}
try {
ApiProxy::makeSyncCall('modules', 'SetNumInstances', $req, $resp);
} catch (ApplicationError $e) {
throw self::errorCodeToException($e->getApplicationError());
}
}
/**
* Starts all instances of the given version of a module.
* *
* @param string $module The name of the module to start.
*
* @param string $version The version of the module to start.
*
* @throws \InvalidArgumentException If $module or $version is not a string.
* @throws ModulesException if the given combination of $module and $version
* is invalid.
* @throws InvalidModuleStateException if the given $version is already
* started or cannot be started.
* @throws TransientModulesException if there is an issue starting the module
* version.
*/
public static function startVersion($module, $version) {
$req = new StartModuleRequest();
$resp = new StartModuleResponse();
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
if (!is_string($version)) {
throw new \InvalidArgumentException(
'$version must be a string. Actual type: ' . gettype($version));
}
$req->setVersion($version);
try {
ApiProxy::makeSyncCall('modules', 'StartModule', $req, $resp);
} catch (ApplicationError $e) {
throw self::errorCodeToException($e->getApplicationError());
}
}
/**
* Stops all instances of the given version of a module.
* *
* @param string $module The name of the module to stop. If null then the
* current module will be stopped.
*
* @param string $version The version of the module to stop. If null then the
* current version will be stopped.
*
* @throws \InvalidArgumentException If $module or $version is not a string.
* @throws ModulesException if the given combination of $module and $version
* instance is invalid.
* @throws InvalidModuleStateException if the given $version is already
* stopped or cannot be stopped.
* @throws TransientModulesException if there is an issue stopping the module
* version.
*/
public static function stopVersion($module = null, $version = null) {
$req = new StopModuleRequest();
$resp = new StopModuleResponse();
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
if ($version !== null) {
if (!is_string($version)) {
throw new \InvalidArgumentException(
'$version must be a string. Actual type: ' . gettype($version));
}
$req->setVersion($version);
}
try {
ApiProxy::makeSyncCall('modules', 'StopModule', $req, $resp);
} catch (ApplicationError $e) {
throw self::errorCodeToException($e->getApplicationError());
}
}
/**
* Returns the hostname to use when contacting a module.
* *
* @param string $module The name of the module whose hostname should be
* returned. If null then the hostname of the current module will be returned.
*
* @param string $version The version of the module whose hostname should be
* returned. If null then the hostname for the version of the current
* instance will be returned.
*
* @param string $instance The instance whose hostname should be returned. If
* null then the load balanced hostname for the module will be returned. If
* the module is not a fixed module then the instance parameter is ignored.
*
* @return string The valid canonical hostname that can be used to communicate
* with the given module/version/instance e.g.
* "0.version1.module5.myapp.appspot.com".
* @throws \InvalidArgumentException If $module or $version is not a string
* or if $instance is not a string or integer.
* @throws ModulesException if the given combination of $module and $instance
* is invalid.
*/
public static function getHostname($module = null,
$version = null,
$instance = null) {
$req = new GetHostnameRequest();
$resp = new GetHostnameResponse();
if ($module !== null) {
if (!is_string($module)) {
throw new \InvalidArgumentException(
'$module must be a string. Actual type: ' . gettype($module));
}
$req->setModule($module);
}
if ($version !== null) {
if (!is_string($version)) {
throw new \InvalidArgumentException(
'$version must be a string. Actual type: ' . gettype($version));
}
$req->setVersion($version);
}
if ($instance !== null) {
if (!is_int($instance) && !is_string($instance)) {
throw new \InvalidArgumentException(
'$instance must be an integer or string. Actual type: ' .
gettype($instance));
}
$req->setInstance((string) $instance);
}
try {
ApiProxy::makeSyncCall('modules', 'GetHostname', $req, $resp);
} catch (ApplicationError $e) {
throw self::errorCodeToException($e->getApplicationError());
}
return $resp->getHostname();
}
}