# Upgrade from 4.0.2 to 4.0.3

## Upgrading instructions

Follow these instructions if you are upgrading from **4.0.2 to 4.0.3**. The current installation 4.0.2 could have been installed using **Helm** ([**Scenario A**](#scenario-a)) or the **GitOps** installer ([**Scenario B**](#scenario-b)). Please follow the steps as per your present scenario.

{% hint style="warning" %}
**WARNING**: Before starting the upgrade, take a backup of all the databases, particularly the Postgres DB. The backup procedures may vary depending on your use of external DBs and Spinnaker configuration.
{% endhint %}

### **Scenario A**

Use these instructions if:&#x20;

* You have a 4.0.2 ISD installed using the **helm installer**&#x20;
* Already have a **gitops-repo** for Spinnaker Configuration&#x20;
* Have **values.yaml** that was used for helm installation

Execute the following commands, replace **gitops-repo** with your repo

* `git clone` <https://github.com/.../gitops-repo>
* `git clone https://github.com/OpsMx/standard-isd-gitops.git -b 4.0.3`
* `cp -r standard-isd-gitops/upgrade gitops-repo`
* `cd gitops-repo`
* Copy the existing "**values.yaml**" used for the previous installation into this folder. We will call it **values-402.yaml.**
* diff **values-402.yaml** **values-403.yaml** and merge all of your changes into "**values.yaml**".

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p><strong>Note</strong>: Most of the time, it suffices to replace images with version number <strong>4.0.2 to 4.0.3</strong>.</p></div>
* Copy the updated values file as "values.yaml" (File name is mandatory).
* Create gittoken secret. This token will be used to authenticate to the gitops-repo.<br>

  <pre data-overflow="wrap"><code>kubectl -n opsmx-isd create secret generic gittoken --from-literal gittoken=PUT_YOUR_GITTOKEN_HERE
  </code></pre>
* Create the secrets as mentioned above. Note that, these secrets only need to be created if they differ from the default.<br>

  <pre data-overflow="wrap"><code>kubectl -n opsmx-isd create secret generic ldapconfigpassword --from-literal ldapconfigpassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic ldappassword --from-literal ldappassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic miniopassword --from-literal miniopassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic redispassword --from-literal redispassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic saporpassword --from-literal saporpassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic rabbitmqpassword --from-literal rabbitmqpassword=PUT_YOUR_SECRET_HERE
  kubectl -n opsmx-isd create secret generic keystorepassword --from-literal keystorepassword=PUT_YOUR_SECRET_HERE
  </code></pre>

### **Scenario B**

Use these instructions if:&#x20;

* You have a 4.0.2 ISD installed using **GitOps installer**&#x20;
* Already have a **gitops-repo** for ISD (AP and Spinnaker) Configuration

Execute the following commands, replace "**gitops-repo**" with your repo

* `git clone` <https://github.com/.../gitops-repo>
* `git clone https://github.com/OpsMx/standard-isd-gitops.git -b 4.0.3`
* `cp -r standard-isd-gitops/upgrade gitops-repo`
* `cd gitops-repo`
* Check that a "**values.yaml**" file exists in this directory (root of the gitops-repo).

### Common Steps

Upgrade sequence: (4.0.2 to 4.0.3)

1. Ensure that "**default**" account is configured to deploy to the ISD namespace (E.g. opsmx-isd)
2. If you have modified "**sampleapp**" or "**opsmx-gitops**" applications, take a backup of them using "**syncToGit**" pipeline opsmx-gitops application.
3. Copy the bom from standard-isd-gitops.git to the gitops-repo.\
   `cp -r standard-isd-gitops/bom gitops-repo/`
4. If there are any custom settings done for spinnaker please update those changes accordingly in ***gitops-repo/default/profiles***.
5. `cd upgrade`&#x20;
6. Update **upgrade-inputcm.yaml**:&#x20;
   * URL, username, and gitemail must be updated. If you have **install/inputcm.yaml** from previous installation, copy-paste those lines here.
   * **If ISD Namespace is different from** "**opsmx-isd**": Update namespace (default is opsmx-isd) to the namespace where ISD is installed.
   * If you are external Mysql for Spinnaker, update the spinnakerStorage value to "**sql**".
7. **If ISD Namespace is different from** "**opsmx-isd**": Edit **serviceaccount.yaml** and edit "**namespace**:" to update it to the ISD namespace (E.g: opsmx-isd).
8. **Push changes to git**: `git add -A; git commit -m"Upgrade related changes";git push`&#x20;
9. `kubectl -n opsmx-isd apply -f upgrade-inputcm.yaml`
10. `kubectl -n opsmx-isd apply -f serviceaccount.yaml` # Edit namespace if changed from the default "**opsmx-isd**".
11. `kubectl -n opsmx-isd replace --force -f ISD-Generate-yamls-job.yaml` \[ Wait for isd-generate-yamls-\* pod to complete ]
12. **Compare and merge branch**: This job should have created a branch on the **gitops-repo** with the helmchart version number specified in **upgrade-inputcm.yaml**.\
    Raise a PR and check what changes are being made. Once satisfied, merge the PR.&#x20;
13. `kubectl -n opsmx-isd replace --force -f ISD-Apply-yamls-job.yaml` Wait for isd-yaml-update-\* pod to complete, and all pods to stabilize.
14. isd-spinnaker-halyard-0 pod should restart automatically. If not, execute this: `kubectl -n opsmx-isd delete po isd-spinnaker-halyard-0`
15. Restart all pods:&#x20;
    * `kubectl -n opsmx-isd scale deploy -l app=oes --replicas=0`Wait for few a minutes.
    * `kubectl -n opsmx-isd scale deploy -l app=oes --replicas=1`Wait until every pod comes to the ready state.&#x20;
16. Go to ISD UI and check that the version number has changed in the the top-right corner.
17. Wait for about five minutes for autoconfiguration to take place.
18. If required: Connect Spinnaker again and Configure pipeline promotion again. To do this, in the ISD UI follow the below steps :&#x20;
    * Click **Setup**&#x20;
    * Click **Spinnaker tab** at the top. Check if "**External Accounts**" and "Pipeline-promotion" columns show "**yes**".&#x20;
    * If any of them is "**no**": Click "**edit**" on the three dots on the far right. Check the values already updated in, make changes if required, and click "**update**".&#x20;
    * Restart the halyard pod by clicking "**Sync CD Accounts** " on the Cloud Targets page or simply delete the halyard pod.

### **If an upgrade fails**

As we have a gitops installer, recovering from a failed install/upgrade is easy. In summary, simply delete all objects or re-apply. Follow the steps below to recover.

As a first step. Please try the "[**Troubleshooting**](https://docs.opsmx.com/additional-resources/troubleshooting/troubleshooting-isd-gitops-installation-issues)" section if you are facing any issues during the Installation.

#### **Reinstall ISD**

Make changes to **upgrade-inputcm** and/or **values.yaml** as required. Ensure that the changes are pushed to git.

1. `kubectl -n oes delete sts isd-spinnaker-halyard`
2. `kubectl -n oes delete deploy --all`
3. `kubectl -n oes delete svc --all`
4. `kubectl -n oes replace --force -f ISD-Apply-yamls-job.yaml`
5. Wait for all the pods to come up

### Rollback from v4.0.3 to v4.0.2

1. Create a PR to revert the changes which is merged as part of step 12.\
   \
   `kubectl -n opsmx-isd replace --force -f ISD-Apply-yamls-job.yaml` # Wait for the pods to stabilize.
2. Restart all pods:<br>

   `kubectl -n opsmx-isd scale deploy -l app=oes --replicas=0` # Wait for a few minutes. \
   `kubectl -n opsmx-isd scale deploy -l app=oes --replicas=1` # Wait for all pods to come to ready state.
