ConfigOptionsList.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Amqp\Setup;
  7. use Magento\Framework\Config\Data\ConfigData;
  8. use Magento\Framework\Config\File\ConfigFilePool;
  9. use Magento\Framework\Setup\ConfigOptionsListInterface;
  10. use Magento\Framework\Setup\Option\TextConfigOption;
  11. use Magento\Framework\App\DeploymentConfig;
  12. /**
  13. * Deployment configuration options needed for Setup application
  14. */
  15. class ConfigOptionsList implements ConfigOptionsListInterface
  16. {
  17. /**
  18. * Input key for the options
  19. */
  20. const INPUT_KEY_QUEUE_AMQP_HOST = 'amqp-host';
  21. const INPUT_KEY_QUEUE_AMQP_PORT = 'amqp-port';
  22. const INPUT_KEY_QUEUE_AMQP_USER = 'amqp-user';
  23. const INPUT_KEY_QUEUE_AMQP_PASSWORD = 'amqp-password';
  24. const INPUT_KEY_QUEUE_AMQP_VIRTUAL_HOST = 'amqp-virtualhost';
  25. const INPUT_KEY_QUEUE_AMQP_SSL = 'amqp-ssl';
  26. const INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS = 'amqp-ssl-options';
  27. /**
  28. * Path to the values in the deployment config
  29. */
  30. const CONFIG_PATH_QUEUE_AMQP_HOST = 'queue/amqp/host';
  31. const CONFIG_PATH_QUEUE_AMQP_PORT = 'queue/amqp/port';
  32. const CONFIG_PATH_QUEUE_AMQP_USER = 'queue/amqp/user';
  33. const CONFIG_PATH_QUEUE_AMQP_PASSWORD = 'queue/amqp/password';
  34. const CONFIG_PATH_QUEUE_AMQP_VIRTUAL_HOST = 'queue/amqp/virtualhost';
  35. const CONFIG_PATH_QUEUE_AMQP_SSL = 'queue/amqp/ssl';
  36. const CONFIG_PATH_QUEUE_AMQP_SSL_OPTIONS = 'queue/amqp/ssl_options';
  37. /**
  38. * Default values
  39. */
  40. const DEFAULT_AMQP_HOST = '';
  41. const DEFAULT_AMQP_PORT = '5672';
  42. const DEFAULT_AMQP_USER = '';
  43. const DEFAULT_AMQP_PASSWORD = '';
  44. const DEFAULT_AMQP_VIRTUAL_HOST = '/';
  45. const DEFAULT_AMQP_SSL = '';
  46. /**
  47. * @var ConnectionValidator
  48. */
  49. private $connectionValidator;
  50. /**
  51. * Constructor
  52. *
  53. * @param ConnectionValidator $connectionValidator
  54. */
  55. public function __construct(ConnectionValidator $connectionValidator)
  56. {
  57. $this->connectionValidator = $connectionValidator;
  58. }
  59. /**
  60. * {@inheritdoc}
  61. */
  62. public function getOptions()
  63. {
  64. return [
  65. new TextConfigOption(
  66. self::INPUT_KEY_QUEUE_AMQP_HOST,
  67. TextConfigOption::FRONTEND_WIZARD_TEXT,
  68. self::CONFIG_PATH_QUEUE_AMQP_HOST,
  69. 'Amqp server host',
  70. self::DEFAULT_AMQP_HOST
  71. ),
  72. new TextConfigOption(
  73. self::INPUT_KEY_QUEUE_AMQP_PORT,
  74. TextConfigOption::FRONTEND_WIZARD_TEXT,
  75. self::CONFIG_PATH_QUEUE_AMQP_PORT,
  76. 'Amqp server port',
  77. self::DEFAULT_AMQP_PORT
  78. ),
  79. new TextConfigOption(
  80. self::INPUT_KEY_QUEUE_AMQP_USER,
  81. TextConfigOption::FRONTEND_WIZARD_TEXT,
  82. self::CONFIG_PATH_QUEUE_AMQP_USER,
  83. 'Amqp server username',
  84. self::DEFAULT_AMQP_USER
  85. ),
  86. new TextConfigOption(
  87. self::INPUT_KEY_QUEUE_AMQP_PASSWORD,
  88. TextConfigOption::FRONTEND_WIZARD_TEXT,
  89. self::CONFIG_PATH_QUEUE_AMQP_PASSWORD,
  90. 'Amqp server password',
  91. self::DEFAULT_AMQP_PASSWORD
  92. ),
  93. new TextConfigOption(
  94. self::INPUT_KEY_QUEUE_AMQP_VIRTUAL_HOST,
  95. TextConfigOption::FRONTEND_WIZARD_TEXT,
  96. self::CONFIG_PATH_QUEUE_AMQP_VIRTUAL_HOST,
  97. 'Amqp virtualhost',
  98. self::DEFAULT_AMQP_VIRTUAL_HOST
  99. ),
  100. new TextConfigOption(
  101. self::INPUT_KEY_QUEUE_AMQP_SSL,
  102. TextConfigOption::FRONTEND_WIZARD_TEXT,
  103. self::CONFIG_PATH_QUEUE_AMQP_SSL,
  104. 'Amqp SSL',
  105. self::DEFAULT_AMQP_SSL
  106. ),
  107. new TextConfigOption(
  108. self::INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS,
  109. TextConfigOption::FRONTEND_WIZARD_TEXTAREA,
  110. self::CONFIG_PATH_QUEUE_AMQP_SSL_OPTIONS,
  111. 'Amqp SSL Options (JSON)',
  112. self::DEFAULT_AMQP_SSL
  113. ),
  114. ];
  115. }
  116. /**
  117. * {@inheritdoc}
  118. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  119. */
  120. public function createConfig(array $data, DeploymentConfig $deploymentConfig)
  121. {
  122. $configData = new ConfigData(ConfigFilePool::APP_ENV);
  123. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_HOST)) {
  124. $configData->set(self::CONFIG_PATH_QUEUE_AMQP_HOST, $data[self::INPUT_KEY_QUEUE_AMQP_HOST]);
  125. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_PORT)) {
  126. $configData->set(self::CONFIG_PATH_QUEUE_AMQP_PORT, $data[self::INPUT_KEY_QUEUE_AMQP_PORT]);
  127. }
  128. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_USER)) {
  129. $configData->set(self::CONFIG_PATH_QUEUE_AMQP_USER, $data[self::INPUT_KEY_QUEUE_AMQP_USER]);
  130. }
  131. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_PASSWORD)) {
  132. $configData->set(self::CONFIG_PATH_QUEUE_AMQP_PASSWORD, $data[self::INPUT_KEY_QUEUE_AMQP_PASSWORD]);
  133. }
  134. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_VIRTUAL_HOST)) {
  135. $configData->set(
  136. self::CONFIG_PATH_QUEUE_AMQP_VIRTUAL_HOST,
  137. $data[self::INPUT_KEY_QUEUE_AMQP_VIRTUAL_HOST]
  138. );
  139. }
  140. if (!$this->isDataEmpty($data, self::INPUT_KEY_QUEUE_AMQP_SSL)) {
  141. $configData->set(self::CONFIG_PATH_QUEUE_AMQP_SSL, $data[self::INPUT_KEY_QUEUE_AMQP_SSL]);
  142. }
  143. if (!$this->isDataEmpty(
  144. $data,
  145. self::INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS
  146. )) {
  147. $options = json_decode(
  148. $data[self::INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS],
  149. true
  150. );
  151. if ($options !== null) {
  152. $configData->set(
  153. self::CONFIG_PATH_QUEUE_AMQP_SSL_OPTIONS,
  154. $options
  155. );
  156. }
  157. }
  158. }
  159. return [$configData];
  160. }
  161. /**
  162. * {@inheritdoc}
  163. */
  164. public function validate(array $options, DeploymentConfig $deploymentConfig)
  165. {
  166. $errors = [];
  167. if (isset($options[self::INPUT_KEY_QUEUE_AMQP_HOST])
  168. && $options[self::INPUT_KEY_QUEUE_AMQP_HOST] !== '') {
  169. if (!$this->isDataEmpty(
  170. $options,
  171. self::INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS
  172. )) {
  173. $sslOptions = json_decode(
  174. $options[self::INPUT_KEY_QUEUE_AMQP_SSL_OPTIONS],
  175. true
  176. );
  177. } else {
  178. $sslOptions = null;
  179. }
  180. $isSslEnabled = !empty($options[self::INPUT_KEY_QUEUE_AMQP_SSL])
  181. && $options[self::INPUT_KEY_QUEUE_AMQP_SSL] !== 'false';
  182. $result = $this->connectionValidator->isConnectionValid(
  183. $options[self::INPUT_KEY_QUEUE_AMQP_HOST],
  184. $options[self::INPUT_KEY_QUEUE_AMQP_PORT],
  185. $options[self::INPUT_KEY_QUEUE_AMQP_USER],
  186. $options[self::INPUT_KEY_QUEUE_AMQP_PASSWORD],
  187. $options[self::INPUT_KEY_QUEUE_AMQP_VIRTUAL_HOST],
  188. $isSslEnabled,
  189. $sslOptions
  190. );
  191. if (!$result) {
  192. $errors[] = "Could not connect to the Amqp Server.";
  193. }
  194. }
  195. return $errors;
  196. }
  197. /**
  198. * Check if data ($data) with key ($key) is empty
  199. *
  200. * @param array $data
  201. * @param string $key
  202. * @return bool
  203. */
  204. private function isDataEmpty(array $data, $key)
  205. {
  206. if (isset($data[$key]) && $data[$key] !== '') {
  207. return false;
  208. }
  209. return true;
  210. }
  211. }