/** * Switches an index to become the new target for an alias. Only applies for * indexes that are set to use aliases. * * $force will delete an index encountered where an alias is expected. * * @param IndexConfig $indexConfig * @param Index $index * @param bool $force * * @throws AliasIsIndexException * @throws \RuntimeException */ public function switchIndexAlias(IndexConfig $indexConfig, Index $index, $force = false) { $client = $index->getClient(); $aliasName = $indexConfig->getElasticSearchName(); $oldIndexName = null; $newIndexName = $index->getName(); try { $oldIndexName = $this->getAliasedIndex($client, $aliasName); } catch (AliasIsIndexException $e) { if (!$force) { throw $e; } $this->deleteIndex($client, $aliasName); } try { $aliasUpdateRequest = $this->buildAliasUpdateRequest($oldIndexName, $aliasName, $newIndexName); $client->request('_aliases', 'POST', $aliasUpdateRequest); } catch (ExceptionInterface $e) { $this->cleanupRenameFailure($client, $newIndexName, $e); } // Delete the old index after the alias has been switched if (null !== $oldIndexName) { $this->deleteIndex($client, $oldIndexName); } }
/** * Switches an index to become the new target for an alias. Only applies for * indexes that are set to use aliases. * * $force will delete an index encountered where an alias is expected. * * @param IndexConfig $indexConfig * @param Index $index * @param bool $force * @throws AliasIsIndexException * @throws \RuntimeException */ public function switchIndexAlias(IndexConfig $indexConfig, Index $index, $force = false) { $client = $index->getClient(); $aliasName = $indexConfig->getElasticSearchName(); $oldIndexName = false; $newIndexName = $index->getName(); try { $aliasedIndexes = $this->getAliasedIndexes($client, $aliasName); } catch (AliasIsIndexException $e) { if (!$force) { throw $e; } $this->deleteIndex($client, $aliasName); $aliasedIndexes = array(); } if (count($aliasedIndexes) > 1) { throw new \RuntimeException(sprintf('Alias %s is used for multiple indexes: [%s]. Make sure it\'s either not used or is assigned to one index only', $aliasName, join(', ', $aliasedIndexes))); } $aliasUpdateRequest = array('actions' => array()); if (count($aliasedIndexes) === 1) { // if the alias is set - add an action to remove it $oldIndexName = $aliasedIndexes[0]; $aliasUpdateRequest['actions'][] = array('remove' => array('index' => $oldIndexName, 'alias' => $aliasName)); } // add an action to point the alias to the new index $aliasUpdateRequest['actions'][] = array('add' => array('index' => $newIndexName, 'alias' => $aliasName)); try { $client->request('_aliases', 'POST', $aliasUpdateRequest); } catch (ExceptionInterface $renameAliasException) { $additionalError = ''; // if we failed to move the alias, delete the newly built index try { $index->delete(); } catch (ExceptionInterface $deleteNewIndexException) { $additionalError = sprintf('Tried to delete newly built index %s, but also failed: %s', $newIndexName, $deleteNewIndexException->getMessage()); } throw new \RuntimeException(sprintf('Failed to updated index alias: %s. %s', $renameAliasException->getMessage(), $additionalError ?: sprintf('Newly built index %s was deleted', $newIndexName)), 0, $renameAliasException); } // Delete the old index after the alias has been switched if ($oldIndexName) { $oldIndex = new Index($client, $oldIndexName); try { $oldIndex->delete(); } catch (ExceptionInterface $deleteOldIndexException) { throw new \RuntimeException(sprintf('Failed to delete old index %s with message: %s', $oldIndexName, $deleteOldIndexException->getMessage()), 0, $deleteOldIndexException); } } }