A customer of mine was using one of the earliest releases of v10
. The standard backup and restore proceess wasn’t applicable due to several reasons.
The goal was to migrate Catalogs
content from the current deployment to the new eus deployment - v10.0.1.5-eus
at the time.
The process was tricky because of the dependencies between the artifacts. The below diagram illistrates them in high level.
I decided to breakdown the process in 2 stage in order to minimize the errors on the source-instance:
Stage 1: Export from the source-instance
- Backup encryption-secret
$ oc get secret management-enc-key -n <APIC-namespace> -o yaml > management-enc-key.yaml
- Backup Management client application credential secrets
$ oc get mgmt -n <APIC-namespace> -o yaml | grep CredentialSecret
For every item in the list, perform:
$ oc get secret <secret_name> -n <APIC-namespace> -o yaml > <secret_name>.yaml
You must edit each of the saved YAML files and remove both the ownerReferences subsection and the selfLink property.
- Login to API Manager instance
$ apic login --username $username --password $password --server $api_mgmt --realm $realm
- Clone APIs & Products
$ mkdir product && cd "$_"
$ apic products:clone --scope space -s $api_mgmt -o $api_org -c $catalog --space $space
- Clone users, and do the requried changes
$ users=$(apic users:list -s $api_mgmt -o $api_org --user-registry $lur | sed "s| .*||"))
$ userarray=($users)
$ mkdir users && cd "$_"
for user in "${userarray[@]}"; do
apic users:get $user -s $api_mgmt -o $api_org --user-registry $lur
# remove identity_provider:
sed -i '/identity_provider/d' $user.yaml
# append the default password to the user yaml
echo "password: 7iron-hide" >> $user.yaml
done
- Clone consumer orgs, associate apps, credentials and subscriptions
$ mkdir corgs && cd "$_"
for corg in $(apic consumer-orgs:list --server $api_mgmt -o $api_org -c $catalog | sed "s| .*||"); do
mkdir $corg
cd $corg
apic consumer-orgs:get $corg -s $api_mgmt -o $api_org -c $catalog
for app in $(apic apps:list --server$api_mgmt -o $api_org -c $catalog --consumer-org $corg --space $space --space-initiated | sed "s| .*||"); do
mkdir $app
cd $app
# get app per consumer org
apic apps:get $app.yaml --server $api_mgmt -o $api_org -c $catalog--consumer-org $corg
mkdir creds
cd creds
# get cred per app
for cred in $(apic credentials:list--server $api_mgmt -o $api_org -c $catalog --consumer-org $corg -a $app | sed "s| .*||"); do
apic credentials:get $cred.yaml --server $api_mgmt -o $api_org -c $catalog --consumer-org $corg -a $app
done
cd ..
mkdir subs
cd subs
# get products name
apic products:list-all --scope space -s $api_mgmt -o $api_org -c $catalog --space $src_space > prod-name-id.txt
# get subs per app
for sub in $(apic subscriptions:list --server $api_mgmt -o $api_org -c $catalog --consumer-org $corg -a $app | sed "s| .*||"); do
apic subscriptions:get $sub.yaml --server $api_mgmt -o $api_org -c $catalog --consumer-org $corg -a $app
done
cd ../..
done
cd ..
done
Stage 2: Import to the target-instance
- Apply the Management and Portal encryption secrets to the cluster where you will install API Connect
$ oc apply -f mgmt-enc-key.yaml
- Add the saved Management encryption secrets to the installation CR
spec:
management:
encryptionSecret:
secret_name: mgmt-enc-key
Install the APIConnect, and wait until it gets successfully ready
- Import Products
cd products
for product in "$(ls | head -6 )"; do
# echo $prod
apic products:publish $product --scope space -s $target_host -o $target_org -c $target_catalog --space $target_space
done
- Import users
cd users
for user in "$(ls | head -6 )"; do
# echo $prod
apic users:create $user -s $target_host -o $target_org --user-registry $target_lur
done
- Import consumers org
cd corgs
for corg in "$( ls | head-6)"; do
# find the owner name of the corg:
owner_src_id=$(grep users $corg | sed "s|.*users/||")
owner_name=$(grep $owner_src_id ../users/* -l | sed "s|.yaml||" | sed "s|.*/||")
# replace src owner url with target owner url
target_owner_url=https://$target_host/api/user-registries/$target_org/$target_lur/users/$owner_name
sed -i "s|https.*users.*|$target_owner_url|" $corg
# create the corg in the target catalog
apic consumer-orgs:create $corg -s $target_host -o $target_org -c $target_catalog
done
- Import apps, credentials and subscriptions
for app in $(ls -l apps/* | awk '{ print $1 }'); do
sed -i '/app_credential_urls/,$d' apps/$app.yaml
# create app
apic apps:create apps/$app -s $target_host -o $target_org -c $target_catalog --consumer-org ${PWD##*/}
first=1
for cred in $(apps/$app/creds/* | awk '{ print $1 }'); do
if [ $first -eq 1 ]; then
first=0
# update cred
apic credentials:update credential-for-$app apps/$app/creds/$cred.yaml -s $target_host -o $target_org -c $target_catalog --consumer-org ${PWD##*/} -a $app
else
# create cred
apic credentials:create $cred.yaml -s $target_host -o $target_org -c $target_catalog --consumer-org ${PWD##*/} -a $app
fi
done
for sub in $(apps/$app/subs/*.yaml | awk '{ print $1 }'); do
prod_id=$(grep \/products\/ $sub | sed "s|.*/products/||")
prod_name_ver=$(grep $prod_id prod-name-id.txt | sed "s| .*||" | sed "s|:|/|")
if [ -z "$prod_name_ver" ]; then
continue
fi
target_product_url=https://$target_host/api/catalogs/$target_catalog/$target_space/products/$prod_name_ver
sed -i "s|https.*products.*|$target_product_url|" $sub.yaml
# create sub
apic subscriptions:create $sub -s $target_host -o $target_org -c $target_catalog --consumer-org ${PWD##*/} -a $app
done
done
For referance, always refer to official documentations apic commands
Shout out to the Kai Mike Zhang, the above works were insprired by the orignal masterpiece he created.