diff --git a/README.md b/README.md index 59d6b82..ff3041c 100644 --- a/README.md +++ b/README.md @@ -41,41 +41,6 @@ Elasticsearch migration for laravel. The package is registered through the package discovery of laravel and Composer. >https://laravel.com/docs/5.6/packages -## Configuration -| Key | ENV | Value | Description | -|:-------------:|-------------:|:-------------:|:-----:| -| host | ELASTICSEARCH_HOST | STRING | Host | -| port | ELASTICSEARCH_PORT | INTEGER | Default: 9200 | -| scheme | ELASTICSEARCH_SCHEME | STRING | https or http | -| user | ELASTICSEARCH_USER | STRING | Username | -| pass | ELASTICSEARCH_PASS | STRING | Password | -| migration.filePath | --- | STRING | File path for migration scripts | - -## Usage - -### Build migration ->Triadev\EsMigration\Business\Factory\MigrationBuilder::TYPE() - -- createIndex -- updateIndex -- deleteIndex -- alias -- reindex -- deleteByQuery -- updateByQuery - -### Commands - -#### Start migration -Orchestra migrations ->php artisan triadev:elasticsearch:migrate:start VERSIONS - -Example: ->php artisan triadev:elasticsearch:migrate:start migration1,migration2,migration3 - -#### Show migrations ->php artisan triadev:elasticsearch:migration:show - ### Events [Documentation: Laravel Events](https://laravel.com/docs/5.7/events) diff --git a/examples/addAndRemoveAlias/migrations.php b/examples/addAndRemoveAlias/migrations.php deleted file mode 100644 index ad244d9..0000000 --- a/examples/addAndRemoveAlias/migrations.php +++ /dev/null @@ -1,13 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'examples', - [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'keyword' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ) -]; diff --git a/examples/createIndex/migrations.php b/examples/createIndex/migrations.php deleted file mode 100644 index 151833a..0000000 --- a/examples/createIndex/migrations.php +++ /dev/null @@ -1,19 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ) -]; diff --git a/examples/deleteByQuery/migrations.php b/examples/deleteByQuery/migrations.php deleted file mode 100644 index 1c44a3b..0000000 --- a/examples/deleteByQuery/migrations.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'example', - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/examples/deleteIndex/migrations.php b/examples/deleteIndex/migrations.php deleted file mode 100644 index cf384dd..0000000 --- a/examples/deleteIndex/migrations.php +++ /dev/null @@ -1,5 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'example', - [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/examples/updateIndex/migrations.php b/examples/updateIndex/migrations.php deleted file mode 100644 index 6c4ab1a..0000000 --- a/examples/updateIndex/migrations.php +++ /dev/null @@ -1,21 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'keyword' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ) -]; diff --git a/phpunit.xml b/phpunit.xml index 7087fcb..ae35c9f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -26,5 +26,6 @@ + diff --git a/src/Business/Factory/MigrationBuilder.php b/src/Business/Factory/MigrationBuilder.php deleted file mode 100644 index 3cdc04b..0000000 --- a/src/Business/Factory/MigrationBuilder.php +++ /dev/null @@ -1,152 +0,0 @@ -setSettings($settings); - } - - /** - * Migration: updateIndex - * - * @param string $index - * @param array|null $mappings - * @param array|null $settings - * @param bool $closeIndex - * @return UpdateIndex - */ - public static function updateIndex( - string $index, - ?array $mappings = null, - ?array $settings = null, - bool $closeIndex = false - ) : UpdateIndex { - return (new UpdateIndex($index)) - ->setMappings($mappings) - ->setSettings($settings) - ->setCloseIndex($closeIndex); - } - - /** - * Migration: deleteIndex - * - * @param string $index - * @return DeleteIndex - */ - public static function deleteIndex( - string $index - ) : DeleteIndex { - return (new DeleteIndex($index)); - } - - /** - * Migration: alias - * - * @param string $index - * @param array $add - * @param array $remove - * @param array $removeIndices - * @return Alias - */ - public static function alias( - string $index, - array $add = [], - array $remove = [], - array $removeIndices = [] - ) : Alias { - return (new Alias($index)) - ->setAdd($add) - ->setRemove($remove) - ->setRemoveIndices($removeIndices); - } - - /** - * Migration: deleteByQuery - * - * @param string $index - * @param array $query - * @param null|string $type - * @param array $options - * @return DeleteByQuery - */ - public static function deleteByQuery( - string $index, - array $query, - ?string $type = null, - array $options = [] - ) : DeleteByQuery { - return (new DeleteByQuery($index, $query)) - ->setType($type) - ->setOptions($options); - } - - /** - * Migration: updateByQuery - * - * @param string $index - * @param array $query - * @param null|string $type - * @param null|array $script - * @param array $options - * @return UpdateByQuery - */ - public static function updateByQuery( - string $index, - array $query, - ?string $type = null, - ?array $script = null, - array $options = [] - ) : UpdateByQuery { - return (new UpdateByQuery($index, $query)) - ->setType($type) - ->setScript($script) - ->setOptions($options); - } - - /** - * Migration: reindex - * - * @param string $index - * @param string $destIndex - * @param bool $refreshSourceIndex - * @param array $global - * @param array $source - * @param array $dest - * @return Reindex - */ - public static function reindex( - string $index, - string $destIndex, - bool $refreshSourceIndex = false, - array $global = [], - array $source = [], - array $dest = [] - ) : Reindex { - return (new Reindex($index, $destIndex)) - ->setRefreshSourceIndex($refreshSourceIndex) - ->setGlobal($global) - ->setSource($source) - ->setDest($dest); - } -} diff --git a/src/Business/Mapper/MigrationStatus.php b/src/Business/Mapper/MigrationStatus.php new file mode 100644 index 0000000..b1e81b7 --- /dev/null +++ b/src/Business/Mapper/MigrationStatus.php @@ -0,0 +1,32 @@ +getParams(); + + $validator = Validator::make($params, $this->getValidationRules()); + + if ($validator->fails()) { + Log::error("The migration step validation failed.", [ + 'id' => $migrationStep->getId(), + 'type' => $migrationStep->getType() + ]); + + throw new MigrationStepValidation(sprintf( + "The migration step validation failed: %s", + $migrationStep->getId() + )); + } + + $this->preCheck($esClient, $params); + + $this->startMigration($esClient, $params); + + $this->postCheck($esClient, $params); + } + + /** + * Get validation rules + * + * @return array + */ + abstract public function getValidationRules() : array; + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + abstract public function preCheck(Client $esClient, array $params); + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + abstract public function startMigration(Client $esClient, array $params); + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + abstract public function postCheck(Client $esClient, array $params); +} diff --git a/src/Business/Migration/Alias.php b/src/Business/Migration/Alias.php deleted file mode 100644 index 66a4b24..0000000 --- a/src/Business/Migration/Alias.php +++ /dev/null @@ -1,40 +0,0 @@ -getAdd())) { - foreach ($migration->getAdd() as $a) { - $esClient->indices()->putAlias([ - 'index' => $migration->getIndex(), - 'name' => $a - ]); - } - } - - if (!empty($migration->getRemove())) { - foreach ($migration->getRemove() as $a) { - $esClient->indices()->deleteAlias([ - 'index' => $migration->getIndex(), - 'name' => $a - ]); - } - } - - if (!empty($migration->getRemoveIndices())) { - $esClient->indices()->delete([ - 'index' => implode(',', $migration->getRemoveIndices()) - ]); - } - } -} diff --git a/src/Business/Migration/CreateIndex.php b/src/Business/Migration/CreateIndex.php index 41f4f62..320b33d 100644 --- a/src/Business/Migration/CreateIndex.php +++ b/src/Business/Migration/CreateIndex.php @@ -3,27 +3,65 @@ use Elasticsearch\Client; -class CreateIndex +class CreateIndex extends AbstractMigration { /** - * Migrate + * Get validation rules * - * @param Client $esClient - * @param \Triadev\EsMigration\Models\Migrations\CreateIndex $migration + * @return array */ - public function migrate(Client $esClient, \Triadev\EsMigration\Models\Migrations\CreateIndex $migration) + public function getValidationRules() : array { - $body = [ - 'mappings' => $migration->getMappings() + return [ + 'index' => 'required|string', + 'body' => 'required|array', + 'body.mappings' => 'array', + 'body.settings' => 'array' ]; + } + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = array_get($params, 'index'); + + if ($esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index already exist: %s", $index)); + }; + } - if ($migration->getSettings()) { - $body['settings'] = $migration->getSettings(); - } + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->create($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + $index = array_get($params, 'index'); - $esClient->indices()->create([ - 'index' => $migration->getIndex(), - 'body' => $body - ]); + if (!$esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + }; } } diff --git a/src/Business/Migration/DeleteAlias.php b/src/Business/Migration/DeleteAlias.php new file mode 100644 index 0000000..ad508cb --- /dev/null +++ b/src/Business/Migration/DeleteAlias.php @@ -0,0 +1,66 @@ + 'required|string', + 'name' => 'required|string' + ]; + } + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = $params['index']; + if (!$esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + } + + if (!$esClient->indices()->existsAlias($params)) { + throw new \Exception(sprintf("Alias not exist: %s", $params['name'])); + }; + } + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->deleteAlias($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + if ($esClient->indices()->existsAlias($params)) { + throw new \Exception(sprintf("Alias exist: %s", $params['name'])); + }; + } +} diff --git a/src/Business/Migration/DeleteByQuery.php b/src/Business/Migration/DeleteByQuery.php index 2fb9308..dd09177 100644 --- a/src/Business/Migration/DeleteByQuery.php +++ b/src/Business/Migration/DeleteByQuery.php @@ -3,32 +3,54 @@ use Elasticsearch\Client; -class DeleteByQuery +class DeleteByQuery extends AbstractMigration { /** - * Migrate + * Get validation rules * - * @param Client $esClient - * @param \Triadev\EsMigration\Models\Migrations\DeleteByQuery $migration + * @return array */ - public function migrate(Client $esClient, \Triadev\EsMigration\Models\Migrations\DeleteByQuery $migration) + public function getValidationRules(): array { - $params = [ - 'index' => $migration->getIndex(), - 'body' => [ - 'query' => $migration->getQuery() - ] + return [ + 'index' => 'required|string' ]; - - if ($migration->getType()) { - $params['type'] = $migration->getType(); - } + } - $params = array_merge( - $params, - $migration->getOptions() - ); + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + // TODO: Implement preCheck() method. + } + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { $esClient->deleteByQuery($params); } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + // TODO: Implement postCheck() method. + } } diff --git a/src/Business/Migration/DeleteIndex.php b/src/Business/Migration/DeleteIndex.php index e077c96..10cfc34 100644 --- a/src/Business/Migration/DeleteIndex.php +++ b/src/Business/Migration/DeleteIndex.php @@ -3,18 +3,62 @@ use Elasticsearch\Client; -class DeleteIndex +class DeleteIndex extends AbstractMigration { /** - * Migrate + * Get validation rules + * + * @return array + */ + public function getValidationRules(): array + { + return [ + 'index' => 'required|string' + ]; + } + + /** + * Pre check * * @param Client $esClient - * @param \Triadev\EsMigration\Models\Migrations\DeleteIndex $migration + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = $params['index']; + + if (!$esClient->indices()->exists(['index' => $params['index']])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + } + } + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->delete($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception */ - public function migrate(Client $esClient, \Triadev\EsMigration\Models\Migrations\DeleteIndex $migration) + public function postCheck(Client $esClient, array $params) { - $esClient->indices()->delete([ - 'index' => $migration->getIndex() - ]); + $index = $params['index']; + + if ($esClient->indices()->exists(['index' => $params['index']])) { + throw new \Exception(sprintf("Index exist: %s", $index)); + } } } diff --git a/src/Business/Migration/PutAlias.php b/src/Business/Migration/PutAlias.php new file mode 100644 index 0000000..b8c1c14 --- /dev/null +++ b/src/Business/Migration/PutAlias.php @@ -0,0 +1,66 @@ + 'required|string', + 'name' => 'required|string' + ]; + } + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = $params['index']; + if (!$esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + } + + if ($esClient->indices()->existsAlias($params)) { + throw new \Exception(sprintf("Alias already exist: %s", $params['name'])); + }; + } + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->putAlias($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + if (!$esClient->indices()->existsAlias($params)) { + throw new \Exception(sprintf("Alias not exist: %s", $params['name'])); + }; + } +} diff --git a/src/Business/Migration/Reindex.php b/src/Business/Migration/Reindex.php index 5eda640..36c6240 100644 --- a/src/Business/Migration/Reindex.php +++ b/src/Business/Migration/Reindex.php @@ -2,45 +2,55 @@ namespace Triadev\EsMigration\Business\Migration; use Elasticsearch\Client; -use Triadev\EsMigration\Exception\IndexNotExist; -class Reindex +class Reindex extends AbstractMigration { /** - * Migrate + * Get validation rules + * + * @return array + */ + public function getValidationRules(): array + { + return [ + 'index' => 'required|string' + ]; + } + + /** + * Pre check * * @param Client $esClient - * @param \Triadev\EsMigration\Models\Migrations\Reindex $migration + * @param array $params * - * @throws IndexNotExist + * @throws \Exception */ - public function migrate(Client $esClient, \Triadev\EsMigration\Models\Migrations\Reindex $migration) + public function preCheck(Client $esClient, array $params) { - if (!$esClient->indices()->exists(['index' => $migration->getDestIndex()])) { - throw new IndexNotExist(); - } - - if ($migration->isRefreshSourceIndex()) { - $esClient->indices()->refresh([ - 'index' => $migration->getIndex() - ]); - } - - $body = [ - 'source' => [ - 'index' => $migration->getIndex() - ], - 'dest' => [ - 'index' => $migration->getDestIndex() - ] - ]; + // TODO: Implement preCheck() method. + } - $body = array_merge($body, $migration->getGlobal()); - $body['source'] = array_merge($body['source'], $migration->getSource()); - $body['dest'] = array_merge($body['dest'], $migration->getDest()); + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->reindex($params); + } - $esClient->reindex([ - 'body' => $body - ]); + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + // TODO: Implement postCheck() method. } } diff --git a/src/Business/Migration/UpdateByQuery.php b/src/Business/Migration/UpdateByQuery.php index 7173b29..9ad0339 100644 --- a/src/Business/Migration/UpdateByQuery.php +++ b/src/Business/Migration/UpdateByQuery.php @@ -3,36 +3,54 @@ use Elasticsearch\Client; -class UpdateByQuery +class UpdateByQuery extends AbstractMigration { /** - * Migrate + * Get validation rules * - * @param Client $esClient - * @param \Triadev\EsMigration\Models\Migrations\UpdateByQuery $migration + * @return array */ - public function migrate(Client $esClient, \Triadev\EsMigration\Models\Migrations\UpdateByQuery $migration) + public function getValidationRules(): array { - $params = [ - 'index' => $migration->getIndex(), - 'body' => [ - 'query' => $migration->getQuery() - ] + return [ + 'index' => 'required|string' ]; + } - if ($migration->getType()) { - $params['type'] = $migration->getType(); - } - - if ($migration->getScript()) { - $params['body']['script'] = $migration->getScript(); - } - - $params = array_merge( - $params, - $migration->getOptions() - ); + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + // TODO: Implement preCheck() method. + } + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { $esClient->updateByQuery($params); } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + // TODO: Implement postCheck() method. + } } diff --git a/src/Business/Migration/UpdateIndex.php b/src/Business/Migration/UpdateIndex.php deleted file mode 100644 index b9bb5eb..0000000 --- a/src/Business/Migration/UpdateIndex.php +++ /dev/null @@ -1,66 +0,0 @@ -getMappings()) { - (new FieldDatatypeMigration())->validate( - $esClient->indices()->getMapping( - ['index' => $migration->getIndex()] - )[$migration->getIndex()]['mappings'], - $migration->getMappings() - ); - - $this->updateMappings($esClient, $migration); - } - - if ($migration->getSettings()) { - $this->updateSettings($esClient, $migration); - } - } - - private function updateMappings(Client $esClient, \Triadev\EsMigration\Models\Migrations\UpdateIndex $migration) - { - foreach ($migration->getMappings() as $type => $mapping) { - $esClient->indices()->putMapping([ - 'index' => $migration->getIndex(), - 'type' => $type, - 'body' => $mapping - ]); - } - } - - private function updateSettings(Client $esClient, \Triadev\EsMigration\Models\Migrations\UpdateIndex $migration) - { - if ($migration->isCloseIndex()) { - $esClient->indices()->close([ - 'index' => $migration->getIndex() - ]); - } - - $esClient->indices()->putSettings([ - 'index' => $migration->getIndex(), - 'body' => $migration->getSettings() - ]); - - if ($migration->isCloseIndex()) { - $esClient->indices()->open([ - 'index' => $migration->getIndex() - ]); - } - } -} diff --git a/src/Business/Migration/UpdateIndexMapping.php b/src/Business/Migration/UpdateIndexMapping.php new file mode 100644 index 0000000..360476e --- /dev/null +++ b/src/Business/Migration/UpdateIndexMapping.php @@ -0,0 +1,63 @@ + 'required|string', + 'type' => 'required|string', + 'ignore_conflicts' => 'boolean', + 'body' => 'required|array', + 'body.properties' => 'required|array' + ]; + } + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = $params['index']; + if (!$esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + } + } + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->putMapping($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + // + } +} diff --git a/src/Business/Migration/UpdateIndexSetting.php b/src/Business/Migration/UpdateIndexSetting.php new file mode 100644 index 0000000..fd8e927 --- /dev/null +++ b/src/Business/Migration/UpdateIndexSetting.php @@ -0,0 +1,60 @@ + 'required|string', + 'body' => 'required|array' + ]; + } + + /** + * Pre check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function preCheck(Client $esClient, array $params) + { + $index = $params['index']; + if (!$esClient->indices()->exists(['index' => $index])) { + throw new \Exception(sprintf("Index not exist: %s", $index)); + } + } + + /** + * Start migration + * + * @param Client $esClient + * @param array $params + */ + public function startMigration(Client $esClient, array $params) + { + $esClient->indices()->putSettings($params); + } + + /** + * Post check + * + * @param Client $esClient + * @param array $params + * + * @throws \Exception + */ + public function postCheck(Client $esClient, array $params) + { + // TODO: Implement postCheck() method. + } +} diff --git a/src/Business/Repository/ElasticsearchClients.php b/src/Business/Repository/ElasticsearchClients.php new file mode 100644 index 0000000..fa810f6 --- /dev/null +++ b/src/Business/Repository/ElasticsearchClients.php @@ -0,0 +1,74 @@ +clientBuilder = ClientBuilder::create(); + } + + /** + * Add + * + * @param string $esClientKey + * @param string $host + * @param int $port + * @param string $scheme + * @param null|string $user + * @param null|string $password + */ + public function add( + string $esClientKey, + string $host, + int $port, + string $scheme, + ?string $user = null, + ?string $password = null + ) { + $this->elasticsearchClients[$esClientKey] = $this->clientBuilder->setHosts([ + [ + 'host' => $host, + 'port' => $port, + 'scheme' => $scheme, + 'user' => $user, + 'pass' => $password + ] + ])->build(); + } + + /** + * Get + * + * @param string $esClientKey + * @return Client|null + */ + public function get(string $esClientKey) : ?Client + { + return array_get($this->elasticsearchClients, $esClientKey); + } + + /** + * All + * + * @return Client[] + */ + public function all() : array + { + return $this->elasticsearchClients; + } +} diff --git a/src/Business/Repository/ElasticsearchMigration.php b/src/Business/Repository/ElasticsearchMigration.php index 640f669..a071598 100644 --- a/src/Business/Repository/ElasticsearchMigration.php +++ b/src/Business/Repository/ElasticsearchMigration.php @@ -5,6 +5,7 @@ use Triadev\EsMigration\Business\Events\MigrationDone; use Triadev\EsMigration\Business\Events\MigrationError; use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract; class ElasticsearchMigration implements ElasticsearchMigrationContract @@ -14,7 +15,7 @@ class ElasticsearchMigration implements ElasticsearchMigrationContract */ public function createOrUpdate( string $migration, - int $status = self::ELASTICSEARCH_MIGRATION_STATUS_WAIT, + int $status = MigrationStatus::MIGRATION_STATUS_WAIT, ?string $error = null ): \Triadev\EsMigration\Models\Entity\ElasticsearchMigration { $dbMigration = $this->find($migration); @@ -24,7 +25,7 @@ public function createOrUpdate( $dbMigration->migration = $migration; } - if ($this->isStatusValid($status)) { + if ((new MigrationStatus())->isMigrationStatusValid($status)) { $dbMigration->status = $status; $dbMigration->error = $error; } @@ -64,32 +65,16 @@ public function all(array $columns = ['*']): Collection return \Triadev\EsMigration\Models\Entity\ElasticsearchMigration::all($columns); } - private function isStatusValid(int $status) : bool - { - $valid = [ - self::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - self::ELASTICSEARCH_MIGRATION_STATUS_RUNNING, - self::ELASTICSEARCH_MIGRATION_STATUS_DONE, - self::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ]; - - if (in_array($status, $valid)) { - return true; - } - - return false; - } - private function dispatchStatus(\Triadev\EsMigration\Models\Entity\ElasticsearchMigration $migration) { switch ($migration->status) { - case self::ELASTICSEARCH_MIGRATION_STATUS_RUNNING: + case MigrationStatus::MIGRATION_STATUS_RUNNING: $event = new MigrationRunning($migration); break; - case self::ELASTICSEARCH_MIGRATION_STATUS_DONE: + case MigrationStatus::MIGRATION_STATUS_DONE: $event = new MigrationDone($migration); break; - case self::ELASTICSEARCH_MIGRATION_STATUS_ERROR: + case MigrationStatus::MIGRATION_STATUS_ERROR: $event = new MigrationError($migration); break; default: diff --git a/src/Business/Repository/ElasticsearchMigrationStep.php b/src/Business/Repository/ElasticsearchMigrationStep.php index afb60c4..7f8ea67 100644 --- a/src/Business/Repository/ElasticsearchMigrationStep.php +++ b/src/Business/Repository/ElasticsearchMigrationStep.php @@ -4,6 +4,7 @@ use Triadev\EsMigration\Business\Events\MigrationStepDone; use Triadev\EsMigration\Business\Events\MigrationStepError; use Triadev\EsMigration\Business\Events\MigrationStepRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; use Triadev\EsMigration\Exception\MigrationsNotExist; @@ -15,14 +16,14 @@ class ElasticsearchMigrationStep implements ElasticsearchMigrationStepContract public function create( int $migrationId, string $type, - string $index + array $params = [] ): \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStep { $dbMigration = new \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStep(); $dbMigration->migration_id = $migrationId; $dbMigration->type = $type; - $dbMigration->index = $index; - $dbMigration->status = self::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT; + $dbMigration->status = MigrationStatus::MIGRATION_STATUS_WAIT; + $dbMigration->params = json_encode($params); $dbMigration->saveOrFail(); @@ -42,7 +43,7 @@ public function update( throw new MigrationsNotExist(); } - if ($this->isStatusValid($status)) { + if ((new MigrationStatus())->isMigrationStatusValid($status)) { $entity->status = $status; $entity->error = $error; } @@ -63,32 +64,16 @@ public function find(int $migrationStepId): ?\Triadev\EsMigration\Models\Entity\ ->first(); } - private function isStatusValid(int $status) : bool - { - $valid = [ - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, - self::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR - ]; - - if (in_array($status, $valid)) { - return true; - } - - return false; - } - private function dispatchStatus(\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStep $migration) { switch ($migration->status) { - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING: + case MigrationStatus::MIGRATION_STATUS_RUNNING: $event = new MigrationStepRunning($migration); break; - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE: + case MigrationStatus::MIGRATION_STATUS_DONE: $event = new MigrationStepDone($migration); break; - case self::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR: + case MigrationStatus::MIGRATION_STATUS_ERROR: $event = new MigrationStepError($migration); break; default: diff --git a/src/Business/Repository/ElasticsearchMigrationStepAlias.php b/src/Business/Repository/ElasticsearchMigrationStepAlias.php deleted file mode 100644 index 0ff5ef0..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepAlias.php +++ /dev/null @@ -1,39 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->add = json_encode($add); - $dbMigration->remove = json_encode($remove); - $dbMigration->remove_indices = json_encode($removeIndices); - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * @inheritdoc - */ - public function find(int $migrationStepId): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepAlias - { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepAlias::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Repository/ElasticsearchMigrationStepCreateIndex.php b/src/Business/Repository/ElasticsearchMigrationStepCreateIndex.php deleted file mode 100644 index 222b022..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepCreateIndex.php +++ /dev/null @@ -1,41 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->mappings = json_encode($mappings); - - if (is_array($settings)) { - $dbMigration->settings = json_encode($settings); - } - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * @inheritdoc - */ - public function find( - int $migrationStepId - ): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepCreateIndex { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepCreateIndex::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Repository/ElasticsearchMigrationStepDeleteByQuery.php b/src/Business/Repository/ElasticsearchMigrationStepDeleteByQuery.php deleted file mode 100644 index 34223af..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepDeleteByQuery.php +++ /dev/null @@ -1,40 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->query = json_encode($query); - $dbMigration->type = $type; - $dbMigration->options = json_encode($options); - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * @inheritdoc - */ - public function find( - int $migrationStepId - ): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepDeleteByQuery { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepDeleteByQuery::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Repository/ElasticsearchMigrationStepReindex.php b/src/Business/Repository/ElasticsearchMigrationStepReindex.php deleted file mode 100644 index 5dcfb65..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepReindex.php +++ /dev/null @@ -1,43 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->dest_index = $destIndex; - $dbMigration->refresh_source_index = $refreshSourceIndex; - $dbMigration->global = json_encode($global); - $dbMigration->source = json_encode($source); - $dbMigration->dest = json_encode($dest); - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * @inheritdoc - */ - public function find(int $migrationStepId): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepReindex - { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepReindex::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Repository/ElasticsearchMigrationStepUpdateByQuery.php b/src/Business/Repository/ElasticsearchMigrationStepUpdateByQuery.php deleted file mode 100644 index ce5fd88..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepUpdateByQuery.php +++ /dev/null @@ -1,42 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->query = json_encode($query); - $dbMigration->type = $type; - $dbMigration->script = is_array($script) ? json_encode($script): null; - $dbMigration->options = json_encode($options); - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * F@inheritdoc - */ - public function find( - int $migrationStepId - ): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateByQuery { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateByQuery::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Repository/ElasticsearchMigrationStepUpdateIndex.php b/src/Business/Repository/ElasticsearchMigrationStepUpdateIndex.php deleted file mode 100644 index b5cb2cb..0000000 --- a/src/Business/Repository/ElasticsearchMigrationStepUpdateIndex.php +++ /dev/null @@ -1,46 +0,0 @@ -migration_step_id = $migrationStepId; - $dbMigration->close_index = $closeIndex; - - if (is_array($mappings)) { - $dbMigration->mappings = json_encode($mappings); - } - - if (is_array($settings)) { - $dbMigration->settings = json_encode($settings); - } - - $dbMigration->saveOrFail(); - - return $dbMigration; - } - - /** - * @inheritdoc - */ - public function find( - int $migrationStepId - ): ?\Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateIndex { - return \Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateIndex::where( - 'migration_step_id', - $migrationStepId - )->first(); - } -} diff --git a/src/Business/Service/MigrationSteps.php b/src/Business/Service/MigrationSteps.php new file mode 100644 index 0000000..b314c43 --- /dev/null +++ b/src/Business/Service/MigrationSteps.php @@ -0,0 +1,64 @@ +migrationRepository = $migrationRepository; + $this->migrationStepRepository = $migrationStepRepository; + } + + /** + * Get migration steps + * + * @param string $migration + * @param bool $withoutDoneSteps + * @return MigrationStep[] + */ + public function getMigrationSteps(string $migration, bool $withoutDoneSteps = true) : array + { + $migrations = []; + + if ($migrationEntity = $this->migrationRepository->find($migration)) { + foreach ($migrationEntity->migrationSteps()->getResults() as $migrationStepEntity) { + /** @var ElasticsearchMigrationStep $migrationStepEntity */ + if ($withoutDoneSteps && + $migrationStepEntity->status == MigrationStatus::MIGRATION_STATUS_DONE) { + continue; + } + + $migrations[] = new MigrationStep( + $migrationStepEntity->id, + $migrationStepEntity->type, + $migrationStepEntity->status, + $migrationStepEntity->error, + json_decode($migrationStepEntity->params, true), + new \DateTime($migrationStepEntity->created_at), + new \DateTime($migrationStepEntity->updated_at) + ); + } + } + + return $migrations; + } +} diff --git a/src/Business/Validation/FieldDatatypeMigration.php b/src/Business/Validation/FieldDatatypeMigration.php deleted file mode 100644 index 7c66bdd..0000000 --- a/src/Business/Validation/FieldDatatypeMigration.php +++ /dev/null @@ -1,111 +0,0 @@ - [], - 'numeric' => ['string'], - 'date' => ['string'], - 'boolean' => ['string'], - 'binary' => [], - 'range' => [], - 'object' => [], - 'nested' => [], - 'geo_point' => [], - 'geo_shape' => [], - 'ip' => [], - 'completion' => [], - 'token_count' => [], - 'murmur3' => [], - 'attachment' => [], - 'percolator' => [] - ]; - - /** - * Validate - * - * @param array $esMapping - * @param array $migrationMapping - * - * @throws FieldDatatypeMigrationFailed - */ - public function validate(array $esMapping, array $migrationMapping) - { - $tmpEsMapping = array_dot($esMapping); - $tmpMigrationMapping = array_dot($migrationMapping); - - $failedFields = []; - - foreach ($tmpEsMapping as $key => $value) { - if (preg_match('/^.*type$/', $key) && array_key_exists($key, $tmpMigrationMapping)) { - $esMappingDatatype = $this->getFieldDatatype($tmpEsMapping[$key]); - $migrationMappingDatatype = $this->getFieldDatatype($tmpMigrationMapping[$key]); - - if ($esMappingDatatype == $migrationMappingDatatype) { - continue; - } - - if (!in_array($migrationMappingDatatype, $this->validMigrations[$esMappingDatatype])) { - $failedFields[] = $key; - continue; - } - } - } - - if (!empty($failedFields)) { - throw new FieldDatatypeMigrationFailed(json_encode($failedFields)); - } - } - - private function getFieldDatatype(string $datatype) : ?string - { - $datatypes = [ - 'string' => $this->string, - 'numeric' => $this->numeric, - 'date' => $this->date, - 'boolean' => $this->boolean, - 'binary' => $this->binary, - 'range' => $this->range, - 'object' => ['object'], - 'nested' => ['nested'], - 'geo_point' => ['geo_point'], - 'geo_shape' => ['geo_shape'], - 'ip' => ['ip'], - 'completion' => ['completion'], - 'token_count' => ['token_count'], - 'murmur3' => ['murmur3'], - 'attachment' => ['attachment'], - 'percolator' => ['percolator'] - ]; - - foreach ($datatypes as $key => $d) { - if (in_array($datatype, $d)) { - return $key; - } - } - - return null; - } -} diff --git a/src/Config/config.php b/src/Config/config.php deleted file mode 100644 index fd29f63..0000000 --- a/src/Config/config.php +++ /dev/null @@ -1,12 +0,0 @@ - env('ELASTICSEARCH_HOST', 'localhost'), - 'port' => env('ELASTICSEARCH_PORT', 9200), - 'scheme' => env('ELASTICSEARCH_SCHEME', 'https'), - 'user' => env('ELASTICSEARCH_USER', ''), - 'pass' => env('ELASTICSEARCH_PASS', ''), - 'migration' => [ - 'filePath' => null - ] -]; diff --git a/src/Console/Commands/ShowMigration.php b/src/Console/Commands/ShowMigration.php deleted file mode 100644 index 4c5df1c..0000000 --- a/src/Console/Commands/ShowMigration.php +++ /dev/null @@ -1,57 +0,0 @@ -argument('sortField'); - - $migrations = $elasticsearchMigrationStatusRepository->all([ - 'migration', - 'status', - 'created_at', - 'updated_at' - ]); - - switch ($this->argument('sortOrder')) { - case 'asc': - $migrations = $migrations->sortBy($sortField); - break; - case 'desc': - $migrations = $migrations->sortByDesc($sortField); - break; - default: - break; - } - - $this->table( - ['Migration', 'Status', 'Created', 'Updated'], - $migrations->toArray() - ); - } -} diff --git a/src/Console/Commands/StartMigration.php b/src/Console/Commands/StartMigration.php deleted file mode 100644 index 598fc43..0000000 --- a/src/Console/Commands/StartMigration.php +++ /dev/null @@ -1,42 +0,0 @@ -argument('versions')); - $source = $this->option('source'); - - foreach ($versions as $version) { - $elasticsearchMigration->migrate(trim($version), $source); - } - } -} diff --git a/src/Contract/ElasticsearchMigrationContract.php b/src/Contract/ElasticsearchMigrationContract.php index 4f840c4..a8b324e 100644 --- a/src/Contract/ElasticsearchMigrationContract.php +++ b/src/Contract/ElasticsearchMigrationContract.php @@ -1,23 +1,55 @@ STRING, + * 'status' => STRING, + * 'steps' => [ + * 'type' => STRING, + * 'status' => INTEGER, + * 'error' => STRING|NULL, + * 'created_at' => DATETIME, + * 'updated_at' => DATETIME + * ] + * ] + */ + public function getMigrationStatus(string $migration) : array; /** - * Migrate + * Start migration * - * @param string $version - * @param string $source + * @param string $migration + * @param ElasticsearchClients $elasticsearchClients * * @throws MigrationAlreadyDone - * @throws FieldDatatypeMigrationFailed * @throws \Throwable */ - public function migrate(string $version, string $source = self::MIGRATION_SOURCE_TYPE_FILE); + public function startMigration(string $migration, ElasticsearchClients $elasticsearchClients); } diff --git a/src/Contract/ElasticsearchMigrationDatabaseContract.php b/src/Contract/ElasticsearchMigrationDatabaseContract.php deleted file mode 100644 index 4e3e100..0000000 --- a/src/Contract/ElasticsearchMigrationDatabaseContract.php +++ /dev/null @@ -1,48 +0,0 @@ -bigIncrements('id'); $table->bigInteger('migration_id'); $table->string('type'); - $table->string('index'); $table->integer('status'); $table->text('error')->nullable(); + $table->text('params'); $table->timestamps(); $table->foreign('migration_id')->references('id')->on('triadev_elasticsearch_migration'); diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_alias_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_alias_table.php deleted file mode 100644 index ba15451..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_alias_table.php +++ /dev/null @@ -1,37 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('add'); - $table->string('remove'); - $table->string('remove_indices'); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_alias'); - } -} diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_create_index_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_create_index_table.php deleted file mode 100644 index 667dd3b..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_create_index_table.php +++ /dev/null @@ -1,36 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('mappings'); - $table->string('settings')->nullable(); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_create_index'); - } -} diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_delete_by_query_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_delete_by_query_table.php deleted file mode 100644 index bd2192e..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_delete_by_query_table.php +++ /dev/null @@ -1,37 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('query'); - $table->string('type')->nullable(); - $table->string('options'); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_delete_by_query'); - } -} diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_reindex_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_reindex_table.php deleted file mode 100644 index 948d4c9..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_reindex_table.php +++ /dev/null @@ -1,39 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('dest_index'); - $table->boolean('refresh_source_index'); - $table->string('global'); - $table->string('source'); - $table->string('dest'); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_reindex'); - } -} diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_by_query_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_by_query_table.php deleted file mode 100644 index 12e9386..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_by_query_table.php +++ /dev/null @@ -1,38 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('query'); - $table->string('type')->nullable(); - $table->string('script')->nullable(); - $table->string('options'); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_update_by_query'); - } -} diff --git a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_index_table.php b/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_index_table.php deleted file mode 100644 index a3f348c..0000000 --- a/src/Database/Migrations/2018_09_22_000001_create_elasticsearch_migrations_update_index_table.php +++ /dev/null @@ -1,37 +0,0 @@ -bigIncrements('id'); - $table->bigInteger('migration_step_id')->unique(); - $table->string('mappings')->nullable(); - $table->string('settings')->nullable(); - $table->boolean('close_index'); - $table->timestamps(); - - $table->foreign('migration_step_id')->references('migration_id')->on('triadev_elasticsearch_migration_steps'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('triadev_elasticsearch_migration_step_update_index'); - } -} diff --git a/src/ElasticsearchMigration.php b/src/ElasticsearchMigration.php index bbf1d32..9f348e5 100644 --- a/src/ElasticsearchMigration.php +++ b/src/ElasticsearchMigration.php @@ -1,199 +1,202 @@ esClient = $this->buildElasticsearchClient(); - - $this->filePathMigrations = config('triadev-elasticsearch-migration.migration.filePath'); - $this->migrationRepository = app(EsMigrationRepositoryInterface::class); $this->migrationStepRepository = app(EsMigrationStepRepositoryInterface::class); + $this->migrationStepService = app(MigrationSteps::class); } - private function buildElasticsearchClient() : Client + /** + * @inheritdoc + */ + public function createMigration(string $migration): bool { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); + try { + $this->migrationRepository->createOrUpdate($migration); + } catch (\Throwable $e) { + return false; + } - return $clientBuilder->build(); + return true; } /** * @inheritdoc */ - public function migrate(string $version, string $source = 'file') + public function addMigrationStep(string $migration, string $type, array $params = []) : bool { - $this->checkIfMigrationAlreadyRunning($version); + if (!(new MigrationTypes())->isMigrationTypeValid($type)) { + return false; + } try { - $updateMigrationStepStatus = $source == self::MIGRATION_SOURCE_TYPE_DATABASE ? true : false; - - if (!empty($migrations = $this->getMigrations($version, $source))) { - foreach ($migrations as $migrationStepId => $migration) { - $this->startMigrationStep( - $migration, - $updateMigrationStepStatus ? $migrationStepId : null - ); - } - - $this->migrationRepository->createOrUpdate( - $version, - EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); + if ($migration = $this->migrationRepository->find($migration)) { + $this->migrationStepRepository->create($migration->id, $type, $params); + return true; } - } catch (\Exception $e) { - $this->migrationRepository->createOrUpdate( - $version, - EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ); - - throw $e; + } catch (\Throwable $e) { + return false; } + + return false; } /** - * @param string $version - * @throws MigrationAlreadyDone + * @inheritdoc */ - private function checkIfMigrationAlreadyRunning(string $version) + public function getMigrationStatus(string $migration) : array { - $migration = $this->migrationRepository->find($version); + $migrationSteps = []; - if ($migration instanceof ElasticsearchMigrationEntity && - $migration->status == EsMigrationRepositoryInterface::ELASTICSEARCH_MIGRATION_STATUS_DONE) { - throw new MigrationAlreadyDone(); + $status = null; + + if ($migrationEntity = $this->migrationRepository->find($migration)) { + $status = $migrationEntity->status; + + foreach ($migrationEntity->migrationSteps()->cursor() as $migrationStep) { + /** @var ElasticsearchMigrationStep $migrationStep */ + $migrationSteps[] = array_except($migrationStep->toArray(), [ + 'id', + 'migration_id' + ]); + } } + + return [ + 'migration' => $migration, + 'status' => $status, + 'steps' => $migrationSteps + ]; } /** - * @param string $version - * @param string $source - * @return array + * @inheritdoc */ - private function getMigrations(string $version, string $source) : array + public function startMigration(string $migration, ElasticsearchClients $elasticsearchClients) { - if ($source == self::MIGRATION_SOURCE_TYPE_FILE) { - return require sprintf("%s/%s/migrations.php", $this->filePathMigrations, $version); - } elseif ($source == self::MIGRATION_SOURCE_TYPE_DATABASE) { - /** @var ElasticsearchMigrationDatabaseContract $elasticsearchDatabaseService */ - $elasticsearchDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - return $elasticsearchDatabaseService->getMigration($version); - } + $this->checkIfMigrationAlreadyRunning($migration); - return []; + try { + $migrationSteps = $this->migrationStepService->getMigrationSteps($migration, true); + + if (!empty($migrationSteps)) { + $this->migrationRepository->createOrUpdate($migration, MigrationStatus::MIGRATION_STATUS_RUNNING); + + foreach ($migrationSteps as $migrationStep) { + $this->startMigrationStep($migrationStep, $elasticsearchClients); + } + + $this->migrationRepository->createOrUpdate($migration, MigrationStatus::MIGRATION_STATUS_DONE); + } + } catch (\Exception $e) { + $this->migrationRepository->createOrUpdate( + $migration, + MigrationStatus::MIGRATION_STATUS_ERROR, + $e->getMessage() + ); + + throw $e; + } } - /** - * @param $migration - * @param int|null $migrationStepId - * @throws Exception\MigrationsNotExist - * @throws \Throwable - */ - private function startMigrationStep($migration, ?int $migrationStepId = null) + private function checkIfMigrationAlreadyRunning(string $migration) { + $migrationEntity = $this->migrationRepository->find($migration); + + if ($migrationEntity instanceof ElasticsearchMigrationEntity && + $migrationEntity->status == MigrationStatus::MIGRATION_STATUS_DONE) { + throw new MigrationAlreadyDone(); + } + } + + private function startMigrationStep( + MigrationStep $migrationStep, + ElasticsearchClients $elasticsearchClients + ) { try { - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING - ); - } + $this->migrationStepRepository->update($migrationStep->getId(), MigrationStatus::MIGRATION_STATUS_RUNNING); - switch (get_class($migration)) { - case CreateIndexModel::class: - (new CreateIndex())->migrate($this->esClient, $migration); - break; - case UpdateIndexModel::class: - (new UpdateIndex())->migrate($this->esClient, $migration); - break; - case DeleteIndexModel::class: - (new DeleteIndex())->migrate($this->esClient, $migration); - break; - case AliasModel::class: - (new Alias())->migrate($this->esClient, $migration); - break; - case DeleteByQueryModel::class: - (new DeleteByQuery())->migrate($this->esClient, $migration); - break; - case UpdateByQueryModel::class: - (new UpdateByQuery())->migrate($this->esClient, $migration); - break; - case ReindexModel::class: - (new Reindex())->migrate($this->esClient, $migration); - break; - default: - break; + foreach ($elasticsearchClients->all() as $elasticsearchClient) { + $migrationClass = null; + + switch ($migrationStep->getType()) { + case MigrationTypes::MIGRATION_TYPE_CREATE_INDEX: + $migrationClass = new CreateIndex(); + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING: + $migrationClass = new UpdateIndexMapping(); + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_SETTING: + $migrationClass = new UpdateIndexSetting(); + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_INDEX: + $migrationClass = new DeleteIndex(); + break; + case MigrationTypes::MIGRATION_TYPE_PUT_ALIAS: + $migrationClass = new PutAlias(); + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_ALIAS: + $migrationClass = new DeleteAlias(); + break; + case MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY: + $migrationClass = new DeleteByQuery(); + break; + case MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY: + $migrationClass = new UpdateByQuery(); + break; + case MigrationTypes::MIGRATION_TYPE_REINDEX: + $migrationClass = new Reindex(); + break; + default: + break; + } + + if ($migrationClass instanceof AbstractMigration) { + $migrationClass->migrate($elasticsearchClient, $migrationStep); + } } + + $this->migrationStepRepository->update($migrationStep->getId(), MigrationStatus::MIGRATION_STATUS_DONE); } catch (\Exception $e) { - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR - ); - } else { - throw $e; - } - } - - if ($migrationStepId) { - $this->migrationStepRepository->update( - $migrationStepId, - ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE - ); + $this->migrationStepRepository->update($migrationStep->getId(), MigrationStatus::MIGRATION_STATUS_ERROR); } } } diff --git a/src/ElasticsearchMigrationDatabase.php b/src/ElasticsearchMigrationDatabase.php deleted file mode 100644 index 354d8d2..0000000 --- a/src/ElasticsearchMigrationDatabase.php +++ /dev/null @@ -1,384 +0,0 @@ -elasticsearchMigrationRepository = $elasticsearchMigrationRepository; - $this->elasticsearchMigrationStepRepository = $elasticsearchMigrationStepRepository; - } - - /** - * @inheritdoc - */ - public function createMigration(string $migration): bool - { - try { - $this->elasticsearchMigrationRepository->createOrUpdate($migration); - } catch (\Throwable $e) { - return false; - } - - return true; - } - - /** - * @inheritdoc - */ - public function addMigration(string $migration, string $type, string $index, array $params = []) : bool - { - if (!$this->isMigrationTypeIsValid($type)) { - return false; - } - - try { - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - $migrationStep = $this->elasticsearchMigrationStepRepository->create( - $dbMigration->id, - $type, - $index - ); - - switch ($type) { - case self::MIGRATION_TYPE_CREATE_INDEX: - $this->createIndexMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_UPDATE_INDEX: - $this->updateIndexMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_DELETE_INDEX: - break; - case self::MIGRATION_TYPE_ALIAS: - $this->aliasMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_DELETE_BY_QUERY: - $this->deleteByQueryMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_UPDATE_BY_QUERY: - $this->updateByQueryMigration($migrationStep->id, $params); - break; - case self::MIGRATION_TYPE_REINDEX: - $this->reindexMigration($migrationStep->id, $params); - break; - default: - break; - } - - return true; - } - } catch (\Throwable $e) { - return false; - } - - return false; - } - - /** - * Get migration - * - * @param string $migration - * @return array - */ - public function getMigration(string $migration) : array - { - $migrations = []; - - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - foreach ($dbMigration->migrationSteps()->getResults() as $dbMigrationStep) { - /** @var ElasticsearchMigrationStep $dbMigrationStep */ - - if ($dbMigrationStep->status == ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE) { - continue; - } - - if ($migrationByType = $dbMigrationStep->migrationByType()) { - $migrationByType = is_object($migrationByType) ? $migrationByType->first() : $migrationByType; - - $index = $dbMigrationStep->index; - - switch ($dbMigrationStep->type) { - case self::MIGRATION_TYPE_CREATE_INDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepCreateIndex) { - $settings = $migrationByType->settings; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::createIndex( - $index, - json_decode($migrationByType->mappings, true), - $settings != null ? json_decode($settings, true) : null - ); - } - break; - case self::MIGRATION_TYPE_UPDATE_INDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepUpdateIndex) { - $mappings = $migrationByType->mappings; - $settings = $migrationByType->settings; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::updateIndex( - $index, - $mappings != null ? json_decode($mappings, true) : null, - $settings != null ? json_decode($settings, true) : null, - (bool)$migrationByType->getAttribute('close_index') - ); - } - break; - case self::MIGRATION_TYPE_DELETE_INDEX: - $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteIndex($index); - break; - case self::MIGRATION_TYPE_ALIAS: - if ($migrationByType instanceof ElasticsearchMigrationStepAlias) { - $add = $migrationByType->add; - $remove = $migrationByType->remove; - $removeIndices = $migrationByType->remove_indices; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::alias( - $index, - $add != null ? json_decode($add, true) : null, - $remove != null ? json_decode($remove, true) : null, - $removeIndices != null ? json_decode($removeIndices, true) : null - ); - } - break; - case self::MIGRATION_TYPE_DELETE_BY_QUERY: - if ($migrationByType instanceof ElasticsearchMigrationStepDeleteByQuery) { - $migrations[$dbMigrationStep->id] = MigrationBuilder::deleteByQuery( - $index, - json_decode($migrationByType->query, true), - $migrationByType->type, - json_decode($migrationByType->options, true) - ); - } - break; - case self::MIGRATION_TYPE_UPDATE_BY_QUERY: - if ($migrationByType instanceof ElasticsearchMigrationStepUpdateByQuery) { - $script = $migrationByType->script; - - $migrations[$dbMigrationStep->id] = MigrationBuilder::updateByQuery( - $index, - json_decode($migrationByType->query, true), - $migrationByType->type, - $script != null ? json_decode($script, true) : null, - json_decode($migrationByType->options, true) - ); - } - break; - case self::MIGRATION_TYPE_REINDEX: - if ($migrationByType instanceof ElasticsearchMigrationStepReindex) { - $migrations[$dbMigrationStep->id] = MigrationBuilder::reindex( - $index, - $migrationByType->dest_index, - (bool)$migrationByType->refresh_source_index, - json_decode($migrationByType->global, true), - json_decode($migrationByType->source, true), - json_decode($migrationByType->dest, true) - ); - } - break; - default: - break; - } - } - } - } - - return $migrations; - } - - /** - * Get migration steps - * - * @param string $migration - * @return array - */ - public function getMigrationSteps(string $migration) : array - { - $migrationSteps = []; - - if ($dbMigration = $this->elasticsearchMigrationRepository->find($migration)) { - $dbMigrationSteps = $dbMigration->migrationSteps(); - - foreach ($dbMigrationSteps->cursor() as $dbMigrationStep) { - /** @var ElasticsearchMigrationStep $dbMigrationStep */ - - if ($dbMigrationStep->status == ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE) { - continue; - } - - $migrationSteps[] = array_except($dbMigrationStep->toArray(), [ - 'id', - 'migration_id' - ]); - } - } - - return $migrationSteps; - } - - private function isMigrationTypeIsValid(string $type) : bool - { - if (in_array($type, [ - self::MIGRATION_TYPE_CREATE_INDEX, - self::MIGRATION_TYPE_UPDATE_INDEX, - self::MIGRATION_TYPE_DELETE_INDEX, - self::MIGRATION_TYPE_ALIAS, - self::MIGRATION_TYPE_DELETE_BY_QUERY, - self::MIGRATION_TYPE_UPDATE_BY_QUERY, - self::MIGRATION_TYPE_REINDEX, - ])) { - return true; - } - - return false; - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function createIndexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepCreateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'mappings'), - array_get($params, 'settings') - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function updateIndexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepUpdateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - - $closeIndex = array_get($params, 'closeIndex'); - if (!$closeIndex) { - $closeIndex = false; - } - - $repository->create( - $migrationStepId, - array_get($params, 'mappings'), - array_get($params, 'settings'), - $closeIndex - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function aliasMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepAliasContract $repository */ - $repository = app(ElasticsearchMigrationStepAliasContract::class); - - $repository->create( - $migrationStepId, - array_has($params, 'add') ? array_get($params, 'add') : [], - array_has($params, 'remove') ? array_get($params, 'remove') : [], - array_has($params, 'removeIndices') ? array_get($params, 'removeIndices') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function deleteByQueryMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepDeleteByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'query'), - array_get($params, 'type'), - array_has($params, 'options') ? array_get($params, 'options') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function updateByQueryMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepUpdateByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - - $repository->create( - $migrationStepId, - array_get($params, 'query'), - array_get($params, 'type'), - array_get($params, 'script'), - array_has($params, 'options') ? array_get($params, 'options') : [] - ); - } - - /** - * @param int $migrationStepId - * @param array $params - * @throws \Throwable - */ - private function reindexMigration(int $migrationStepId, array $params) - { - /** @var ElasticsearchMigrationStepReindexContract $repository */ - $repository = app(ElasticsearchMigrationStepReindexContract::class); - - $refreshSourceIndex = array_get($params, 'refreshSourceIndex'); - if (!$refreshSourceIndex) { - $refreshSourceIndex = false; - } - - $repository->create( - $migrationStepId, - array_get($params, 'destIndex'), - $refreshSourceIndex, - array_has($params, 'global') ? array_get($params, 'global') : [], - array_has($params, 'source') ? array_get($params, 'source') : [], - array_has($params, 'dest') ? array_get($params, 'dest') : [] - ); - } -} diff --git a/src/Exception/FieldDatatypeMigrationFailed.php b/src/Exception/FieldDatatypeMigrationFailed.php deleted file mode 100644 index e39400c..0000000 --- a/src/Exception/FieldDatatypeMigrationFailed.php +++ /dev/null @@ -1,18 +0,0 @@ -add; - } - - /** - * @param array $add - */ - public function setAdd(array $add): void - { - $this->add = $add; - } - - /** - * @return array - */ - public function getRemove(): array - { - return $this->remove; - } - - /** - * @param array $remove - */ - public function setRemove(array $remove): void - { - $this->remove = $remove; - } - - /** - * @return array - */ - public function getRemoveIndex(): array - { - return $this->removeIndex; - } - - /** - * @param array $removeIndex - */ - public function setRemoveIndex(array $removeIndex): void - { - $this->removeIndex = $removeIndex; - } -} diff --git a/src/Models/Entity/ElasticsearchMigrationStep.php b/src/Models/Entity/ElasticsearchMigrationStep.php index 9a78b29..36382e3 100644 --- a/src/Models/Entity/ElasticsearchMigrationStep.php +++ b/src/Models/Entity/ElasticsearchMigrationStep.php @@ -2,15 +2,16 @@ namespace Triadev\EsMigration\Models\Entity; use Illuminate\Database\Eloquent\Model; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; /** * @property integer $id * @property integer $migration_id * @property string $type - * @property string $index * @property integer $status * @property string|null $error + * @property string $params + * @property string $created_at + * @property string $updated_at */ class ElasticsearchMigrationStep extends Model { @@ -20,40 +21,4 @@ class ElasticsearchMigrationStep extends Model * @var string */ protected $table = 'triadev_elasticsearch_migration_step'; - - /** - * Get migration by type - * - * @return \Illuminate\Database\Eloquent\Relations\HasOne|string(deleteIndex)|null - */ - public function migrationByType() - { - switch ($this->getAttribute('type')) { - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_CREATE_INDEX: - return $this->hasOne(ElasticsearchMigrationStepCreateIndex::class, 'migration_step_id'); - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_UPDATE_INDEX: - return $this->hasOne(ElasticsearchMigrationStepUpdateIndex::class, 'migration_step_id'); - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_INDEX: - return ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_INDEX; - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_ALIAS: - return $this->hasOne(ElasticsearchMigrationStepAlias::class, 'migration_step_id'); - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_DELETE_BY_QUERY: - return $this->hasOne(ElasticsearchMigrationStepDeleteByQuery::class, 'migration_step_id'); - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_UPDATE_BY_QUERY: - return $this->hasOne(ElasticsearchMigrationStepUpdateByQuery::class, 'migration_step_id'); - break; - case ElasticsearchMigrationDatabaseContract::MIGRATION_TYPE_REINDEX: - return $this->hasOne(ElasticsearchMigrationStepReindex::class, 'migration_step_id'); - break; - default: - break; - } - - return null; - } } diff --git a/src/Models/Entity/ElasticsearchMigrationStepAlias.php b/src/Models/Entity/ElasticsearchMigrationStepAlias.php deleted file mode 100644 index 9786c87..0000000 --- a/src/Models/Entity/ElasticsearchMigrationStepAlias.php +++ /dev/null @@ -1,20 +0,0 @@ -index = $index; - } - - /** - * @return string - */ - public function getIndex(): string - { - return $this->index; - } - - /** - * @param string $index - */ - public function setIndex(string $index) - { - $this->index = $index; - } - - /** - * @return string|null - */ - public function getType(): ?string - { - return $this->type; - } - - /** - * @param string|null $type - */ - public function setType(?string $type) - { - $this->type = $type; - } - - /** - * @return array|null - */ - public function getMappings(): ?array - { - return $this->mappings; - } - - /** - * @param array|null $mappings - */ - public function setMappings(?array $mappings) - { - $this->mappings= $mappings; - } - - /** - * @return array|null - */ - public function getSettings(): ?array - { - return $this->settings; - } - - /** - * @param array|null $settings - */ - public function setSettings(?array $settings): void - { - $this->settings = $settings; - } - - /** - * @return bool - */ - public function isCloseIndex(): bool - { - return $this->closeIndex; - } - - /** - * @param bool $closeIndex - */ - public function setCloseIndex(bool $closeIndex): void - { - $this->closeIndex = $closeIndex; - } - - /** - * @return null|Alias - */ - public function getAlias(): ?Alias - { - return $this->alias; - } - - /** - * @param null|Alias $alias - */ - public function setAlias(?Alias $alias): void - { - $this->alias = $alias; - } - - /** - * @return null|Reindex - */ - public function getReindex(): ?Reindex - { - return $this->reindex; - } - - /** - * @param null|Reindex $reindex - */ - public function setReindex(?Reindex $reindex): void - { - $this->reindex = $reindex; - } - - /** - * @return array|null - */ - public function getDeleteByQuery(): ?array - { - return $this->deleteByQuery; - } - - /** - * @param array|null $deleteByQuery - */ - public function setDeleteByQuery(?array $deleteByQuery): void - { - $this->deleteByQuery = $deleteByQuery; - } - - /** - * @return array|null - */ - public function getUpdateByQuery(): ?array - { - return $this->updateByQuery; - } - - /** - * @param array|null $updateByQuery - */ - public function setUpdateByQuery(?array $updateByQuery): void - { - $this->updateByQuery = $updateByQuery; - } -} diff --git a/src/Models/MigrationStep.php b/src/Models/MigrationStep.php new file mode 100644 index 0000000..42ecb2d --- /dev/null +++ b/src/Models/MigrationStep.php @@ -0,0 +1,110 @@ +id = $id; + $this->type = $type; + $this->status = $status; + $this->error = $error; + $this->params = $params; + $this->createdAt = $createdAt; + $this->updatedAt = $updatedAt; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * @return int + */ + public function getStatus(): int + { + return $this->status; + } + + /** + * @return string + */ + public function getError(): string + { + return $this->error; + } + + /** + * @return array + */ + public function getParams(): array + { + return $this->params; + } + + /** + * @return \DateTime + */ + public function getCreatedAt(): \DateTime + { + return $this->createdAt; + } + + /** + * @return \DateTime + */ + public function getUpdatedAt(): \DateTime + { + return $this->updatedAt; + } +} diff --git a/src/Models/Migrations/Alias.php b/src/Models/Migrations/Alias.php deleted file mode 100644 index 32585df..0000000 --- a/src/Models/Migrations/Alias.php +++ /dev/null @@ -1,80 +0,0 @@ -add; - } - - /** - * @param array $add - * @return Alias - */ - public function setAdd(array $add): Alias - { - $this->add = $add; - - return $this; - } - - /** - * @return array - */ - public function getRemove(): array - { - return $this->remove; - } - - /** - * @param array $remove - * @return Alias - */ - public function setRemove(array $remove): Alias - { - $this->remove = $remove; - - return $this; - } - - /** - * @return array - */ - public function getRemoveIndices(): array - { - return $this->removeIndices; - } - - /** - * @param array $removeIndices - * @return Alias - */ - public function setRemoveIndices(array $removeIndices): Alias - { - $this->removeIndices = $removeIndices; - - return $this; - } -} diff --git a/src/Models/Migrations/CreateIndex.php b/src/Models/Migrations/CreateIndex.php deleted file mode 100644 index 91c7709..0000000 --- a/src/Models/Migrations/CreateIndex.php +++ /dev/null @@ -1,50 +0,0 @@ -mappings = $mappings; - } - - /** - * @return array - */ - public function getMappings(): array - { - return $this->mappings; - } - - /** - * @return array|null - */ - public function getSettings(): ?array - { - return $this->settings; - } - - /** - * @param array|null $settings - * @return CreateIndex - */ - public function setSettings(?array $settings): CreateIndex - { - $this->settings = $settings; - - return $this; - } -} diff --git a/src/Models/Migrations/DeleteByQuery.php b/src/Models/Migrations/DeleteByQuery.php deleted file mode 100644 index 1022407..0000000 --- a/src/Models/Migrations/DeleteByQuery.php +++ /dev/null @@ -1,77 +0,0 @@ -query = $query; - } - - /** - * @return array - */ - public function getQuery(): array - { - return $this->query; - } - - /** - * @return null|string - */ - public function getType(): ?string - { - return $this->type; - } - - /** - * @param null|string $type - * - * @return DeleteByQuery - */ - public function setType(?string $type): DeleteByQuery - { - $this->type = $type; - - return $this; - } - - /** - * @return array - */ - public function getOptions(): array - { - return $this->options; - } - - /** - * @param array $options [ - * KEY => VALUE, - * ... - * ] - * - * @return DeleteByQuery - */ - public function setOptions(array $options): DeleteByQuery - { - $this->options = $options; - - return $this; - } -} diff --git a/src/Models/Migrations/DeleteIndex.php b/src/Models/Migrations/DeleteIndex.php deleted file mode 100644 index a69e52c..0000000 --- a/src/Models/Migrations/DeleteIndex.php +++ /dev/null @@ -1,14 +0,0 @@ -index = $index; - } - - /** - * @return string - */ - public function getIndex(): string - { - return $this->index; - } -} diff --git a/src/Models/Migrations/Reindex.php b/src/Models/Migrations/Reindex.php deleted file mode 100644 index 13a99ad..0000000 --- a/src/Models/Migrations/Reindex.php +++ /dev/null @@ -1,116 +0,0 @@ -destIndex = $destIndex; - } - - /** - * @return string - */ - public function getDestIndex(): string - { - return $this->destIndex; - } - - /** - * @return bool - */ - public function isRefreshSourceIndex(): bool - { - return $this->refreshSourceIndex; - } - - /** - * @param bool $refreshSourceIndex - * @return Reindex - */ - public function setRefreshSourceIndex(bool $refreshSourceIndex): Reindex - { - $this->refreshSourceIndex = $refreshSourceIndex; - - return $this; - } - - /** - * @return array - */ - public function getGlobal(): array - { - return $this->global; - } - - /** - * @param array $global - * @return Reindex - */ - public function setGlobal(array $global): Reindex - { - $this->global = $global; - - return $this; - } - - /** - * @return array - */ - public function getSource(): array - { - return $this->source; - } - - /** - * @param array $source - * @return Reindex - */ - public function setSource(array $source): Reindex - { - $this->source = $source; - - return $this; - } - - /** - * @return array - */ - public function getDest(): array - { - return $this->dest; - } - - /** - * @param array $dest - * @return Reindex - */ - public function setDest(array $dest): Reindex - { - $this->dest = $dest; - - return $this; - } -} diff --git a/src/Models/Migrations/UpdateByQuery.php b/src/Models/Migrations/UpdateByQuery.php deleted file mode 100644 index ba60e9d..0000000 --- a/src/Models/Migrations/UpdateByQuery.php +++ /dev/null @@ -1,100 +0,0 @@ -query = $query; - } - - /** - * @return array - */ - public function getQuery(): array - { - return $this->query; - } - - /** - * @return null|string - */ - public function getType(): ?string - { - return $this->type; - } - - /** - * @param null|string $type - * - * @return UpdateByQuery - */ - public function setType(?string $type): UpdateByQuery - { - $this->type = $type; - - return $this; - } - - /** - * @return array|null - */ - public function getScript(): ?array - { - return $this->script; - } - - /** - * @param array|null $script - * - * @return UpdateByQuery - */ - public function setScript(?array $script): UpdateByQuery - { - $this->script = $script; - - return $this; - } - - /** - * @return array - */ - public function getOptions(): array - { - return $this->options; - } - - /** - * @param array $options [ - * KEY => VALUE, - * ... - * ] - * - * @return UpdateByQuery - */ - public function setOptions(array $options): UpdateByQuery - { - $this->options = $options; - - return $this; - } -} diff --git a/src/Models/Migrations/UpdateIndex.php b/src/Models/Migrations/UpdateIndex.php deleted file mode 100644 index a4f5170..0000000 --- a/src/Models/Migrations/UpdateIndex.php +++ /dev/null @@ -1,80 +0,0 @@ -mappings; - } - - /** - * @param array|null $mappings - * @return UpdateIndex - */ - public function setMappings(?array $mappings): UpdateIndex - { - $this->mappings = $mappings; - - return $this; - } - - /** - * @return array|null - */ - public function getSettings(): ?array - { - return $this->settings; - } - - /** - * @param array|null $settings - * @return UpdateIndex - */ - public function setSettings(?array $settings): UpdateIndex - { - $this->settings = $settings; - - return $this; - } - - /** - * @return bool - */ - public function isCloseIndex(): bool - { - return $this->closeIndex; - } - - /** - * @param bool $closeIndex - * @return UpdateIndex - */ - public function setCloseIndex(bool $closeIndex): UpdateIndex - { - $this->closeIndex = $closeIndex; - - return $this; - } -} diff --git a/src/Models/Reindex.php b/src/Models/Reindex.php deleted file mode 100644 index 89b223f..0000000 --- a/src/Models/Reindex.php +++ /dev/null @@ -1,101 +0,0 @@ -index = $index; - } - - /** - * @return string - */ - public function getIndex(): string - { - return $this->index; - } - - /** - * @return bool - */ - public function isRefresh(): bool - { - return $this->refresh; - } - - /** - * @param bool $refresh - */ - public function setRefresh(bool $refresh): void - { - $this->refresh = $refresh; - } - - /** - * @return array - */ - public function getGlobal(): array - { - return $this->global; - } - - /** - * @param array $global - */ - public function setGlobal(array $global): void - { - $this->global = $global; - } - - /** - * @return array - */ - public function getSource(): array - { - return $this->source; - } - - /** - * @param array $source - */ - public function setSource(array $source): void - { - $this->source = $source; - } - - /** - * @return array - */ - public function getDest(): array - { - return $this->dest; - } - - /** - * @param array $dest - */ - public function setDest(array $dest): void - { - $this->dest = $dest; - } -} diff --git a/src/Provider/ElasticsearchMigrationServiceProvider.php b/src/Provider/ElasticsearchMigrationServiceProvider.php index cf9c7bf..9f2d167 100644 --- a/src/Provider/ElasticsearchMigrationServiceProvider.php +++ b/src/Provider/ElasticsearchMigrationServiceProvider.php @@ -2,12 +2,8 @@ namespace Triadev\EsMigration\Provider; use Illuminate\Support\ServiceProvider; -use Triadev\EsMigration\Console\Commands\ShowMigration; -use Triadev\EsMigration\Console\Commands\StartMigration; use Triadev\EsMigration\Contract\ElasticsearchMigrationContract; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; use Triadev\EsMigration\ElasticsearchMigration; -use Triadev\EsMigration\ElasticsearchMigrationDatabase; class ElasticsearchMigrationServiceProvider extends ServiceProvider { @@ -18,23 +14,8 @@ class ElasticsearchMigrationServiceProvider extends ServiceProvider */ public function boot() { - $source = realpath(__DIR__ . '/../Config/config.php'); - - $this->publishes([ - __DIR__ . '/../Config/config.php' => config_path('triadev-elasticsearch-migration.php'), - ], 'config'); - - $this->mergeConfigFrom($source, 'triadev-elasticsearch-migration'); - $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); - if ($this->app->runningInConsole()) { - $this->commands([ - StartMigration::class, - ShowMigration::class - ]); - } - $this->app->bind( \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class, function () { @@ -52,60 +33,6 @@ function () { ); } ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepCreateIndexContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepCreateIndex::class - ); - } - ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepUpdateIndexContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepUpdateIndex::class - ); - } - ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepAliasContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepAlias::class - ); - } - ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepDeleteByQueryContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepDeleteByQuery::class - ); - } - ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepUpdateByQueryContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepUpdateByQuery::class - ); - } - ); - - $this->app->bind( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepReindexContract::class, - function () { - return app()->make( - \Triadev\EsMigration\Business\Repository\ElasticsearchMigrationStepReindex::class - ); - } - ); } /** @@ -118,9 +45,5 @@ public function register() $this->app->singleton(ElasticsearchMigrationContract::class, function () { return app()->make(ElasticsearchMigration::class); }); - - $this->app->singleton(ElasticsearchMigrationDatabaseContract::class, function () { - return app()->make(ElasticsearchMigrationDatabase::class); - }); } } diff --git a/tests/Resources/Migrations/1.0.0/migrations.php b/tests/Resources/Migrations/1.0.0/migrations.php deleted file mode 100644 index d7d93e0..0000000 --- a/tests/Resources/Migrations/1.0.0/migrations.php +++ /dev/null @@ -1,55 +0,0 @@ - [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'phpunit', - [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ), - \Triadev\EsMigration\Business\Factory\MigrationBuilder::updateIndex( - 'phpunit', - null, - [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - true - ) -]; diff --git a/tests/Resources/Migrations/1.0.1/migrations.php b/tests/Resources/Migrations/1.0.1/migrations.php deleted file mode 100644 index c1eaee3..0000000 --- a/tests/Resources/Migrations/1.0.1/migrations.php +++ /dev/null @@ -1,20 +0,0 @@ - [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ], - [ - 'refresh_interval' => "30s" - ] - ) -]; diff --git a/tests/Resources/Migrations/add_alias/migrations.php b/tests/Resources/Migrations/add_alias/migrations.php deleted file mode 100644 index f15d418..0000000 --- a/tests/Resources/Migrations/add_alias/migrations.php +++ /dev/null @@ -1,10 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'phpunit', - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/tests/Resources/Migrations/delete_index/migrations.php b/tests/Resources/Migrations/delete_index/migrations.php deleted file mode 100644 index 7dce442..0000000 --- a/tests/Resources/Migrations/delete_index/migrations.php +++ /dev/null @@ -1,5 +0,0 @@ - [ - 'properties' => [ - 'title' => [ - 'type' => 'integer' - ], - 'count' => [ - 'type' => 'text' - ], - 'description' => [ - 'type' => 'integer' - ] - ] - ] - ] - ) -]; diff --git a/tests/Resources/Migrations/reindex/migrations.php b/tests/Resources/Migrations/reindex/migrations.php deleted file mode 100644 index 5c6c7bf..0000000 --- a/tests/Resources/Migrations/reindex/migrations.php +++ /dev/null @@ -1,9 +0,0 @@ - [ - 'title' => 'Title' - ] - ], - 'phpunit', - [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - [ - 'conflicts' => 'proceed' - ] - ) -]; diff --git a/tests/TestCase.php b/tests/TestCase.php index 0521cc3..dda80c6 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -44,17 +44,6 @@ protected function getEnvironmentSetUp($app) 'database' => ':memory:', 'prefix' => '', ]); - - $app['config']->set('triadev-elasticsearch-migration', [ - 'host' => 'localhost', - 'port' => env('ELASTICSEARCH_PORT', 9222), - 'scheme' => 'http', - 'user' => '', - 'pass' => '', - 'migration' => [ - 'filePath' => __DIR__ . '/Resources/Migrations' - ] - ]); } /** diff --git a/tests/integration/Business/Migration/CreateIndexTest.php b/tests/integration/Business/Migration/CreateIndexTest.php new file mode 100644 index 0000000..2449c7d --- /dev/null +++ b/tests/integration/Business/Migration/CreateIndexTest.php @@ -0,0 +1,133 @@ +migration = new CreateIndex(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if ($client->exists(['index' => 'index'])) { + $client->delete(['index' => 'index']); + } + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_already_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->create(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $this->assertFalse( + $this->elasticsearchClients->get('phpunit') + ->indices() + ->exists(['index' => 'index']) + ); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + + $this->assertTrue( + $this->elasticsearchClients->get('phpunit') + ->indices() + ->exists(['index' => 'index']) + ); + } + + private function getValidPayload() : array + { + return [ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]; + } +} diff --git a/tests/integration/Business/Migration/DeleteAliasTest.php b/tests/integration/Business/Migration/DeleteAliasTest.php new file mode 100644 index 0000000..851896f --- /dev/null +++ b/tests/integration/Business/Migration/DeleteAliasTest.php @@ -0,0 +1,160 @@ +migration = new DeleteAlias(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if ($client->exists(['index' => 'index'])) { + $client->delete(['index' => 'index']); + } + + $client->create([ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]); + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_not_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->delete(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index' + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_alias_not_exist() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'name' => 'Alias' + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $esClient = $this->elasticsearchClients->get('phpunit'); + + $esClient->indices()->putAlias([ + 'index' => 'index', + 'name' => 'Alias' + ]); + + $this->assertTrue($esClient->indices()->existsAlias([ + 'index' => 'index', + 'name' => 'Alias' + ])); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'name' => 'Alias' + ], + new \DateTime(), + new \DateTime() + )); + + $this->assertFalse($esClient->indices()->existsAlias([ + 'index' => 'index', + 'name' => 'Alias' + ])); + } +} diff --git a/tests/integration/Business/Migration/DeleteIndexTest.php b/tests/integration/Business/Migration/DeleteIndexTest.php new file mode 100644 index 0000000..de268ae --- /dev/null +++ b/tests/integration/Business/Migration/DeleteIndexTest.php @@ -0,0 +1,126 @@ +migration = new DeleteIndex(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if (!$client->exists(['index' => 'index'])) { + $client->create([ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]); + } + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_not_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->delete(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index' + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $esClient = $this->elasticsearchClients->get('phpunit'); + + $this->assertTrue($esClient->indices()->exists(['index' => 'index'])); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index' + ], + new \DateTime(), + new \DateTime() + )); + + $this->assertFalse($esClient->indices()->exists(['index' => 'index'])); + } +} diff --git a/tests/integration/Business/Migration/PutAliasTest.php b/tests/integration/Business/Migration/PutAliasTest.php new file mode 100644 index 0000000..68330cb --- /dev/null +++ b/tests/integration/Business/Migration/PutAliasTest.php @@ -0,0 +1,161 @@ +migration = new PutAlias(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if ($client->exists(['index' => 'index'])) { + $client->delete(['index' => 'index']); + } + + $client->create([ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]); + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_not_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->delete(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'name' => 'Alias' + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_alias_already_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->putAlias([ + 'index' => 'index', + 'name' => 'Alias' + ]); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'name' => 'Alias' + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $esClient = $this->elasticsearchClients->get('phpunit'); + + $this->assertFalse($esClient->indices()->existsAlias([ + 'index' => 'index', + 'name' => 'Alias' + ])); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'name' => 'Alias' + ], + new \DateTime(), + new \DateTime() + )); + + $this->assertTrue($esClient->indices()->existsAlias([ + 'index' => 'index', + 'name' => 'Alias' + ])); + } +} diff --git a/tests/integration/Business/Migration/UpdateIndexMappingTest.php b/tests/integration/Business/Migration/UpdateIndexMappingTest.php new file mode 100644 index 0000000..e6308e3 --- /dev/null +++ b/tests/integration/Business/Migration/UpdateIndexMappingTest.php @@ -0,0 +1,141 @@ +migration = new UpdateIndexMapping(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if (!$client->exists(['index' => 'index'])) { + $client->create([ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]); + } + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_not_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->delete(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $esClient = $this->elasticsearchClients->get('phpunit'); + + $mapping = $esClient->indices()->getMapping(['index' => 'index']); + $this->assertNull(array_get($mapping, 'index.mappings.phpunit.properties.update')); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + + $mapping = $esClient->indices()->getMapping(['index' => 'index']); + $this->assertEquals([ + 'type' => 'text' + ], array_get($mapping, 'index.mappings.phpunit.properties.update')); + } + + private function getValidPayload() : array + { + return [ + 'index' => 'index', + 'type' => 'phpunit', + 'body' => [ + 'properties' => [ + 'update' => [ + 'type' => 'text' + ] + ] + ] + ]; + } +} diff --git a/tests/integration/Business/Migration/UpdateIndexSettingTest.php b/tests/integration/Business/Migration/UpdateIndexSettingTest.php new file mode 100644 index 0000000..9eb6458 --- /dev/null +++ b/tests/integration/Business/Migration/UpdateIndexSettingTest.php @@ -0,0 +1,164 @@ +migration = new UpdateIndexSetting(); + + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' + ); + + $client = $this->elasticsearchClients->get('phpunit')->indices(); + if (!$client->exists(['index' => 'index'])) { + $client->create([ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ]); + } + } + + /** + * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationStepValidation + */ + public function it_throws_an_validation_exception() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_SETTING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Exception + */ + public function it_fails_if_index_not_exist() + { + $this->elasticsearchClients->get('phpunit')->indices()->delete(['index' => 'index']); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_SETTING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + * @expectedException \Elasticsearch\Common\Exceptions\BadRequest400Exception + */ + public function it_fails_if_non_dynamic_settings_insert_without_close_index() + { + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_SETTING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + [ + 'index' => 'index', + 'body' => [ + 'refresh_interval' => '1s', + 'analysis' => [ + 'analyzer' => [ + 'content' => [ + 'type' => 'custom', + 'tokenizer' => 'whitespace' + ] + ] + ] + ] + ], + new \DateTime(), + new \DateTime() + )); + } + + /** + * @test + */ + public function it_runs_migration() + { + $esClient = $this->elasticsearchClients->get('phpunit'); + + $setting = $esClient->indices()->getSettings(['index' => 'index']); + $this->assertEquals('30s', array_get($setting, 'index.settings.index.refresh_interval')); + + $this->migration->migrate($this->elasticsearchClients->get('phpunit'), new MigrationStep( + 1, + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_SETTING, + MigrationStatus::MIGRATION_STATUS_WAIT, + null, + $this->getValidPayload(), + new \DateTime(), + new \DateTime() + )); + + $setting = $esClient->indices()->getSettings(['index' => 'index']); + $this->assertEquals('1s', array_get($setting, 'index.settings.index.refresh_interval')); + } + + private function getValidPayload() : array + { + return [ + 'index' => 'index', + 'body' => [ + 'refresh_interval' => '1s' + ] + ]; + } +} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepAliasTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepAliasTest.php deleted file mode 100644 index af0730a..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepAliasTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepAliasContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], [], []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepAlias::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], [], []); - $this->repository->create(1, [], [], []); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, [], [], []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepAlias::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepCreateIndexTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepCreateIndexTest.php deleted file mode 100644 index 993f163..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepCreateIndexTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null); - - $this->assertInstanceOf( - ElasticsearchMigrationStepCreateIndex::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null); - $this->repository->create(1, [], null); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, [], null); - - $this->assertInstanceOf( - ElasticsearchMigrationStepCreateIndex::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepDeleteByQueryTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepDeleteByQueryTest.php deleted file mode 100644 index 86f2587..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepDeleteByQueryTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null, []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepDeleteByQuery::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null, []); - $this->repository->create(1, [], null, []); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, [], null, []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepDeleteByQuery::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepReindexTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepReindexTest.php deleted file mode 100644 index a006732..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepReindexTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepReindexContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, 'destIndex', false, [], [], []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepReindex::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, 'destIndex', false, [], [], []); - $this->repository->create(1, 'destIndex', false, [], [], []); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, 'destIndex', false, [], [], []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepReindex::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php index 3af4a8b..2983518 100644 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php +++ b/tests/integration/Business/Repository/ElasticsearchMigrationStepTest.php @@ -5,55 +5,20 @@ use Triadev\EsMigration\Business\Events\MigrationStepDone; use Triadev\EsMigration\Business\Events\MigrationStepError; use Triadev\EsMigration\Business\Events\MigrationStepRunning; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepAliasContract; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepCreateIndexContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepDeleteByQueryContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepReindexContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepUpdateByQueryContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepUpdateIndexContract; use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStep; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepAlias; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepCreateIndex; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepDeleteByQuery; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepReindex; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateByQuery; -use Triadev\EsMigration\Models\Entity\ElasticsearchMigrationStepUpdateIndex; class ElasticsearchMigrationStepTest extends TestCase { /** @var ElasticsearchMigrationStepContract */ private $repository; - /** @var ElasticsearchMigrationStepCreateIndexContract */ - private $createIndexRepository; - - /** @var ElasticsearchMigrationStepUpdateIndexContract */ - private $updateIndexRepository; - - /** @var ElasticsearchMigrationStepAliasContract */ - private $aliasRepository; - - /** @var ElasticsearchMigrationStepDeleteByQueryContract */ - private $deleteByQueryRepository; - - /** @var ElasticsearchMigrationStepUpdateByQueryContract */ - private $updateByQueryRepository; - - /** @var ElasticsearchMigrationStepReindexContract */ - private $reindexRepository; - public function setUp() { parent::setUp(); $this->repository = app(ElasticsearchMigrationStepContract::class); - $this->createIndexRepository = app(ElasticsearchMigrationStepCreateIndexContract::class); - $this->updateIndexRepository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - $this->aliasRepository = app(ElasticsearchMigrationStepAliasContract::class); - $this->deleteByQueryRepository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - $this->updateByQueryRepository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - $this->reindexRepository = app(ElasticsearchMigrationStepReindexContract::class); } /** @@ -63,8 +28,13 @@ public function it_creates_a_migration() { $this->assertNull($this->repository->find(1)); - $this->repository->create(2, 'createIndex', 'phpunit'); - $this->repository->create(2, 'createIndex', 'phpunit'); + $this->repository->create(2, 'createIndex', [ + 'index' => 'phpunit' + ]); + + $this->repository->create(2, 'createIndex', [ + 'index' => 'phpunit' + ]); $this->assertInstanceOf( ElasticsearchMigrationStep::class, @@ -87,25 +57,27 @@ public function it_updates_a_migration() $this->assertNull($this->repository->find(1)); - $this->repository->create(2, 'createIndex', 'phpunit'); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_WAIT, $this->repository->find(1)->status); + $this->repository->create(2, 'createIndex', [ + 'index' => 'phpunit' + ]); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $this->repository->find(1)->status); // Running - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_RUNNING, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_RUNNING); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_RUNNING, $this->repository->find(1)->status); // Error - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR, 'error'); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_ERROR, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_ERROR, 'error'); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_ERROR, $this->repository->find(1)->status); $this->assertEquals('error', $this->repository->find(1)->error); // Done - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $this->repository->find(1)->status); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_DONE); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find(1)->status); // Done => invalid status id $this->repository->update(1, 999); - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $this->repository->find(1)->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find(1)->status); } /** @@ -114,7 +86,7 @@ public function it_updates_a_migration() */ public function it_throws_an_exception_when_migrations_not_exist_at_update() { - $this->repository->update(1, ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE); + $this->repository->update(1, MigrationStatus::MIGRATION_STATUS_DONE); } /** @@ -122,143 +94,13 @@ public function it_throws_an_exception_when_migrations_not_exist_at_update() */ public function it_finds_a_migration() { - $this->repository->create(2, 'createIndex', 'phpunit'); + $this->repository->create(2, 'createIndex', [ + 'index' => 'phpunit' + ]); $this->assertInstanceOf( ElasticsearchMigrationStep::class, $this->repository->find(1) ); } - - /** - * @test - */ - public function it_gets_create_index_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'createIndex', 'phpunit'); - - $this->createIndexRepository->create(1, [], null); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepCreateIndex::class, - get_class($migrationByType->first()) - ); - } - - /** - * @test - */ - public function it_gets_update_index_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'updateIndex', 'phpunit'); - - $this->updateIndexRepository->create(1, [], null); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepUpdateIndex::class, - get_class($migrationByType->first()) - ); - } - - /** - * @test - */ - public function it_gets_delete_index_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'deleteIndex', 'phpunit'); - - $this->assertEquals('deleteIndex', $this->repository->find(1)->migrationByType()); - } - - /** - * @test - */ - public function it_gets_alias_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'alias', 'phpunit'); - - $this->aliasRepository->create(1, [], [], []); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepAlias::class, - get_class($migrationByType->first()) - ); - } - - /** - * @test - */ - public function it_gets_delete_by_query_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'deleteByQuery', 'phpunit'); - - $this->deleteByQueryRepository->create(1, [], null, []); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepDeleteByQuery::class, - get_class($migrationByType->first()) - ); - } - - /** - * @test - */ - public function it_gets_update_by_query_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'updateByQuery', 'phpunit'); - - $this->updateByQueryRepository->create(1, [], null, null, []); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepUpdateByQuery::class, - get_class($migrationByType->first()) - ); - } - - /** - * @test - */ - public function it_gets_reindex_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(2, 'reindex', 'phpunit'); - - $this->reindexRepository->create(1, 'dest_index', false, [], [], []); - - $migrationByType = $this->repository->find(1)->migrationByType(); - - $this->assertEquals(1, $migrationByType->count()); - $this->assertEquals( - ElasticsearchMigrationStepReindex::class, - get_class($migrationByType->first()) - ); - } } diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateByQueryTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateByQueryTest.php deleted file mode 100644 index a9ba2d2..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateByQueryTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null, null, []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepUpdateByQuery::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null, null, []); - $this->repository->create(1, [], null, null, []); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, [], null, null, []); - - $this->assertInstanceOf( - ElasticsearchMigrationStepUpdateByQuery::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateIndexTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateIndexTest.php deleted file mode 100644 index 224dd95..0000000 --- a/tests/integration/Business/Repository/ElasticsearchMigrationStepUpdateIndexTest.php +++ /dev/null @@ -1,59 +0,0 @@ -repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - } - - /** - * @test - */ - public function it_creates_a_migration() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null, false); - - $this->assertInstanceOf( - ElasticsearchMigrationStepUpdateIndex::class, - $this->repository->find(1) - ); - } - - /** - * @test - * @expectedException \Illuminate\Database\QueryException - */ - public function it_expected_a_sql_unique_exception() - { - $this->assertNull($this->repository->find(1)); - - $this->repository->create(1, [], null); - $this->repository->create(1, [], null); - } - - /** - * @test - */ - public function it_finds_a_migration() - { - $this->repository->create(1, [], null, false); - - $this->assertInstanceOf( - ElasticsearchMigrationStepUpdateIndex::class, - $this->repository->find(1) - ); - } -} diff --git a/tests/integration/Business/Repository/ElasticsearchMigrationTest.php b/tests/integration/Business/Repository/ElasticsearchMigrationTest.php index 5ff33fd..2d14ed9 100644 --- a/tests/integration/Business/Repository/ElasticsearchMigrationTest.php +++ b/tests/integration/Business/Repository/ElasticsearchMigrationTest.php @@ -5,6 +5,7 @@ use Triadev\EsMigration\Business\Events\MigrationDone; use Triadev\EsMigration\Business\Events\MigrationError; use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract; use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; use Triadev\EsMigration\Models\Entity\ElasticsearchMigration; @@ -53,24 +54,24 @@ public function it_updates_a_migration() // WAIT $this->repository->createOrUpdate('1.0.0'); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $this->repository->find('1.0.0')->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $this->repository->find('1.0.0')->status); // ERROR - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, 'error'); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_ERROR, 'error'); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_ERROR, $this->repository->find('1.0.0')->status); $this->assertEquals('error', $this->repository->find('1.0.0')->error); // RUNNING - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_RUNNING); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_RUNNING, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_RUNNING); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_RUNNING, $this->repository->find('1.0.0')->status); // DONE - $this->repository->createOrUpdate('1.0.0', ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); + $this->repository->createOrUpdate('1.0.0', MigrationStatus::MIGRATION_STATUS_DONE); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); // DONE => invalid status id $this->repository->createOrUpdate('1.0.0', 999); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $this->repository->find('1.0.0')->status); } /** @@ -115,8 +116,13 @@ public function it_gets_many_migrations() $this->repository->find('1.0.0') ); - $this->migrationStepRepository->create(1, 'create', 'phpunit'); - $this->migrationStepRepository->create(1, 'update', 'phpunit'); + $this->migrationStepRepository->create(1, 'create', [ + 'index' => 'phpunit' + ]); + + $this->migrationStepRepository->create(1, 'update', [ + 'index' => 'phpunit' + ]); $migration = $this->repository->find('1.0.0'); @@ -136,9 +142,9 @@ public function it_gets_all_migrations() $migrations = $this->repository->all(['id', 'migration', 'status']); $this->assertEquals('1.0.0', $migrations[0]->migration); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $migrations[0]->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $migrations[0]->status); $this->assertEquals('1.0.1', $migrations[1]->migration); - $this->assertEquals(ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $migrations[1]->status); + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $migrations[1]->status); } } diff --git a/tests/integration/Business/Service/MigrationStepsTest.php b/tests/integration/Business/Service/MigrationStepsTest.php new file mode 100644 index 0000000..0ac7a7c --- /dev/null +++ b/tests/integration/Business/Service/MigrationStepsTest.php @@ -0,0 +1,145 @@ +migrationService = app(ElasticsearchMigrationContract::class); + $this->migrationStepsService = app(MigrationSteps::class); + $this->migrationStepRepository = app(ElasticsearchMigrationStepContract::class); + } + + /** + * @test + */ + public function it_gets_migration_steps_without_done_steps() + { + $this->assertTrue($this->migrationService->createMigration('phpunit')); + + $this->addMigrationSteps(); + + $this->assertCount( + 7, + $this->migrationStepsService->getMigrationSteps('phpunit', true) + ); + + $this->migrationStepRepository->update(3, MigrationStatus::MIGRATION_STATUS_DONE, null); + + $this->assertCount( + 7, + $this->migrationStepsService->getMigrationSteps('phpunit', false) + ); + + $result = $this->migrationStepsService->getMigrationSteps('phpunit', true); + $this->assertCount(6, $result); + } + + private function addMigrationSteps() + { + // Create index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + [ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] + ] + )); + + // Update index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, + [ + 'index' => 'index' + ] + )); + + // Delete index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, + [ + 'index' => 'index' + ] + )); + + // Alias + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + [ + 'index' => 'index' + ] + )); + + // Delete by query + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY, + [ + 'index' => 'index', + 'query' => [] + ] + )); + + // Update by query + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY, + [ + 'index' => 'index', + 'query' => [] + ] + )); + + // Reindex + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_REINDEX, + [ + 'index' => 'index', + 'destIndex' => 'phpunit' + ] + )); + } +} diff --git a/tests/integration/Business/Validation/FieldDatatypeMigrationTest.php b/tests/integration/Business/Validation/FieldDatatypeMigrationTest.php deleted file mode 100644 index d4fe507..0000000 --- a/tests/integration/Business/Validation/FieldDatatypeMigrationTest.php +++ /dev/null @@ -1,142 +0,0 @@ - [ - 'properties' => [ - 'text' => [ - 'type' => 'text' - ], - 'keyword' => [ - 'type' => 'keyword' - ], - 'date' => [ - 'type' => 'date' - ], - 'boolean' => [ - 'type' => 'boolean' - ], - 'binary' => [ - 'type' => 'binary' - ], - 'range' => [ - 'type' => 'integer_range' - ], - 'object' => [ - 'type' => 'object' - ], - 'nested' => [ - 'type' => 'nested' - ], - 'geo_point' => [ - 'type' => 'geo_point' - ], - 'geo_shape' => [ - 'type' => 'geo_shape' - ], - 'ip' => [ - 'type' => 'ip' - ], - 'completion' => [ - 'type' => 'completion' - ], - 'token_count' => [ - 'type' => 'token_count' - ], - 'murmur3' => [ - 'type' => 'murmur3' - ], - 'attachment' => [ - 'type' => 'attachment' - ], - 'percolator' => [ - 'type' => 'percolator' - ], - 'valid' => [ - 'type' => 'text' - ] - ] - ] - ]; - - $migrationMapping = [ - 'phpunit' => [ - 'properties' => [ - 'text' => [ - 'type' => 'long' - ], - 'keyword' => [ - 'type' => 'long' - ], - 'date' => [ - 'type' => 'long' - ], - 'boolean' => [ - 'type' => 'long' - ], - 'binary' => [ - 'type' => 'long' - ], - 'range' => [ - 'type' => 'long' - ], - 'object' => [ - 'type' => 'long' - ], - 'nested' => [ - 'type' => 'long' - ], - 'geo_point' => [ - 'type' => 'long' - ], - 'geo_shape' => [ - 'type' => 'long' - ], - 'ip' => [ - 'type' => 'long' - ], - 'completion' => [ - 'type' => 'long' - ], - 'token_count' => [ - 'type' => 'long' - ], - 'murmur3' => [ - 'type' => 'long' - ], - 'attachment' => [ - 'type' => 'long' - ], - 'percolator' => [ - 'type' => 'long' - ], - 'valid' => [ - 'type' => 'keyword' - ] - ] - ] - ]; - - try { - (new \Triadev\EsMigration\Business\Validation\FieldDatatypeMigration())->validate( - $esMapping, - $migrationMapping - ); - } catch (FieldDatatypeMigrationFailed $e) { - $this->assertCount(16, json_decode($e->getMessage())); - - throw $e; - } - } -} diff --git a/tests/integration/Console/Commands/ShowMigrationTest.php b/tests/integration/Console/Commands/ShowMigrationTest.php deleted file mode 100644 index 09b14db..0000000 --- a/tests/integration/Console/Commands/ShowMigrationTest.php +++ /dev/null @@ -1,58 +0,0 @@ -migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class - ); - } - - /** - * @test - */ - public function it_shows_migrations_with_status() - { - $now = Carbon::now()->subSeconds(1); - - Carbon::setTestNow($now); - - $this->migrationRepository->createOrUpdate( - '1.0.0', - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); - - $now->addSeconds(1); - - Carbon::setTestNow($now); - - $this->migrationRepository->createOrUpdate( - '1.0.1', - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ); - - $this->artisan('triadev:elasticsearch:migration:show') - ->assertExitCode(0); - - $this->artisan('triadev:elasticsearch:migration:show', [ - 'sortField' => 'createdAt', - 'sortOrder' => 'desc' - ])->assertExitCode(0); - - $this->artisan('triadev:elasticsearch:migration:show', [ - 'sortField' => 'updatedAt', - 'sortOrder' => 'asc' - ])->assertExitCode(0); - } -} diff --git a/tests/integration/Console/Commands/StartMigrationTest.php b/tests/integration/Console/Commands/StartMigrationTest.php deleted file mode 100644 index 13843aa..0000000 --- a/tests/integration/Console/Commands/StartMigrationTest.php +++ /dev/null @@ -1,307 +0,0 @@ -service = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - $this->esClient = $this->buildElasticsearchClient(); - - if ($this->esClient->indices()->exists(['index' => 'phpunit'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit' - ]); - } - - if ($this->esClient->indices()->exists(['index' => 'phpunit_1.0.1'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit_1.0.1' - ]); - } - - $this->migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class - ); - } - - private function buildElasticsearchClient() : Client - { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); - - return $clientBuilder->build(); - } - - /** - * @test - */ - public function it_creates_and_updates_mappings_and_settings_with_command() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status - ); - } - - /** - * @test - */ - public function it_creates_and_updates_mappings_and_settings_with_command_with_database() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - 'settings' => [ - 'refresh_interval' => "30s" - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - 'settings' => [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'settings' => [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - 'closeIndex' => true - ] - )); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0', - '--source' => 'database' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status - ); - } - - /** - * @test - */ - public function it_starts_to_orchestra_migrations() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - $this->assertNull($this->migrationRepository->find('1.0.1')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit,phpunit_1.0.1' - ])); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0, 1.0.1' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit,phpunit_1.0.1'])); - - $migrationResult = $this->migrationRepository->find('1.0.0'); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migrationResult->status); - - $migrationResult = $this->migrationRepository->find('1.0.1'); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migrationResult->status); - } - - /** - * @test - */ - public function it_starts_to_orchestra_migrations_with_database() - { - $this->assertNull($this->migrationRepository->find('1.0.0')); - $this->assertNull($this->migrationRepository->find('1.0.1')); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit,phpunit_1.0.1' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ] - ] - )); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.1')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.1', - 'createIndex', - 'phpunit_1.0.1', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ] - ] - )); - - $this->artisan('triadev:elasticsearch:migration:start', [ - 'versions' => '1.0.0, 1.0.1', - '--source' => 'database' - ])->assertExitCode(0); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit,phpunit_1.0.1'])); - - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->migrationRepository->find('1.0.0')->status); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $this->migrationRepository->find('1.0.1')->status); - } -} diff --git a/tests/integration/ElasticsearchMigrationDatabaseTest.php b/tests/integration/ElasticsearchMigrationDatabaseTest.php deleted file mode 100644 index 06cab35..0000000 --- a/tests/integration/ElasticsearchMigrationDatabaseTest.php +++ /dev/null @@ -1,395 +0,0 @@ -service = app(ElasticsearchMigrationDatabaseContract::class); - - $this->elasticsearchMigrationRepository = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationStepRepository = app(ElasticsearchMigrationStepContract::class); - } - - /** - * @test - */ - public function it_creates_migration() - { - $this->assertNull($this->elasticsearchMigrationRepository->find('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertEquals(1, $this->elasticsearchMigrationRepository->find('1.0.0')->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_migration() - { - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - - $this->assertEquals( - 1, - $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id') - ); - } - - /** - * @test - */ - public function it_adds_create_index_migration() - { - /** @var ElasticsearchMigrationStepCreateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepCreateIndexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'createIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepCreateIndex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_update_index_migration() - { - /** @var ElasticsearchMigrationStepUpdateIndexContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateIndexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepUpdateIndex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_delete_index_migration() - { - $this->assertFalse($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_alias_migration() - { - /** @var ElasticsearchMigrationStepAliasContract $repository */ - $repository = app(ElasticsearchMigrationStepAliasContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'alias', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepAlias::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_delete_by_query_migration() - { - /** @var ElasticsearchMigrationStepDeleteByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepDeleteByQueryContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepDeleteByQuery::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_update_by_query_migration() - { - /** @var ElasticsearchMigrationStepUpdateByQueryContract $repository */ - $repository = app(ElasticsearchMigrationStepUpdateByQueryContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepUpdateByQuery::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - } - - /** - * @test - */ - public function it_adds_reindex_migration() - { - /** @var ElasticsearchMigrationStepReindexContract $repository */ - $repository = app(ElasticsearchMigrationStepReindexContract::class); - - $this->assertFalse($this->service->addMigration('1.0.0', 'reindex', 'phpunit')); - $this->assertNull($this->elasticsearchMigrationStepRepository->find(1)); - $this->assertNull($repository->find(1)); - - $this->assertTrue($this->service->createMigration('1.0.0')); - - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $this->assertEquals(1, $this->elasticsearchMigrationStepRepository->find(1)->getAttribute('id')); - - $migration = $repository->find(1); - $this->assertInstanceOf(ElasticsearchMigrationStepReindex::class, $migration); - $this->assertEquals(1, $migration->getAttribute('id')); - $this->assertEquals('phpunit', $migration->getAttribute('dest_index')); - } - - /** - * @test - */ - public function it_gets_migration() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $migrations = $this->service->getMigration('1.0.0'); - - $this->assertCount(7, $migrations); - - $this->assertInstanceOf(CreateIndex::class, $migrations[1]); - $this->assertInstanceOf(UpdateIndex::class, $migrations[2]); - $this->assertInstanceOf(DeleteIndex::class, $migrations[3]); - $this->assertInstanceOf(Alias::class, $migrations[4]); - $this->assertInstanceOf(DeleteByQuery::class, $migrations[5]); - $this->assertInstanceOf(UpdateByQuery::class, $migrations[6]); - $this->assertInstanceOf(Reindex::class, $migrations[7]); - } - - /** - * @test - */ - public function it_gets_migration_without_status_done_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertCount(3, $this->service->getMigration('1.0.0')); - - $this->elasticsearchMigrationStepRepository->update( - 1, - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - null - ); - - $this->assertCount(2, $this->service->getMigration('1.0.0')); - } - - /** - * @test - */ - public function it_gets_migration_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'createIndex', 'phpunit', [ - 'mappings' => [ - 'example' => [ - 'properties' => [ - 'title' => [ - 'type' => 'text' - ] - ] - ] - ] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateByQuery', 'phpunit', [ - 'query' => [] - ])); - $this->assertTrue($this->service->addMigration('1.0.0', 'reindex', 'phpunit', [ - 'destIndex' => 'phpunit' - ])); - - $migrationSteps = $this->service->getMigrationSteps('1.0.0'); - $this->assertCount(7, $migrationSteps); - - foreach ($migrationSteps as $migrationStep) { - $this->assertTrue(array_has( - $migrationStep, - [ - 'type', - 'index', - 'status', - 'error', - 'created_at', - 'updated_at' - ] - )); - } - } - - /** - * @test - */ - public function it_gets_migration_steps_without_status_done_steps() - { - $this->assertEquals([], $this->service->getMigration('1.0.0')); - - $this->assertTrue($this->service->createMigration('1.0.0')); - $this->assertFalse($this->service->addMigration('1.0.0', 'default', 'phpunit')); - $this->assertTrue($this->service->addMigration('1.0.0', 'updateIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'deleteIndex', 'phpunit', [])); - $this->assertTrue($this->service->addMigration('1.0.0', 'alias', 'phpunit', [])); - - $this->assertCount(3, $this->service->getMigrationSteps('1.0.0')); - - $this->elasticsearchMigrationStepRepository->update( - 1, - ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - null - ); - - $this->assertCount(2, $this->service->getMigrationSteps('1.0.0')); - } -} diff --git a/tests/integration/ElasticsearchMigrationTest.php b/tests/integration/ElasticsearchMigrationTest.php index 1ed1571..45b33e3 100644 --- a/tests/integration/ElasticsearchMigrationTest.php +++ b/tests/integration/ElasticsearchMigrationTest.php @@ -2,739 +2,337 @@ namespace Tests\Integration; use Elasticsearch\Client; -use Elasticsearch\ClientBuilder; use Tests\TestCase; +use Triadev\EsMigration\Business\Events\MigrationDone; +use Triadev\EsMigration\Business\Events\MigrationRunning; +use Triadev\EsMigration\Business\Events\MigrationStepDone; +use Triadev\EsMigration\Business\Events\MigrationStepRunning; +use Triadev\EsMigration\Business\Mapper\MigrationStatus; +use Triadev\EsMigration\Business\Mapper\MigrationTypes; +use Triadev\EsMigration\Business\Repository\ElasticsearchClients; use Triadev\EsMigration\Contract\ElasticsearchMigrationContract; -use Triadev\EsMigration\Contract\ElasticsearchMigrationDatabaseContract; -use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract; -use Triadev\EsMigration\Exception\FieldDatatypeMigrationFailed; +use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract as ElasticsearchMigrationRepository; +use Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationStepContract as ElasticsearchMigrationStepRepository; +use Triadev\EsMigration\Models\Entity\ElasticsearchMigration; class ElasticsearchMigrationTest extends TestCase { /** @var ElasticsearchMigrationContract */ - private $service; + private $migrationService; - /** @var Client */ - private $esClient; - - /** @var \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract */ + /** @var ElasticsearchMigrationRepository */ private $migrationRepository; - /** @var ElasticsearchMigrationDatabaseContract */ - private $elasticsearchMigrationDatabaseService; + /** @var ElasticsearchMigrationStepRepository */ + private $migrationStepRepository; + + /** @var ElasticsearchClients */ + private $elasticsearchClients; + /** + * SetUp + */ public function setUp() { parent::setUp(); - $this->service = app(ElasticsearchMigrationContract::class); - $this->elasticsearchMigrationDatabaseService = app(ElasticsearchMigrationDatabaseContract::class); - $this->esClient = $this->buildElasticsearchClient(); - - if ($this->esClient->indices()->exists(['index' => 'phpunit'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit' - ]); - } - - if ($this->esClient->indices()->exists(['index' => 'phpunit_1.0.1'])) { - $this->esClient->indices()->delete([ - 'index' => 'phpunit_1.0.1' - ]); - } + $this->migrationService = app(ElasticsearchMigrationContract::class); + $this->migrationRepository = app(ElasticsearchMigrationRepository::class); + $this->migrationStepRepository = app(ElasticsearchMigrationStepRepository::class); - $this->migrationRepository = app( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::class + $this->elasticsearchClients = new ElasticsearchClients(); + $this->elasticsearchClients->add( + 'phpunit', + 'localhost', + env('ELASTICSEARCH_PORT'), + 'http', + '', + '' ); - - $this->buildDatabaseTestData(); - } - private function buildElasticsearchClient() : Client - { - $config = config('triadev-elasticsearch-migration'); - - $clientBuilder = ClientBuilder::create(); - $clientBuilder->setHosts([ - [ - 'host' => $config['host'], - 'port' => $config['port'], - 'scheme' => $config['scheme'], - 'user' => $config['user'], - 'pass' => $config['pass'] - ] - ]); - - return $clientBuilder->build(); - } - - private function buildDatabaseTestData() - { - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.0')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'createIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' - ] - ] - ] - ], - 'settings' => [ - 'refresh_interval' => "30s" - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'mappings' => [ - 'phpunit' => [ - 'properties' => [ - 'description' => [ - 'type' => 'text' - ] - ] - ] - ], - 'settings' => [ - 'index' => [ - 'refresh_interval' => "60s" - ] - ] - ] - )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.0', - 'updateIndex', - 'phpunit', - [ - 'settings' => [ - 'analysis' => [ - 'analyzer' => [ - 'content' => [ - 'type' => 'custom', - 'tokenizer' => 'whitespace' - ] - ] - ] - ], - 'closeIndex' => true - ] - )); + /** @var Client $esClient */ + $esClient = $this->elasticsearchClients->get('phpunit'); + if ($esClient->indices()->exists(['index' => 'index'])) { + $esClient->indices()->delete(['index' => 'index']); + } } /** * @test */ - public function it_creates_and_updates_mappings_and_settings() + public function it_creates_a_migration() { - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - $this->migrationRepository->find('1.0.0')->status - ); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); - - $this->service->migrate('1.0.0'); - - $this->assertTrue($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); + $this->assertNull($this->migrationRepository->find('phpunit')); - $mapping = $this->esClient->indices()->getMapping([ - 'index' => 'phpunit', - 'type' => 'phpunit' - ]); - - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings([ - 'index' => 'phpunit' - ]); - - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); + $this->assertTrue( + $this->migrationService->createMigration( + 'phpunit' + ) + ); - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $migration->status + $this->assertInstanceOf( + ElasticsearchMigration::class, + $this->migrationRepository->find('phpunit') ); } /** * @test */ - public function it_creates_and_updates_mappings_and_settings_with_database() + public function it_adds_migration_steps() { - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, $this->migrationRepository->find('1.0.0')->status); - - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->service->migrate('1.0.0', 'database'); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); + $this->assertTrue($this->migrationService->createMigration('phpunit')); - $mapping = $this->esClient->indices()->getMapping(['index' => 'phpunit', 'type' => 'phpunit']); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.title')); - $this->assertTrue(array_has($mapping, 'phpunit.mappings.phpunit.properties.description')); - - $settings = $this->esClient->indices()->getSettings(['index' => 'phpunit']); - $this->assertEquals('60s', array_get($settings, 'phpunit.settings.index.refresh_interval')); - $this->assertEquals('custom', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.type')); - $this->assertEquals('whitespace', array_get($settings, 'phpunit.settings.index.analysis.analyzer.content.tokenizer')); - - $migration = $this->migrationRepository->find('1.0.0'); - - $this->assertEquals('1.0.0', $migration->migration); - $this->assertEquals(\Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, $migration->status); + $this->assertEquals( + 0, + $this->migrationRepository->find('phpunit')->migrationSteps()->count() + ); - $migrationSteps = $migration->migrationSteps(); - $this->assertEquals(3, $migrationSteps->count()); + $this->addMigrationSteps(); - foreach ($migrationSteps->cursor() as $migrationStep) { - $this->assertEquals(ElasticsearchMigrationStepContract::ELASTICSEARCH_MIGRATION_STEP_STATUS_DONE, $migrationStep->status); - } - } - - /** - * @test - */ - public function it_deletes_an_index() - { - $this->service->migrate('1.0.0'); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->service->migrate('delete_index'); - - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); + $this->assertEquals(7, $this->migrationRepository->find('phpunit')->migrationSteps()->count()); } /** * @test */ - public function it_deletes_an_index_with_database() + public function it_returns_false_if_migration_step_type_is_invalid() { - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->service->migrate('1.0.0', 'database'); - - $this->assertTrue($this->esClient->indices()->exists(['index' => 'phpunit'])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_index')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_index', - 'deleteIndex', - 'phpunit' + $this->assertFalse($this->migrationService->addMigrationStep( + 'phpunit', + 'invalid', + [ + 'index' => 'index' + ] )); - - $this->service->migrate('delete_index', 'database'); - - $this->assertFalse($this->esClient->indices()->exists(['index' => 'phpunit'])); - } - - /** - * @test - */ - public function it_adds_and_deletes_an_alias() - { - $this->service->migrate('1.0.0'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->service->migrate('add_alias'); - - $this->assertTrue($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->service->migrate('delete_alias'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); } /** * @test */ - public function it_adds_and_deletes_an_alias_with_database() + public function it_returns_false_if_migration_not_exist() { - $this->service->migrate('1.0.0', 'database'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('add_alias')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'add_alias', - 'alias', + $this->assertFalse($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, [ - 'add' => [ - 'alias' - ] - ] - )); - - $this->service->migrate('add_alias', 'database'); - - $this->assertTrue($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_alias')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_alias', - 'alias', - 'phpunit', - [ - 'remove' => [ - 'alias' - ] + 'index' => 'index' ] )); - - $this->service->migrate('delete_alias', 'database'); - - $this->assertFalse($this->esClient->indices()->existsAlias([ - 'name' => 'alias', - 'index' => 'phpunit' - ])); - } - - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\IndexNotExist - */ - public function it_throws_an_exception_if_reindex_dest_index_not_exist() - { - $this->service->migrate('1.0.0'); - $this->service->migrate('reindex'); } /** * @test */ - public function it_reindex_an_index() + public function it_gets_migration_status() { - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + $this->assertEquals([ + 'migration' => 'phpunit', + 'status' => null, + 'steps' => [] + ], $this->migrationService->getMigrationStatus('phpunit')); - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); + $this->assertTrue($this->migrationService->createMigration('phpunit')); - $this->service->migrate('1.0.0'); + $this->addMigrationSteps(); - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); + $result = $this->migrationService->getMigrationStatus('phpunit'); - $this->service->migrate('1.0.1'); - $this->service->migrate('reindex'); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_WAIT, $result['status']); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); + $this->assertCount(7, $result['steps']); + + foreach ($result['steps'] as $step) { + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_WAIT, $step['status']); + $this->assertEquals(null, $step['error']); + } } /** * @test */ - public function it_reindex_an_index_with_database() + public function it_starts_migration() { - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] + $this->expectsEvents([ + MigrationRunning::class, + MigrationDone::class, + MigrationStepRunning::class, + MigrationStepDone::class ]); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('1.0.1')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - '1.0.1', - 'createIndex', - 'phpunit_1.0.1', + $this->assertTrue($this->migrationService->createMigration('phpunit')); + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, [ - 'mappings' => [ - 'phpunit' => [ - 'dynamic' => 'strict', - 'properties' => [ - 'title' => [ - 'type' => 'text' - ], - 'count' => [ - 'type' => 'integer' + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] ] ] + ], + 'settings' => [ + 'refresh_interval' => "30s" ] - ], - 'settings' => [ - 'refresh_interval' => "30s" ] ] )); - - $this->service->migrate('1.0.1', 'database'); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('reindex')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'reindex', - 'reindex', + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, [ - 'destIndex' => 'phpunit_1.0.1', - 'refreshSourceIndex' => true + 'index' => 'index' ] )); - $this->service->migrate('reindex', 'database'); + $result = $this->migrationService->getMigrationStatus('phpunit'); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_WAIT, $result['status']); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit_1.0.1', - 'type' => 'phpunit' - ])); - } - - /** - * @test - */ - public function it_deletes_documents_by_query() - { - $this->service->migrate('1.0.0'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + $result = $this->migrationService->getMigrationStatus('phpunit'); - $this->service->migrate('delete_by_query'); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + $this->assertEquals('phpunit', $result['migration']); + $this->assertEquals( MigrationStatus::MIGRATION_STATUS_DONE, $result['status']); + + foreach ($result['steps'] as $step) { + $this->assertEquals(MigrationStatus::MIGRATION_STATUS_DONE, $step['status']); + $this->assertEquals(null, $step['error']); + } } /** * @test + * @expectedException \Triadev\EsMigration\Exception\MigrationAlreadyDone */ - public function it_deletes_documents_by_query_with_database() + public function it_throws_an_exception_if_a_migration_already_done() { - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title' - ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertTrue($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); - - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('delete_by_query')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'delete_by_query', - 'deleteByQuery', + $this->assertTrue($this->migrationService->createMigration('phpunit')); + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, [ - 'query' => [ - 'match' => [ - 'title' => 'Title' + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" ] - ], - 'type' => 'phpunit', - 'options' => [ - 'conflicts' => 'proceed' ] ] )); - $this->service->migrate('delete_by_query', 'database'); - - $this->assertFalse($this->esClient->exists([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); + $this->migrationService->startMigration('phpunit', $this->elasticsearchClients); } - /** - * @test - */ - public function it_updates_documents_by_query() + private function addMigrationSteps() { - $this->service->migrate('1.0.0'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title', - 'count' => 1 + // Create index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_CREATE_INDEX, + [ + 'index' => 'index', + 'body' => [ + 'mappings' => [ + 'phpunit' => [ + 'dynamic' => 'strict', + 'properties' => [ + 'title' => [ + 'type' => 'text' + ], + 'count' => [ + 'type' => 'integer' + ] + ] + ] + ], + 'settings' => [ + 'refresh_interval' => "30s" + ] + ] ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertEquals( - 1, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - - $this->service->migrate('update_by_query'); - - $this->assertEquals( - 2, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - } + )); - /** - * @test - */ - public function it_updates_documents_by_query_with_database() - { - $this->service->migrate('1.0.0', 'database'); - - $this->esClient->index([ - 'index' => 'phpunit', - 'type' => 'phpunit', - 'id' => 'reindex_test', - 'body' => [ - 'title' => 'Title', - 'count' => 1 + // Update index + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_INDEX_MAPPING, + [ + 'index' => 'index' ] - ]); - - $this->esClient->indices()->refresh([ - 'index' => 'phpunit' - ]); - - $this->assertEquals( - 1, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); + )); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->createMigration('update_by_query')); - $this->assertTrue($this->elasticsearchMigrationDatabaseService->addMigration( - 'update_by_query', - 'updateByQuery', + // Delete index + $this->assertTrue($this->migrationService->addMigrationStep( 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_INDEX, [ - 'query' => [ - 'match' => [ - 'title' => 'Title' - ] - ], - 'type' => 'phpunit', - 'script' => [ - 'source' => 'ctx._source.count++', - 'lang' => 'painless' - ], - 'options' => [ - 'conflicts' => 'proceed' - ] + 'index' => 'index' ] )); - - $this->service->migrate('update_by_query', 'database'); - - $this->assertEquals( - 2, - $this->esClient->get([ - 'id' => 'reindex_test', - 'index' => 'phpunit', - 'type' => 'phpunit' - ])['_source']['count'] - ); - } - - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\MigrationAlreadyDone - */ - public function it_throws_an_exception_if_migration_already_done() - { - $this->migrationRepository->createOrUpdate( - '1.0.0', - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE - ); - - $this->service->migrate('1.0.0'); - } - - /** - * @test - */ - public function it_updates_migration_status_from_error_to_done() - { - $this->migrationRepository->createOrUpdate( - '1.0.0', - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR - ); - - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_ERROR, - $this->migrationRepository->find('1.0.0')->status - ); - - $this->service->migrate('1.0.0'); - - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_DONE, - $this->migrationRepository->find('1.0.0')->status - ); - } - /** - * @test - * @expectedException \Triadev\EsMigration\Exception\FieldDatatypeMigrationFailed - */ - public function it_throws_exception_if_field_migration_not_allowed() - { - $this->assertEquals( - \Triadev\EsMigration\Contract\Repository\ElasticsearchMigrationContract::ELASTICSEARCH_MIGRATION_STATUS_WAIT, - $this->migrationRepository->find('1.0.0')->status - ); - - $this->assertFalse($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); + // Alias + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_PUT_ALIAS, + [ + 'index' => 'index' + ] + )); - $this->service->migrate('1.0.0'); + // Delete by query + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_DELETE_BY_QUERY, + [ + 'index' => 'index', + 'query' => [] + ] + )); - $this->assertTrue($this->esClient->indices()->exists([ - 'index' => 'phpunit' - ])); + // Update by query + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_UPDATE_BY_QUERY, + [ + 'index' => 'index', + 'query' => [] + ] + )); - try { - $this->service->migrate('field_datatype_migration_failed'); - } catch (FieldDatatypeMigrationFailed $e) { - $this->assertCount(2, json_decode($e->getMessage())); - - throw $e; - } + // Reindex + $this->assertTrue($this->migrationService->addMigrationStep( + 'phpunit', + MigrationTypes::MIGRATION_TYPE_REINDEX, + [ + 'index' => 'index', + 'destIndex' => 'phpunit' + ] + )); } }