/**
  * Regenerates the primary or secondary access key for the specified storage 
  * account.
  * 
  * @param string $name    The storage account name.
  * @param string $keyType Specifies which key to regenerate.
  * 
  * @return Models\GetStorageServiceKeysResult
  * 
  * @see http://msdn.microsoft.com/en-us/library/windowsazure/ee460795.aspx
  */
 public function regenerateStorageServiceKeys($name, $keyType)
 {
     Validate::isString($name, 'name');
     Validate::notNullOrEmpty($name, 'name');
     Validate::isString($keyType, '$keyType');
     Validate::notNullOrEmpty($keyType, '$keyType');
     $properties = array(XmlSerializer::ROOT_NAME => 'RegenerateKeys');
     $reqArray = array(Resources::XTAG_NAMESPACE => array(Resources::WA_XML_NAMESPACE => null), Resources::XTAG_KEY_TYPE => $keyType);
     $body = $this->dataSerializer->serialize($reqArray, $properties);
     $context = new HttpCallContext();
     $context->setMethod(Resources::HTTP_POST);
     $context->setPath($this->_getStorageServiceKeysPath($name));
     $context->addStatusCode(Resources::STATUS_OK);
     $context->addQueryParameter(Resources::QP_ACTION, 'regenerate');
     $context->setBody($body);
     $context->addHeader(Resources::CONTENT_TYPE, Resources::XML_ATOM_CONTENT_TYPE);
     $response = $this->sendContext($context);
     $parsed = $this->dataSerializer->unserialize($response->getBody());
     return GetStorageServiceKeysResult::create($parsed);
 }
 /**
  * The base method of all the list operations. 
  * 
  * @param ListOptions $listOptions The options for list operation. 
  * @param string      $path        The path of the list operation.
  *
  * @return none
  */
 private function _listOptions($listOptions, $path)
 {
     if (is_null($listOptions)) {
         $listOptions = new ListOptions();
     }
     $httpCallContext = new HttpCallContext();
     $httpCallContext->setMethod(Resources::HTTP_GET);
     $httpCallContext->setPath($path);
     $httpCallContext->addStatusCode(Resources::STATUS_OK);
     $top = $listOptions->getTop();
     $skip = $listOptions->getSkip();
     if (!empty($top)) {
         $httpCallContext->addQueryParameter(Resources::QP_TOP, $top);
     }
     if (!empty($skip)) {
         $httpCallContext->addQueryParameter(Resources::QP_SKIP, $skip);
     }
     return $this->sendContext($httpCallContext);
 }
 /**
  * Cancels an in progress configuration change (update) or upgrade and returns
  * the deployment to its state before the upgrade or configuration change was
  * started.
  *
  * Note that you can rollback update or upgrade either by specifying the
  * deployment environment (staging or production), or by specifying the
  * deployment's unique name.
  *
  * @param string               $name    The hosted service name.
  * @param string               $mode    Specifies whether the rollback
  * should proceed automatically or not. Auto, The rollback proceeds without
  * further user input. Manual, You must call the walkUpgradeDomain API to apply
  * the rollback to each upgrade domain.
  * @param boolean              $force   Specifies whether the rollback
  * should proceed even when it will cause local data to be lost from some role
  * instances. True if the rollback should proceed; otherwise false if the
  * rollback should fail.
  * @param GetDeploymentOptions $options The optional parameters.
  *
  * @return none
  *
  * @see http://msdn.microsoft.com/en-us/library/windowsazure/hh403977.aspx
  */
 public function rollbackUpdateOrUpgrade($name, $mode, $force, $options)
 {
     Validate::isString($name, 'name');
     Validate::notNullOrEmpty($name, 'name');
     Validate::isString($mode, 'mode');
     Validate::isTrue(Mode::isValid($mode), Resources::INVALID_CHANGE_MODE_MSG);
     Validate::isBoolean($force, 'force');
     Validate::notNullOrEmpty($force, 'force');
     Validate::notNullOrEmpty($options, 'options');
     $xmlElements = array(Resources::XTAG_MODE => $mode, Resources::XTAG_FORCE => Utilities::booleanToString($force));
     $body = $this->_createRequestXml($xmlElements, Resources::XTAG_ROLLBACK_UPDATE_OR_UPGRADE);
     $context = new HttpCallContext();
     $context->setMethod(Resources::HTTP_POST);
     $context->setPath($this->_getDeploymentPath($name, $options) . '/');
     $context->addStatusCode(Resources::STATUS_ACCEPTED);
     $context->addQueryParameter(Resources::QP_COMP, Resources::QPV_ROLLBACK);
     $context->setBody($body);
     $context->addHeader(Resources::CONTENT_TYPE, Resources::XML_CONTENT_TYPE);
     assert(Utilities::endsWith($context->getPath(), '/'));
     $response = $this->sendContext($context);
     return AsynchronousOperationResult::create($response->getHeader());
 }