CliCommand.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\TestFramework\Deploy;
  7. use Magento\Framework\App\DeploymentConfig;
  8. use Magento\Framework\Shell;
  9. use Magento\Framework\Shell\CommandRenderer;
  10. use Magento\Setup\Console\Command\InstallCommand;
  11. /**
  12. * The purpose of this class is enable/disable module and upgrade commands execution.
  13. */
  14. class CliCommand
  15. {
  16. /**
  17. * @var \Magento\Framework\Shell
  18. */
  19. private $shell;
  20. /**
  21. * @var TestModuleManager
  22. */
  23. private $testEnv;
  24. /**
  25. * @var ParametersHolder
  26. */
  27. private $parametersHolder;
  28. /**
  29. * @var DeploymentConfig
  30. */
  31. private $deploymentConfig;
  32. /**
  33. * ShellCommand constructor.
  34. *
  35. * @param TestModuleManager $testEnv
  36. * @param DeploymentConfig $deploymentConfig
  37. * @internal param Shell $shell
  38. */
  39. public function __construct(
  40. \Magento\TestFramework\Deploy\TestModuleManager $testEnv
  41. ) {
  42. $this->shell = new Shell(new CommandRenderer());
  43. $this->testEnv = $testEnv;
  44. $this->parametersHolder = new ParametersHolder();
  45. }
  46. /**
  47. * Copy Test module files and execute enable module command.
  48. *
  49. * @param string $moduleName
  50. * @return string
  51. */
  52. public function introduceModule($moduleName)
  53. {
  54. $this->testEnv->addModuleFiles($moduleName);
  55. return $this->enableModule($moduleName);
  56. }
  57. /**
  58. * Execute enable module command.
  59. *
  60. * @param string $moduleName
  61. * @return string
  62. */
  63. public function enableModule($moduleName)
  64. {
  65. $initParams = $this->parametersHolder->getInitParams();
  66. $enableModuleCommand = 'php -f ' . BP . '/bin/magento module:enable ' . $moduleName
  67. . ' -n -vvv --magento-init-params="' . $initParams['magento-init-params'] . '"';
  68. return $this->shell->execute($enableModuleCommand);
  69. }
  70. /**
  71. * Execute upgrade magento command.
  72. *
  73. * @param array $installParams
  74. * @return string
  75. */
  76. public function upgrade($installParams = [])
  77. {
  78. $initParams = $this->parametersHolder->getInitParams();
  79. $upgradeCommand = 'php -f ' . BP . '/bin/magento setup:upgrade -vvv -n --magento-init-params="'
  80. . $initParams['magento-init-params'] . '"';
  81. $installParams = $this->toCliArguments($installParams);
  82. $upgradeCommand .= ' ' . implode(" ", array_keys($installParams));
  83. return $this->shell->execute($upgradeCommand, array_values($installParams));
  84. }
  85. /**
  86. * Execute disable module command.
  87. *
  88. * @param string $moduleName
  89. * @return string
  90. */
  91. public function disableModule($moduleName)
  92. {
  93. $initParams = $this->parametersHolder->getInitParams();
  94. $disableModuleCommand = 'php -f ' . BP . '/bin/magento module:disable '. $moduleName
  95. . ' -vvv --magento-init-params="' . $initParams['magento-init-params'] . '"';
  96. return $this->shell->execute($disableModuleCommand);
  97. }
  98. /**
  99. * Split quote db configuration.
  100. *
  101. * @return void
  102. */
  103. public function splitQuote()
  104. {
  105. $initParams = $this->parametersHolder->getInitParams();
  106. $installParams = $this->toCliArguments(
  107. $this->parametersHolder->getDbData('checkout')
  108. );
  109. $command = 'php -f ' . BP . '/bin/magento setup:db-schema:split-quote ' .
  110. implode(" ", array_keys($installParams)) .
  111. ' -vvv --magento-init-params="' .
  112. $initParams['magento-init-params'] . '"';
  113. $this->shell->execute($command, array_values($installParams));
  114. }
  115. /**
  116. * Split sales db configuration.
  117. *
  118. * @return void
  119. */
  120. public function splitSales()
  121. {
  122. $initParams = $this->parametersHolder->getInitParams();
  123. $installParams = $this->toCliArguments(
  124. $this->parametersHolder->getDbData('sales')
  125. );
  126. $command = 'php -f ' . BP . '/bin/magento setup:db-schema:split-sales ' .
  127. implode(" ", array_keys($installParams)) .
  128. ' -vvv --magento-init-params="' .
  129. $initParams['magento-init-params'] . '"';
  130. $this->shell->execute($command, array_values($installParams));
  131. }
  132. /**
  133. * Clean all types of cache
  134. */
  135. public function cacheClean()
  136. {
  137. $initParams = $this->parametersHolder->getInitParams();
  138. $command = 'php -f ' . BP . '/bin/magento cache:clean ' .
  139. ' -vvv --magento-init-params=' .
  140. $initParams['magento-init-params'];
  141. $this->shell->execute($command);
  142. }
  143. /**
  144. * Uninstall module
  145. *
  146. * @param string $moduleName
  147. */
  148. public function uninstallModule($moduleName)
  149. {
  150. $initParams = $this->parametersHolder->getInitParams();
  151. $command = 'php -f ' . BP . '/bin/magento module:uninstall ' . $moduleName . ' --remove-data ' .
  152. ' -vvv --non-composer --magento-init-params="' .
  153. $initParams['magento-init-params'] . '"';
  154. $this->shell->execute($command);
  155. }
  156. /**
  157. * Convert from raw params to CLI arguments, like --admin-username.
  158. *
  159. * @param array $params
  160. * @return array
  161. */
  162. private function toCliArguments(array $params)
  163. {
  164. $result = [];
  165. foreach ($params as $key => $value) {
  166. if (!empty($value)) {
  167. $result["--{$key}=%s"] = $value;
  168. }
  169. }
  170. return $result;
  171. }
  172. /**
  173. * Execute install command.
  174. *
  175. * @param array $modules
  176. * @param array $installParams
  177. * @return string
  178. * @throws \Exception
  179. */
  180. public function install(array $modules, array $installParams = [])
  181. {
  182. if (empty($modules)) {
  183. throw new \Exception("Cannot install Magento without modules");
  184. }
  185. $params = $this->parametersHolder->getInitParams();
  186. $installParams += [
  187. InstallCommand::INPUT_KEY_ENABLE_MODULES => implode(",", $modules),
  188. InstallCommand::INPUT_KEY_DISABLE_MODULES => 'all'
  189. ];
  190. $installParams = $this->toCliArguments(
  191. array_merge(
  192. $params,
  193. $this->parametersHolder->getDbData('default'),
  194. $installParams
  195. )
  196. );
  197. // run install script
  198. $exitCode = $this->shell->execute(
  199. PHP_BINARY . ' -f %s setup:install -vvv ' . implode(' ', array_keys($installParams)),
  200. array_merge([BP . '/bin/magento'], array_values($installParams))
  201. );
  202. $this->afterInstall();
  203. return $exitCode;
  204. }
  205. /**
  206. * You can decorate this function in order to add your own events here
  207. *
  208. * @return void
  209. */
  210. public function afterInstall()
  211. {
  212. //Take current deployment config in order to flush it cache after installation
  213. //Before installation usually we do not have any connections - so we need to add them
  214. $this->deploymentConfig = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
  215. ->get(DeploymentConfig::class);
  216. $this->deploymentConfig->resetData();
  217. }
  218. }