Migrating API Products (with or without Dependent APIs) to Different Environments¶
WSO2 API Controller (apictl) allows you to maintain multiple environments running on the same WSO2 API Manager (WSO2 API-M) version. This allows you to import and export API Products between your environments. For example, if you have an API Product running in the development environment, you can export it and import it to the production environment. Thereby, API Products do not have to be created from scratch in different environments.
Info
Before you begin
-
Make sure apictl is initialized and setup, if not follow the steps in Download and Initialize the apictl.
-
Make sure to add an environment before you start working with the following apictl commands, because all API Products need to be imported or exported to/from a specific environment.
For more information, visit Add an Environment.
Tip
A user with Internal/devops
role or admin
role are allowed to import/export API Products. To create a custom user who can import/export APIs, refer Steps to Create a Custom User who can Perform API Controller Operations.
Export an API Product¶
-
Log in to the WSO2 API-M in the exporting environment by following steps in Login to an Environment.
Tip
If you are already logged-in and your logged-in credentials and keys are already available in the
<USER_HOME>/.wso2apictl/keys.json
file, you can skip this step.Info
If you skip step 1 and if no keys exist for the environment in the
<USER_HOME>/.wso2apictl/keys.json
file, you will be prompt to log in to the environment when running the next command. -
Run any of the following apictl commands to export an API Product as a
.zip
archive.-
Command
apictl export api-product -n <API Product-name> --rev <revision-number> -r <provider> -e <environment>
apictl export api-product --name <API Product-name> --provider <provider> --environment <environment>
apictl export api-product -n <API Product-name> --rev <revision-number> -r <provider> -e <environment> --preserve-status=<preserve-status> --format <export-format>
Info
Flags:
- Required :
--name
or-n
: Name of the API Product to be exported
--environment
or-e
: Environment from which the API Product should be exported - Optional :
--rev
: Revision Number of the API Product. If not provided, working copy of the API Product will be exported.
--provider
or-r
: Provider of the API Product.
--preserve-status
: Preserve API Product status when exporting. Otherwise, the API Product will be exported in the CREATED status The default value is true. (Please note that this flag is only applicable to the API Products. The status of dependant APIs will not get affected).
--latest
: Export the latest revision of the API Product.
--format
: File format of exported archive (JSON or YAML). The default value is YAML.
Example
apictl export api-product -n LeasingAPIProduct -e dev
apictl export api-product -n CreditAPIProduct --rev 2 -r admin -e production --preserve-status=true --format JSON
- Required :
-
Response
Successfully exported API Product! Find the exported API Product at <USER_HOME>/.wso2apictl/exported/api-products/<envrionment-name>/<API Product-name>_1.0.0.zip
Successfully exported API Product! Find the exported API Product at /Users/kim/.wso2apictl/exported/api-products/dev/LeasingAPIProduct_1.0.0.zip
-
The exported ZIP file has the following structure:
<APIProductName>-version
├── api_product.yaml
├── api_product_meta.yaml
├── deployment_environments.yaml
├── Client-certificates
│ ├── Alias1.crt
│ ├── Alias2.crt
│ └── client_certificates.yaml
├── APIs
│ ├── <1stAPIName>_version
│ |── <2ndAPIName>_version
| |──
| └── <NthAPIName>_version
├── Definitions
| └── swagger.yaml
├── Docs
│ ├── Doc1
│ │ ├── document-file.pdf
│ │ └── document.yaml
│ ├── Doc2
│ │ ├── Doc2
│ │ └── document.yaml
│ ├── Doc3
│ │ ├── Doc3
│ │ └── document.yaml
│ └── Doc4
│ └── document.yaml
└── Image
└── <imageName>.extension
The structure of an exported API Product ZIP file is explained below:
Sub Directory/File | Description |
---|---|
api_product.yaml |
Contains all the basic information required for an API Product to be imported to another environment. |
api_product_meta.yaml |
The meta-information file of the source artifact (This includes the name and the version of the API Product. Since currently we do not have the version support for API Products, the version will be always 1.0.0). |
deployment_environments.yaml |
If the exported revision is deployed in one or more gateway environments, this file will contain the list of those deployed gateways.
|
APIs | Dependent APIs (the APIs which the resources of the API Product belong to) will be exported into subfolders with the name format <APIName>_version . |
Client-certificates | If the API Product is secured using MutualSSL, this folder will contain the information related to the API Product.
client_certificates.yaml file, this folder contains the certificate files (.crt). These file names should be included in the client_certificates.yaml by mapping to the corresponding alias name. Below is an example file for a client_certificates.yaml file which has mapped the certificates Alias1.crt and Alias2.crt to the corresponding aliases Alias1 and Alias2 accordingly.
|
Definitions | This folder will contain the definition file associated to a particular API Product.
|
Docs | This folder will contain documentation attached to a particular API Product. Each document will have a seperate folder by its name. Each folder will contain a file named document.yaml which will contain the meta information related to a document. Example for a document.yaml file is shown below.
The above example denotes a document for a FILE named document-file.pdf . The corresponding file will be inside the individual folder of the Docs directory.
If the you have attached an INLINE document, the sourceType will be changed to INLINE and the field named fileName will not be available. The inline content of that particular document will be included in the same individual document directory named by the document name (E.g., Doc2 ).
Similarly if you have attached a MARKDOWN document, the sourceType will be changed to MARKDOWN and there will not be a field named fileName . The markdown content of that particular document will be included in the same individual document directory named by the document name (E.g., Doc3 ).
If the document is just a URL, the sourceType will be changed to URL and a field named sourceURL will be there which will consist the URL of the document.
|
Image | Thumbnail image of the API Product. |
Import an API Product¶
You can use the API Product archive exported from the previous section (or you can extract it and use the extracted folder) and import it to the WSO2 API-M instance in the target environment. When importing the API Product, you can either create the API Product as a new API Product or seamlessly update an existing API Product in the environment with it.
If the API Product archive contains information about deployment environments in the deployment_environments.yaml
file,
once the API Product is successfully created or updated, a new revision will be created and that revision will be deployed in the
mentioned gateway environments. If the deployment environments are not provided, only the working copy will be updated.
-
Log in to the WSO2 API-M in the importing environment by following steps in Login to an Environment.
Tip
If you are already logged-in and your logged-in credentials and keys are already available in the
<USER_HOME>/.wso2apictl/keys.json
file, you can skip this step.Info
If you skip step 1 and if no keys exist for the environment in the
<USER_HOME>/.wso2apictl/keys.json
file, you will be prompt to log in to the environment when running the next command. -
Run any of the following apictl commands to import an API Product.
-
Command
apictl import api-product -f <path-to-API-Product-archive> -e <environment> --import-apis
apictl import api-product -f <path-to-API-Product-archive> -e <environment>
apictl import api-product --file <path-to-API-Product-archive> --environment <environment>
apictl import api-product --file <path-to-API-Product-archive> --environment <environment> --update-api-product=<update_api_product>
apictl import api-product --file <path-to-API-Product-archive> --environment <environment> --preserve-provider=<preserve_provider> --update-apis=<update_apis> --skip-cleanup=<skip-cleanup> --params <environment-params-file> --rotate-revision
Info
Flags:
- Required :
--file
or-f
: The file path of the API Product to import.
--environment
or-e
: Environment to which the API Product should be exported. - Optional :
--preserve-provider
: Preserve existing provider of API Product after importing. Default value istrue
.
--rotate-revision
: If the maximum revision limit reached, delete the oldest revision and create a new revision.
--skip-deployments
: Skip the deployment environments specified in the project and only update the working copy of the API Product.
--import-apis
: Import depedent APIs to the environment along with the API Product. Default value isfalse
.
--update-api-product
: Update an existing API Product or create a new API Product in the importing environment. Default value isfalse
.
--update-apis
: Update dependent APIs of the API Product. Default value isfalse
.
--params
: Define the API Manager environment params file.
--skip-cleanup
: Leave all temporary files created in the apictl during import process. Default value isfalse
.
Example
apictl import api-product -f dev/LeasingAPIProduct_1.0.0.zip -e production --import-apis=true
apictl import api-product -f dev/LeasingAPIProduct_1.0.0.zip -e production --rotate-revision
apictl import api-product --file /home/user/api-products/LeasingAPIProduct_1.0.0.zip --environment production
apictl import api-product --file /home/user/api-products/LeasingAPIProduct_1.0.0.zip --environment production --update-apis=true --rotate-revision
apictl import api-product --file /home/user/api-products/LeasingAPIProduct_1.0.0.zip --environment production --update-api-product=true
apictl import api-product -f dev/LeasingAPIProduct_1.0.0.zip -e production --preserve-provider=false --update-apis=true
apictl import api-product -f dev/LeasingAPIProduct_1.0.0.zip -e production --preserve-provider=false --update-apis=true --params dev/api_product_params.yaml
Tip
If your file path is
/Users/kim/.wso2apictl/exported/api-products/dev/LeasingAPIProduct_1.0.0.zip.
, then you need to enterdev/LeasingAPIProduct_1.0.0.zip
as the value for--file
or-f
flag.Tip
You do not need to set
--import-apis
flag to true if the dependent APIs are already inside the environment. So that, the tool will try only to import the API Product.Tip
If you set
--update-apis
flag to true, it will make--update-api-product
flag true as well.Tip
When using
--update-api-product
or--update-apis
flags withimport api-product
command, the apictl tool will check if the given API Product exists in the targeted environment. If the API Product exists, it will update the existing API Product. If not, it will create a new API Product in the imported environment. - Required :
-
Response
Successfully imported API Product!
Note
Changes to the import command with the revision support for API Products
- From WSO2 API-M 4.0.0 onwards, you have to create a new revision in order to deploy both APIs and API Products in an gateway environment and only a revision can be deployed in a gateway environment.
- With the import command of the apictl, if the API Product project has specified the deployment environments, import will first update the working copy of the API Product and dependent APIs.
- If the number of revisions created for that API Product does not exceed the max revision limit of 5, a new revision of that API Product will be created and that revision will be deployed in the specified gateway environments.
- If the max revision numbers is reached, imported API Product will only update the working copy and not be deployed in the specified gateway environments.
- You can use
--rotate-revision
flag with the import command and if the max revision limit reached, import operation will delete the earliest revision for that API Product and create a new revision. This new revision will be deployed in the specified gateway environments. - If dependent APIs also imported with the Product, a revision for the APIs will be created as well and they will be deployed in the parent API Product's deployment environments.
Note
Preserving Provider while Importing API Product
The
--preserve-provider
flag is used to decide whether to keep the actual provider as the provider of the API Product and the depedent APIs or change the provider to the user who is importing the API Product to a different environment.As an example, If
--preserve-provider
is set totrue
, when importing an API Product created by user-1 in environment-1 will be preserved with user-1 as the provider when and after importing that API Product to environment-2 by user-2. If--preserve-provider
is set tofalse
, when importing that API Product created by user-1 to the environment-2, the provider will be changed (not preserved) to user-2 who is importing the API Product. (Same goes with dependent APIs as well)Tip
You must add the flag
--preserve-provider
to the apictl command and set its value tofalse
if the API Product is imported to a different domain than its exported one. So it sets the provider of the imported API Product to the user who is issuing the apictl command. -
Note
Configuring Environment Specific Parameters
When the importing and exporting environments are different, before importing the API Product, you may need to update the exported API Product with details relevant to the importing environment. For example, the subscription policies, MutualSSL certificates and deployment environments of an API Product might differ between the dev and production environments. Furthermore, when considering the dependent APIs of an API product, the production and sandbox URLs, the timeout configurations, the backend certificates of your endpoints might differ between environments as well. To allow easily configuring environment-specific details, by default apictl supports an additional parameter file. For more information on using an environment parameter file for API Products, see Defining the params file for an API Product.
Add dynamic data to environment configs
The above parameter file supports detecting environment variables during the API Product import process. For more information on using dynamic data, see Add dynamic data to environment configs.
Info
Tiers are provider-specific. If an exported tier is not already available in the importing environment, that tier is not added to the new environment.
Tip
Troubleshooting
After importing, if the API Products or the dependent APIs are not visible in the WSO2 API-M Publisher UI, do the following to re-index the artifacts in the registry.
-
Shut down the WSO2 API-M 4.1.0, backup and delete the
<API-M_4.1.0_HOME>/solr
directory. -
Rename the
<lastAccessTimeLocation>
element in the<API-M_4.1.0_HOME>/repository/conf/registry.xml
file. If you use a distributed WSO2 API-M setup, change the file in the API Publisher node. For example, change the/_system/local/repository/components/org.wso2.carbon.registry/indexing/lastaccesstime
registry path to/_system/local/repository/components/org.wso2.carbon.registry/indexing/lastaccesstime_1
-
Restart WSO2 API-M 4.1.0 server.
Import/Export API Products in tenanted environments¶
The environments that you create will be common to the admin and the tenants. Therefore, you do not need to create environments again when exporting and importing API Products between tenanted environments.
Warning
When exporting and importing an API Product across tenanted environments, the --preserve-provider
flag value should be set to false
as the original provider username in the exporting environment does not exist in the importing environment.