diff --git a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-member-recover.sh b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-member-recover.sh index 0ccfd2cd74..1d58c64d97 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-member-recover.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-member-recover.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100'%0A%20%20%20%20exit%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%2Fetc%2Fkubernetes%2Fmanifests-stopped%0A%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20download_cert_recover_template%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20and%20etcd%20name%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0AETCD_NAME%3D%242%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AMANIFEST_STOPPED_DIR%3D%22%24ASSET_DIR%2Fmanifests-stopped%22%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-backup.sh b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-backup.sh index 4022de9ecc..72b2381423 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-backup.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-backup.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-restore.sh b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-restore.sh index 147a0c4faf..d206870005 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-restore.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-etcd-snapshot-restore.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%0A%23%20etcd-snapshot-restore.sh%20%24path-to-snapshot%20%24etcd-connection-string%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0A%0AETCD_CONNSTRING%3D%22%22%0Aif%20%5B%20%22%242%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20ETCD_CONNSTRING%3D%22%242%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24inital_cluster%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Path%20to%20snapshot%20and%20initial%20cluster%20are%20required%3A%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24initial_cluster'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ASNAPSHOT_FILE%3D%22%241%22%0AETCD_INITIAL_CLUSTER%3D%22%242%22%0AASSET_DIR%3D.%2Fassets%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%20%20ETCD_NAME%3D%24(validate_etcd_name)%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-openshift-recovery-tools b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-openshift-recovery-tools index e23642b7cc..97b53e0642 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-openshift-recovery-tools +++ b/pkg/controller/template/test_data/templates/master/00-master/aws/files/-usr-local-bin-openshift-recovery-tools @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%20%20if%20%5B%20-z%20%22%24%7BETCD_CONNSTRING%7D%22%20%5D%3B%20then%0A%20%20%20%20ETCD_CONNSTRING%3D%22%24%7BETCD_NAME%7D%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380%22%0A%20%20fi%0A%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20sleep%202%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_CONNSTRING%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Adownload_cert_recover_template()%20%7B%0A%20%20curl%20-s%20https%3A%2F%2Fraw.githubusercontent.com%2Fhexfusion%2Fopenshift-recovery%2Fmaster%2Fmanifests%2Fetcd-generate-certs.yaml.template%20-o%20%24ASSET_DIR%2Ftemplates%2Fetcd-generate-certs.yaml.template%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_INITIAL_CLUSTER%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Removing%20etcd%20data_dir%20%24ETCD_DATA_DIR..%22%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20find%20%24%7BMANIFEST_STOPPED_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20daemon-reload%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A%0A%23%20validate_environment%20performs%20the%20same%20actions%20as%20the%20discovery%20container%20in%20etcd-member%20init%0A%23%20sometimes%20%24RUN_ENV%20is%20not%20available%20if%20the%20node%20is%20rebooted%20so%20we%20recreate%20here.%0Avalidate_environment()%20%7B%0A%20%20if%20%5B%20-f%20%22%24RUN_ENV%22%20%5D%20%26%26%20%5B%20-s%20%22%24RUN_ENV%22%20%5D%3Bthen%0A%20%20%20%20return%200%0A%20%20fi%0A%20%20SRV_A_RECORD%3D%24(dig%20%2Bnoall%20%2Banswer%20SRV%20_etcd-server-ssl._tcp.%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'(%3F%3C%3D2380%20).*%5B%5E%5C.%5D'%20%7C%20xargs)%0A%20%20HOST_IPS%3D%24(ip%20-o%20addr%20%7C%20%20grep%20-oP%20'(%3F%3C%3Dinet%20)(%5Cd%7B1%2C3%7D%5C.%3F)%7B4%7D')%0A%0A%20%20if%20%5B%20-z%20%22%24SRV_A_RECORD%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22SRV%20A%20record%20query%20for%20%24%7BDISCOVERY_DOMAIN%7D%20failed%20please%20update%20DNS%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20-z%20%22%24HOST_IPS%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Unable%20to%20find%20any%20IPv4%20addresses%20for%20host%20interfaces%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20for%20a%20in%20%24%7BSRV_A_RECORD%5B%40%5D%7D%3B%20do%0A%20%20%20%20echo%20%22checking%20against%20%24a%22%0A%20%20%20%20for%20i%20in%20%24%7BHOST_IPS%5B%40%5D%7D%3B%20do%0A%20%20%20%20%20%20DIG_IP%3D%24(dig%20%2Bshort%20%24a)%0A%20%20%20%20%20%20if%20%5B%20-z%20%22%24DIG_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22No%20matching%20A%20record%20found%20for%20%24a%20skipping%22%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20elif%20%5B%20%22%24DIG_IP%22%20%3D%3D%20%22%24i%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22dns%20name%20is%20%24a%22%0A%20%20%20%20%20%20%20%20cat%20%3E%20%24RUN_ENV%20%3C%3C%20EOF%0AETCD_IPV4_ADDRESS%3D%24DIG_IP%0AETCD_DNS_NAME%3D%24a%0AETCD_WILDCARD_DNS_NAME%3D*.%24%7BDISCOVERY_DOMAIN%7D%0AEOF%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20done%0A%20%20echo%20%22SRV%20query%20failed%20no%20matching%20records%20found%22%0A%20%20exit%201%0A%7D%0A%0A%23%20validate_etcd_name%20uses%20regex%20to%20return%20the%20etcd%20member%20name%20key%20from%20ETCD_INITIAL_CLUSTER%20matching%20the%20local%20ETCD_DNS_NAME.%0Avalidate_etcd_name()%20%7B%0A%20%20ETCD_NAME%3D%24(echo%20%24%7BETCD_INITIAL_CLUSTER%7D%20%7C%20grep%20-oP%20%22(%3F%3C%3D)%5B%5E%2C%2C%5Cs%5D*(%3F%3D%3D%5B%5E%3D%5D*%24%7BETCD_DNS_NAME%7D%5Cb)%22)%0A%20%20if%20%5B%20-z%20%22%24ETCD_NAME%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22%24%7BETCD_DNS_NAME%7D%20is%20not%20found%20in%20%24%7BETCD_INITIAL_CLUSTER%7D%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20echo%20%22%24ETCD_NAME%22%0A%7D%0A verification: {} filesystem: root mode: 420 diff --git a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-member-recover.sh b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-member-recover.sh index 0ccfd2cd74..1d58c64d97 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-member-recover.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-member-recover.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100'%0A%20%20%20%20exit%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%2Fetc%2Fkubernetes%2Fmanifests-stopped%0A%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20download_cert_recover_template%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20and%20etcd%20name%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0AETCD_NAME%3D%242%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AMANIFEST_STOPPED_DIR%3D%22%24ASSET_DIR%2Fmanifests-stopped%22%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-backup.sh b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-backup.sh index 4022de9ecc..72b2381423 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-backup.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-backup.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-restore.sh b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-restore.sh index 147a0c4faf..d206870005 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-restore.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-etcd-snapshot-restore.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%0A%23%20etcd-snapshot-restore.sh%20%24path-to-snapshot%20%24etcd-connection-string%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0A%0AETCD_CONNSTRING%3D%22%22%0Aif%20%5B%20%22%242%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20ETCD_CONNSTRING%3D%22%242%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24inital_cluster%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Path%20to%20snapshot%20and%20initial%20cluster%20are%20required%3A%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24initial_cluster'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ASNAPSHOT_FILE%3D%22%241%22%0AETCD_INITIAL_CLUSTER%3D%22%242%22%0AASSET_DIR%3D.%2Fassets%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%20%20ETCD_NAME%3D%24(validate_etcd_name)%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-openshift-recovery-tools b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-openshift-recovery-tools index e23642b7cc..97b53e0642 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-openshift-recovery-tools +++ b/pkg/controller/template/test_data/templates/master/00-master/libvirt/files/-usr-local-bin-openshift-recovery-tools @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%20%20if%20%5B%20-z%20%22%24%7BETCD_CONNSTRING%7D%22%20%5D%3B%20then%0A%20%20%20%20ETCD_CONNSTRING%3D%22%24%7BETCD_NAME%7D%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380%22%0A%20%20fi%0A%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20sleep%202%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_CONNSTRING%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Adownload_cert_recover_template()%20%7B%0A%20%20curl%20-s%20https%3A%2F%2Fraw.githubusercontent.com%2Fhexfusion%2Fopenshift-recovery%2Fmaster%2Fmanifests%2Fetcd-generate-certs.yaml.template%20-o%20%24ASSET_DIR%2Ftemplates%2Fetcd-generate-certs.yaml.template%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_INITIAL_CLUSTER%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Removing%20etcd%20data_dir%20%24ETCD_DATA_DIR..%22%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20find%20%24%7BMANIFEST_STOPPED_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20daemon-reload%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A%0A%23%20validate_environment%20performs%20the%20same%20actions%20as%20the%20discovery%20container%20in%20etcd-member%20init%0A%23%20sometimes%20%24RUN_ENV%20is%20not%20available%20if%20the%20node%20is%20rebooted%20so%20we%20recreate%20here.%0Avalidate_environment()%20%7B%0A%20%20if%20%5B%20-f%20%22%24RUN_ENV%22%20%5D%20%26%26%20%5B%20-s%20%22%24RUN_ENV%22%20%5D%3Bthen%0A%20%20%20%20return%200%0A%20%20fi%0A%20%20SRV_A_RECORD%3D%24(dig%20%2Bnoall%20%2Banswer%20SRV%20_etcd-server-ssl._tcp.%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'(%3F%3C%3D2380%20).*%5B%5E%5C.%5D'%20%7C%20xargs)%0A%20%20HOST_IPS%3D%24(ip%20-o%20addr%20%7C%20%20grep%20-oP%20'(%3F%3C%3Dinet%20)(%5Cd%7B1%2C3%7D%5C.%3F)%7B4%7D')%0A%0A%20%20if%20%5B%20-z%20%22%24SRV_A_RECORD%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22SRV%20A%20record%20query%20for%20%24%7BDISCOVERY_DOMAIN%7D%20failed%20please%20update%20DNS%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20-z%20%22%24HOST_IPS%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Unable%20to%20find%20any%20IPv4%20addresses%20for%20host%20interfaces%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20for%20a%20in%20%24%7BSRV_A_RECORD%5B%40%5D%7D%3B%20do%0A%20%20%20%20echo%20%22checking%20against%20%24a%22%0A%20%20%20%20for%20i%20in%20%24%7BHOST_IPS%5B%40%5D%7D%3B%20do%0A%20%20%20%20%20%20DIG_IP%3D%24(dig%20%2Bshort%20%24a)%0A%20%20%20%20%20%20if%20%5B%20-z%20%22%24DIG_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22No%20matching%20A%20record%20found%20for%20%24a%20skipping%22%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20elif%20%5B%20%22%24DIG_IP%22%20%3D%3D%20%22%24i%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22dns%20name%20is%20%24a%22%0A%20%20%20%20%20%20%20%20cat%20%3E%20%24RUN_ENV%20%3C%3C%20EOF%0AETCD_IPV4_ADDRESS%3D%24DIG_IP%0AETCD_DNS_NAME%3D%24a%0AETCD_WILDCARD_DNS_NAME%3D*.%24%7BDISCOVERY_DOMAIN%7D%0AEOF%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20done%0A%20%20echo%20%22SRV%20query%20failed%20no%20matching%20records%20found%22%0A%20%20exit%201%0A%7D%0A%0A%23%20validate_etcd_name%20uses%20regex%20to%20return%20the%20etcd%20member%20name%20key%20from%20ETCD_INITIAL_CLUSTER%20matching%20the%20local%20ETCD_DNS_NAME.%0Avalidate_etcd_name()%20%7B%0A%20%20ETCD_NAME%3D%24(echo%20%24%7BETCD_INITIAL_CLUSTER%7D%20%7C%20grep%20-oP%20%22(%3F%3C%3D)%5B%5E%2C%2C%5Cs%5D*(%3F%3D%3D%5B%5E%3D%5D*%24%7BETCD_DNS_NAME%7D%5Cb)%22)%0A%20%20if%20%5B%20-z%20%22%24ETCD_NAME%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22%24%7BETCD_DNS_NAME%7D%20is%20not%20found%20in%20%24%7BETCD_INITIAL_CLUSTER%7D%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20echo%20%22%24ETCD_NAME%22%0A%7D%0A verification: {} filesystem: root mode: 420 diff --git a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-member-recover.sh b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-member-recover.sh index 0ccfd2cd74..1d58c64d97 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-member-recover.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-member-recover.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100'%0A%20%20%20%20exit%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%2Fetc%2Fkubernetes%2Fmanifests-stopped%0A%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20download_cert_recover_template%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20and%20etcd%20name%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0AETCD_NAME%3D%242%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AMANIFEST_STOPPED_DIR%3D%22%24ASSET_DIR%2Fmanifests-stopped%22%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-backup.sh b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-backup.sh index 4022de9ecc..72b2381423 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-backup.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-backup.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-restore.sh b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-restore.sh index 147a0c4faf..d206870005 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-restore.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-etcd-snapshot-restore.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%0A%23%20etcd-snapshot-restore.sh%20%24path-to-snapshot%20%24etcd-connection-string%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0A%0AETCD_CONNSTRING%3D%22%22%0Aif%20%5B%20%22%242%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20ETCD_CONNSTRING%3D%22%242%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24inital_cluster%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Path%20to%20snapshot%20and%20initial%20cluster%20are%20required%3A%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24initial_cluster'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ASNAPSHOT_FILE%3D%22%241%22%0AETCD_INITIAL_CLUSTER%3D%22%242%22%0AASSET_DIR%3D.%2Fassets%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%20%20ETCD_NAME%3D%24(validate_etcd_name)%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-openshift-recovery-tools b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-openshift-recovery-tools index e23642b7cc..97b53e0642 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-openshift-recovery-tools +++ b/pkg/controller/template/test_data/templates/master/00-master/none/files/-usr-local-bin-openshift-recovery-tools @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%20%20if%20%5B%20-z%20%22%24%7BETCD_CONNSTRING%7D%22%20%5D%3B%20then%0A%20%20%20%20ETCD_CONNSTRING%3D%22%24%7BETCD_NAME%7D%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380%22%0A%20%20fi%0A%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20sleep%202%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_CONNSTRING%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Adownload_cert_recover_template()%20%7B%0A%20%20curl%20-s%20https%3A%2F%2Fraw.githubusercontent.com%2Fhexfusion%2Fopenshift-recovery%2Fmaster%2Fmanifests%2Fetcd-generate-certs.yaml.template%20-o%20%24ASSET_DIR%2Ftemplates%2Fetcd-generate-certs.yaml.template%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_INITIAL_CLUSTER%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Removing%20etcd%20data_dir%20%24ETCD_DATA_DIR..%22%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20find%20%24%7BMANIFEST_STOPPED_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20daemon-reload%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A%0A%23%20validate_environment%20performs%20the%20same%20actions%20as%20the%20discovery%20container%20in%20etcd-member%20init%0A%23%20sometimes%20%24RUN_ENV%20is%20not%20available%20if%20the%20node%20is%20rebooted%20so%20we%20recreate%20here.%0Avalidate_environment()%20%7B%0A%20%20if%20%5B%20-f%20%22%24RUN_ENV%22%20%5D%20%26%26%20%5B%20-s%20%22%24RUN_ENV%22%20%5D%3Bthen%0A%20%20%20%20return%200%0A%20%20fi%0A%20%20SRV_A_RECORD%3D%24(dig%20%2Bnoall%20%2Banswer%20SRV%20_etcd-server-ssl._tcp.%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'(%3F%3C%3D2380%20).*%5B%5E%5C.%5D'%20%7C%20xargs)%0A%20%20HOST_IPS%3D%24(ip%20-o%20addr%20%7C%20%20grep%20-oP%20'(%3F%3C%3Dinet%20)(%5Cd%7B1%2C3%7D%5C.%3F)%7B4%7D')%0A%0A%20%20if%20%5B%20-z%20%22%24SRV_A_RECORD%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22SRV%20A%20record%20query%20for%20%24%7BDISCOVERY_DOMAIN%7D%20failed%20please%20update%20DNS%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20-z%20%22%24HOST_IPS%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Unable%20to%20find%20any%20IPv4%20addresses%20for%20host%20interfaces%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20for%20a%20in%20%24%7BSRV_A_RECORD%5B%40%5D%7D%3B%20do%0A%20%20%20%20echo%20%22checking%20against%20%24a%22%0A%20%20%20%20for%20i%20in%20%24%7BHOST_IPS%5B%40%5D%7D%3B%20do%0A%20%20%20%20%20%20DIG_IP%3D%24(dig%20%2Bshort%20%24a)%0A%20%20%20%20%20%20if%20%5B%20-z%20%22%24DIG_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22No%20matching%20A%20record%20found%20for%20%24a%20skipping%22%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20elif%20%5B%20%22%24DIG_IP%22%20%3D%3D%20%22%24i%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22dns%20name%20is%20%24a%22%0A%20%20%20%20%20%20%20%20cat%20%3E%20%24RUN_ENV%20%3C%3C%20EOF%0AETCD_IPV4_ADDRESS%3D%24DIG_IP%0AETCD_DNS_NAME%3D%24a%0AETCD_WILDCARD_DNS_NAME%3D*.%24%7BDISCOVERY_DOMAIN%7D%0AEOF%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20done%0A%20%20echo%20%22SRV%20query%20failed%20no%20matching%20records%20found%22%0A%20%20exit%201%0A%7D%0A%0A%23%20validate_etcd_name%20uses%20regex%20to%20return%20the%20etcd%20member%20name%20key%20from%20ETCD_INITIAL_CLUSTER%20matching%20the%20local%20ETCD_DNS_NAME.%0Avalidate_etcd_name()%20%7B%0A%20%20ETCD_NAME%3D%24(echo%20%24%7BETCD_INITIAL_CLUSTER%7D%20%7C%20grep%20-oP%20%22(%3F%3C%3D)%5B%5E%2C%2C%5Cs%5D*(%3F%3D%3D%5B%5E%3D%5D*%24%7BETCD_DNS_NAME%7D%5Cb)%22)%0A%20%20if%20%5B%20-z%20%22%24ETCD_NAME%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22%24%7BETCD_DNS_NAME%7D%20is%20not%20found%20in%20%24%7BETCD_INITIAL_CLUSTER%7D%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20echo%20%22%24ETCD_NAME%22%0A%7D%0A verification: {} filesystem: root mode: 420 diff --git a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-member-recover.sh b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-member-recover.sh index 0ccfd2cd74..1d58c64d97 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-member-recover.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-member-recover.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100'%0A%20%20%20%20exit%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%2Fetc%2Fkubernetes%2Fmanifests-stopped%0A%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20download_cert_recover_template%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20and%20etcd%20name%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0AETCD_NAME%3D%242%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AMANIFEST_STOPPED_DIR%3D%22%24ASSET_DIR%2Fmanifests-stopped%22%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-backup.sh b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-backup.sh index 4022de9ecc..72b2381423 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-backup.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-backup.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-restore.sh b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-restore.sh index 147a0c4faf..d206870005 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-restore.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-etcd-snapshot-restore.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%0A%23%20etcd-snapshot-restore.sh%20%24path-to-snapshot%20%24etcd-connection-string%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0A%0AETCD_CONNSTRING%3D%22%22%0Aif%20%5B%20%22%242%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20ETCD_CONNSTRING%3D%22%242%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24inital_cluster%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Path%20to%20snapshot%20and%20initial%20cluster%20are%20required%3A%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24initial_cluster'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ASNAPSHOT_FILE%3D%22%241%22%0AETCD_INITIAL_CLUSTER%3D%22%242%22%0AASSET_DIR%3D.%2Fassets%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%20%20ETCD_NAME%3D%24(validate_etcd_name)%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-openshift-recovery-tools b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-openshift-recovery-tools index e23642b7cc..97b53e0642 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-openshift-recovery-tools +++ b/pkg/controller/template/test_data/templates/master/00-master/openstack/files/-usr-local-bin-openshift-recovery-tools @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%20%20if%20%5B%20-z%20%22%24%7BETCD_CONNSTRING%7D%22%20%5D%3B%20then%0A%20%20%20%20ETCD_CONNSTRING%3D%22%24%7BETCD_NAME%7D%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380%22%0A%20%20fi%0A%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20sleep%202%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_CONNSTRING%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Adownload_cert_recover_template()%20%7B%0A%20%20curl%20-s%20https%3A%2F%2Fraw.githubusercontent.com%2Fhexfusion%2Fopenshift-recovery%2Fmaster%2Fmanifests%2Fetcd-generate-certs.yaml.template%20-o%20%24ASSET_DIR%2Ftemplates%2Fetcd-generate-certs.yaml.template%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_INITIAL_CLUSTER%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Removing%20etcd%20data_dir%20%24ETCD_DATA_DIR..%22%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20find%20%24%7BMANIFEST_STOPPED_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20daemon-reload%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A%0A%23%20validate_environment%20performs%20the%20same%20actions%20as%20the%20discovery%20container%20in%20etcd-member%20init%0A%23%20sometimes%20%24RUN_ENV%20is%20not%20available%20if%20the%20node%20is%20rebooted%20so%20we%20recreate%20here.%0Avalidate_environment()%20%7B%0A%20%20if%20%5B%20-f%20%22%24RUN_ENV%22%20%5D%20%26%26%20%5B%20-s%20%22%24RUN_ENV%22%20%5D%3Bthen%0A%20%20%20%20return%200%0A%20%20fi%0A%20%20SRV_A_RECORD%3D%24(dig%20%2Bnoall%20%2Banswer%20SRV%20_etcd-server-ssl._tcp.%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'(%3F%3C%3D2380%20).*%5B%5E%5C.%5D'%20%7C%20xargs)%0A%20%20HOST_IPS%3D%24(ip%20-o%20addr%20%7C%20%20grep%20-oP%20'(%3F%3C%3Dinet%20)(%5Cd%7B1%2C3%7D%5C.%3F)%7B4%7D')%0A%0A%20%20if%20%5B%20-z%20%22%24SRV_A_RECORD%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22SRV%20A%20record%20query%20for%20%24%7BDISCOVERY_DOMAIN%7D%20failed%20please%20update%20DNS%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20-z%20%22%24HOST_IPS%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Unable%20to%20find%20any%20IPv4%20addresses%20for%20host%20interfaces%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20for%20a%20in%20%24%7BSRV_A_RECORD%5B%40%5D%7D%3B%20do%0A%20%20%20%20echo%20%22checking%20against%20%24a%22%0A%20%20%20%20for%20i%20in%20%24%7BHOST_IPS%5B%40%5D%7D%3B%20do%0A%20%20%20%20%20%20DIG_IP%3D%24(dig%20%2Bshort%20%24a)%0A%20%20%20%20%20%20if%20%5B%20-z%20%22%24DIG_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22No%20matching%20A%20record%20found%20for%20%24a%20skipping%22%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20elif%20%5B%20%22%24DIG_IP%22%20%3D%3D%20%22%24i%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22dns%20name%20is%20%24a%22%0A%20%20%20%20%20%20%20%20cat%20%3E%20%24RUN_ENV%20%3C%3C%20EOF%0AETCD_IPV4_ADDRESS%3D%24DIG_IP%0AETCD_DNS_NAME%3D%24a%0AETCD_WILDCARD_DNS_NAME%3D*.%24%7BDISCOVERY_DOMAIN%7D%0AEOF%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20done%0A%20%20echo%20%22SRV%20query%20failed%20no%20matching%20records%20found%22%0A%20%20exit%201%0A%7D%0A%0A%23%20validate_etcd_name%20uses%20regex%20to%20return%20the%20etcd%20member%20name%20key%20from%20ETCD_INITIAL_CLUSTER%20matching%20the%20local%20ETCD_DNS_NAME.%0Avalidate_etcd_name()%20%7B%0A%20%20ETCD_NAME%3D%24(echo%20%24%7BETCD_INITIAL_CLUSTER%7D%20%7C%20grep%20-oP%20%22(%3F%3C%3D)%5B%5E%2C%2C%5Cs%5D*(%3F%3D%3D%5B%5E%3D%5D*%24%7BETCD_DNS_NAME%7D%5Cb)%22)%0A%20%20if%20%5B%20-z%20%22%24ETCD_NAME%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22%24%7BETCD_DNS_NAME%7D%20is%20not%20found%20in%20%24%7BETCD_INITIAL_CLUSTER%7D%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20echo%20%22%24ETCD_NAME%22%0A%7D%0A verification: {} filesystem: root mode: 420 diff --git a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-member-recover.sh b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-member-recover.sh index 0ccfd2cd74..1d58c64d97 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-member-recover.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-member-recover.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100'%0A%20%20%20%20exit%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%2Fetc%2Fkubernetes%2Fmanifests-stopped%0A%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20download_cert_recover_template%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0A%23%20example%0A%23%20export%20SETUP_ETCD_ENVIRONMENT%3D%24(oc%20adm%20release%20info%20--image-for%20setup-etcd-environment%20--registry-config%3D.%2Fconfig.json)%0A%23%20export%20KUBE_CLIENT_AGENT%3D%24(oc%20adm%20release%20info%20--image-for%20kube-client-agent%20--registry-config%3D.%2Fconfig.json)%0A%23%20sudo%20-E%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0A%3A%20%24%7BSETUP_ETCD_ENVIRONMENT%3A%3F%22Need%20to%20set%20SETUP_ETCD_ENVIRONMENT%22%7D%0A%3A%20%24%7BKUBE_CLIENT_AGENT%3A%3F%22Need%20to%20set%20KUBE_CLIENT_AGENT%22%7D%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Recovery%20server%20IP%20address%20and%20etcd%20name%20required%3A%20.%2Fetcd-member-recover.sh%20192.168.1.100%20%24etcd_name'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ARECOVERY_SERVER_IP%3D%241%0AETCD_NAME%3D%242%0A%0AASSET_DIR%3D.%2Fassets%0AASSET_DIR_TMP%3D%22%24ASSET_DIR%2Ftmp%22%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AMANIFEST_STOPPED_DIR%3D%22%24ASSET_DIR%2Fmanifests-stopped%22%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_CONFIG%3D%2Fetc%2Fetcd%2Fetcd.conf%0AETCDCTL%3D%24ASSET_DIR%2Fbin%2Fetcdctl%0AETCD_VERSION%3Dv3.3.10%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0A%0ASHARED%3D%2Fusr%2Flocal%2Fshare%2Fopenshift-recovery%0ATEMPLATE%3D%22%24SHARED%2Ftemplate%2Fetcd-generate-certs.yaml.template%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20backup_etcd_conf%0A%20%20backup_etcd_client_certs%0A%20%20stop_etcd%0A%20%20backup_data_dir%0A%20%20backup_certs%0A%20%20remove_certs%0A%20%20gen_config%0A%20%20CLUSTER_NAME%3D%24(echo%20%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'%5E.*%3F(%3F%3D%5C.)')%0A%20%20populate_template%20'__ETCD_DISCOVERY_DOMAIN__'%20%22%24DISCOVERY_DOMAIN%22%20%22%24TEMPLATE%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%0A%20%20populate_template%20'__SETUP_ETCD_ENVIRONMENT__'%20%22%24SETUP_ETCD_ENVIRONMENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage1%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%0A%20%20populate_template%20'__KUBE_CLIENT_AGENT__'%20%22%24KUBE_CLIENT_AGENT%22%20%22%24ASSET_DIR%2Ftmp%2Fetcd-generate-certs.stage2%22%20%22%24MANIFEST_STOPPED_DIR%2Fetcd-generate-certs.yaml%22%0A%20%20start_cert_recover%0A%20%20verify_certs%0A%20%20stop_cert_recover%0A%20%20patch_manifest%0A%20%20etcd_member_add%0A%20%20start_etcd%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-backup.sh b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-backup.sh index 4022de9ecc..72b2381423 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-backup.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-backup.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20etcd-snapshot-backup.sh%20%24path-to-snapshot%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_etcd_client_certs%0A%20%20backup_manifest%0A%20%20snapshot_data_dir%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-restore.sh b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-restore.sh index 147a0c4faf..d206870005 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-restore.sh +++ b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-etcd-snapshot-restore.sh @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%0A%23%20etcd-snapshot-restore.sh%20%24path-to-snapshot%20%24etcd-connection-string%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0AASSET_DIR%3D.%2Fassets%0ASNAPSHOT_FILE%3D%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%0A%0Aif%20%5B%20%22%241%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20SNAPSHOT_FILE%3D%22%241%22%0Afi%0A%0A%0AETCD_CONNSTRING%3D%22%22%0Aif%20%5B%20%22%242%22%20!%3D%20%22%22%20%5D%3B%20then%0A%20%20ETCD_CONNSTRING%3D%22%242%22%0Afi%0A%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests-stopped%22%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Aset%20-o%20errexit%0Aset%20-o%20pipefail%0A%0A%23%20example%0A%23%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24inital_cluster%0A%0Aif%20%5B%5B%20%24EUID%20-ne%200%20%5D%5D%3B%20then%0A%20%20echo%20%22This%20script%20must%20be%20run%20as%20root%22%0A%20%20exit%201%0Afi%0A%0Ausage%20()%20%7B%0A%20%20%20%20echo%20'Path%20to%20snapshot%20and%20initial%20cluster%20are%20required%3A%20.%2Fetcd-snapshot-restore.sh%20%24path-to-snapshot%20%24initial_cluster'%0A%20%20%20%20exit%201%0A%7D%0A%0Aif%20%5B%20%22%241%22%20%3D%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%242%22%20%3D%3D%20%22%22%20%5D%3B%20then%0A%20%20%20%20usage%0Afi%0A%0ASNAPSHOT_FILE%3D%22%241%22%0AETCD_INITIAL_CLUSTER%3D%22%242%22%0AASSET_DIR%3D.%2Fassets%0ACONFIG_FILE_DIR%3D%2Fetc%2Fkubernetes%0AMANIFEST_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%22%0AMANIFEST_STOPPED_DIR%3D%22%24%7BASSET_DIR%7D%2Fmanifests-stopped%22%0ARUN_ENV%3D%2Frun%2Fetcd%2Fenvironment%0A%0AETCD_VERSION%3Dv3.3.10%0AETCDCTL%3D%22%24%7BASSET_DIR%7D%2Fbin%2Fetcdctl%22%0AETCD_DATA_DIR%3D%2Fvar%2Flib%2Fetcd%0AETCD_MANIFEST%3D%22%24%7BMANIFEST_DIR%7D%2Fetcd-member.yaml%22%0AETCD_STATIC_RESOURCES%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fetcd-member%22%0ASTOPPED_STATIC_PODS%3D%22%24%7BASSET_DIR%7D%2Ftmp%2Fstopped-static-pods%22%0A%0Asource%20%22%2Fusr%2Flocal%2Fbin%2Fopenshift-recovery-tools%22%0A%0Afunction%20run%20%7B%0A%20%20init%0A%20%20dl_etcdctl%0A%20%20backup_manifest%0A%20%20DISCOVERY_DOMAIN%3D%24(grep%20-oP%20'(%3F%3C%3Ddiscovery-srv%3D).*%5B%5E%22%5D'%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20)%0A%20%20if%20%5B%20-z%20%22%24DISCOVERY_DOMAIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Discovery%20domain%20can%20not%20be%20extracted%20from%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20validate_environment%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%20%20ETCD_NAME%3D%24(validate_etcd_name)%0A%20%20stop_static_pods%0A%20%20stop_etcd%0A%20%20stop_kubelet%0A%20%20stop_all_containers%0A%20%20backup_data_dir%0A%20%20remove_data_dir%0A%20%20restore_snapshot%0A%20%20start_static_pods%0A%20%20start_kubelet%0A%7D%0A%0Arun%0A verification: {} filesystem: root mode: 493 diff --git a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-openshift-recovery-tools b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-openshift-recovery-tools index e23642b7cc..97b53e0642 100644 --- a/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-openshift-recovery-tools +++ b/pkg/controller/template/test_data/templates/master/00-master/vsphere/files/-usr-local-bin-openshift-recovery-tools @@ -1,5 +1,5 @@ contents: - source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%20%20if%20%5B%20-z%20%22%24%7BETCD_CONNSTRING%7D%22%20%5D%3B%20then%0A%20%20%20%20ETCD_CONNSTRING%3D%22%24%7BETCD_NAME%7D%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380%22%0A%20%20fi%0A%0A%20%20source%20%2Frun%2Fetcd%2Fenvironment%0A%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20sleep%202%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_CONNSTRING%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20source%20%20%2Frun%2Fetcd%2Fenvironment%0A%20%20HOSTNAME%3D%24(hostname)%0A%20%20HOSTDOMAIN%3D%24(hostname%20-d)%0A%20%20ETCD_NAME%3Detcd-member-%24%7BHOSTNAME%7D.%24%7BHOSTDOMAIN%7D%0A%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Adownload_cert_recover_template()%20%7B%0A%20%20curl%20-s%20https%3A%2F%2Fraw.githubusercontent.com%2Fhexfusion%2Fopenshift-recovery%2Fmaster%2Fmanifests%2Fetcd-generate-certs.yaml.template%20-o%20%24ASSET_DIR%2Ftemplates%2Fetcd-generate-certs.yaml.template%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A + source: data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0A%0Ainit()%20%7B%0A%20%20ASSET_BIN%3D%24%7BASSET_DIR%7D%2Fbin%0A%20%20if%20%5B%20!%20-d%20%22%24ASSET_BIN%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Creating%20asset%20directory%20%24%7BASSET_DIR%7D%22%0A%20%20%20%20for%20dir%20in%20%7Bbin%2Ctmp%2Cshared%2Cbackup%2Ctemplates%2Crestore%2Cmanifests%7D%3B%20do%0A%20%20%20%20%20%20%2Fusr%2Fbin%2Fmkdir%20-p%20%24%7BASSET_DIR%7D%2F%24%7Bdir%7D%0A%20%20%20%20done%0A%20%20fi%0A%7D%0A%0A%23%20download%20and%20test%20etcdctl%20from%20upstream%20release%20assets%0Adl_etcdctl()%20%7B%0A%20%20GOOGLE_URL%3Dhttps%3A%2F%2Fstorage.googleapis.com%2Fetcd%0A%20%20DOWNLOAD_URL%3D%24%7BGOOGLE_URL%7D%0A%0A%20%20echo%20%22Downloading%20etcdctl%20binary..%22%0A%20%20curl%20-s%20-L%20%24%7BDOWNLOAD_URL%7D%2F%24%7BETCD_VERSION%7D%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-o%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20%5C%0A%20%20%20%20%26%26%20tar%20-xzf%20%24ASSET_DIR%2Ftmp%2Fetcd-%24%7BETCD_VERSION%7D-linux-amd64.tar.gz%20-C%20%24ASSET_DIR%2Fshared%20--strip-components%3D1%20%5C%0A%20%20%20%20%26%26%20mv%20%24ASSET_DIR%2Fshared%2Fetcdctl%20%24ASSET_DIR%2Fbin%20%5C%0A%20%20%20%20%26%26%20rm%20%24ASSET_DIR%2Fshared%2Fetcd%20%5C%0A%20%20%20%20%26%26%20ETCDCTL_API%3D3%20%24ASSET_DIR%2Fbin%2Fetcdctl%20version%0A%7D%0A%0A%23backup%20etcd%20client%20certs%0Abackup_etcd_client_certs()%20%7B%0A%20%20echo%20%22Trying%20to%20backup%20etcd%20client%20certs..%22%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd-client.key%22%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22etcd%20client%20certs%20already%20backed%20up%20and%20available%20%24ASSET_DIR%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20for%20i%20in%20%7B1..10%7D%3B%20do%0A%20%20%20%20%20%20%20%20SECRET_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fsecrets%2Fetcd-client%22%0A%20%20%20%20%20%20%20%20CONFIGMAP_DIR%3D%22%24%7BCONFIG_FILE_DIR%7D%2Fstatic-pod-resources%2Fkube-apiserver-pod-%24%7Bi%7D%2Fconfigmaps%2Fetcd-serving-ca%22%0A%20%20%20%20%20%20%20%20if%20%5B%20-f%20%22%24CONFIGMAP_DIR%2Fca-bundle.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.crt%22%20%5D%20%26%26%20%5B%20-f%20%22%24SECRET_DIR%2Ftls.key%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20cp%20%24CONFIGMAP_DIR%2Fca-bundle.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.crt%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%0A%20%20%20%20%20%20%20%20%20%20cp%20%24SECRET_DIR%2Ftls.key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%0A%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20echo%20%22%24SECRET_DIR%20does%20not%20contain%20etcd%20client%20certs%2C%20trying%20next%20source%20..%22%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20%20fi%0A%7D%0A%0A%23%20backup%20current%20etcd-member%20pod%20manifest%0Abackup_manifest()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd-member.yaml%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd-member.yaml%20found%20in%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%24%7BETCD_MANIFEST%7D%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%24%7BETCD_MANIFEST%7D%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20backup%20etcd.conf%0Abackup_etcd_conf()%20%7B%0A%20%20if%20%5B%20-e%20%22%24%7BASSET_DIR%7D%2Fbackup%2Fetcd.conf%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd.conf%20backup%20upready%20exists%20%24ASSET_DIR%2Fbackup%2Fetcd.conf%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20%2Fetc%2Fetcd%2Fetcd.conf%20to%20%24%7BASSET_DIR%7D%2Fbackup%2F%22%0A%20%20%20%20cp%20%2Fetc%2Fetcd%2Fetcd.conf%20%24%7BASSET_DIR%7D%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Abackup_data_dir()%20%7B%0A%20%20if%20%5B%20-f%20%22%24ASSET_DIR%2Fbackup%2Fetcd%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20data-dir%20backup%20found%20%24ASSET_DIR%2Fbackup%2Fetcd..%22%0A%20%20elif%20%5B%20!%20-f%20%22%24%7BETCD_DATA_DIR%7D%2Fmember%2Fsnap%2Fdb%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Local%20etcd%20snapshot%20file%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20data-dir..%22%0A%20%20%20%20cp%20-rap%20%24%7BETCD_DATA_DIR%7D%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0Asnapshot_data_dir()%20%7B%0A%20%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20%5C%0A%20%20%20%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%5C%0A%20%20%20%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%5C%0A%20%20%20%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20snapshot%20save%20%24%7BSNAPSHOT_FILE%7D%0A%7D%0A%0A%23%20backup%20etcd%20peer%2C%20server%20and%20metric%20certs%0Abackup_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20BACKUP_COUNT%3D%24(ls%20%24ASSET_DIR%2Fbackup%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%0A%20%20if%20%5B%20%22%24BACKUP_COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificate%20backups%20found%20in%20%24ASSET_DIR%2Fbackup..%22%0A%20%20elif%20%5B%20%22%24COUNT%22%20-eq%200%20%5D%3B%20then%0A%20%20%20%20echo%20%22etcd%20TLS%20certificates%20not%20found%2C%20backup%20skipped..%22%0A%20%20else%0A%20%20%20%20echo%20%22Backing%20up%20etcd%20certificates..%22%0A%20%20%20%20cp%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%20%24ASSET_DIR%2Fbackup%2F%0A%20%20fi%0A%7D%0A%0A%23%20stop%20etcd%20by%20moving%20the%20manifest%20out%20of%20%2Fetcd%2Fkubernetes%2Fmanifests%0A%23%20we%20wait%20for%20all%20etcd%20containers%20to%20die.%0Astop_etcd()%20%7B%0A%20%20echo%20%22Stopping%20etcd..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20if%20%5B%20-e%20%22%24ETCD_MANIFEST%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24ETCD_MANIFEST%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Betcd-member%2Cetcd-metric%7D%0A%20%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Aremove_data_dir()%20%7B%0A%20%20echo%20%22Removing%20etcd%20data-dir%20%24%7BETCD_DATA_DIR%7D%22%0A%20%20rm%20-rf%20%24%7BETCD_DATA_DIR%7D%0A%7D%0A%0Aremove_certs()%20%7B%0A%20%20COUNT%3D%24(ls%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%202%3E%2Fdev%2Fnull%20%7C%20wc%20-l)%0A%20%20if%20%5B%20%22%24COUNT%22%20-gt%201%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22Removing%20etcd%20certs..%22%0A%20%20%20%20%20rm%20-f%20%24ETCD_STATIC_RESOURCES%2Fsystem%5C%3Aetcd-*%0A%20%20fi%0A%7D%0A%0Arestore_snapshot()%20%7B%0A%20%20if%20%5B%20!%20-f%20%22%24SNAPSHOT_FILE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Snapshot%20file%20not%20found%2C%20restore%20failed%3A%20%24SNAPSHOT_FILE.%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20echo%20%22Restoring%20etcd%20member%20%24ETCD_NAME%20from%20snapshot..%22%0A%20%20env%20ETCDCTL_API%3D3%20%24%7BETCDCTL%7D%20snapshot%20restore%20%24SNAPSHOT_FILE%20%5C%0A%20%20%20%20--name%20%24ETCD_NAME%20%5C%0A%20%20%20%20--initial-cluster%20%24%7BETCD_INITIAL_CLUSTER%7D%20%5C%0A%20%20%20%20--initial-cluster-token%20etcd-cluster-1%20%5C%0A%20%20%20%20--skip-hash-check%3Dtrue%20%5C%0A%20%20%20%20--initial-advertise-peer-urls%20https%3A%2F%2F%24%7BETCD_IPV4_ADDRESS%7D%3A2380%20%5C%0A%20%20%20%20--data-dir%20%24ETCD_DATA_DIR%0A%7D%0A%0Apatch_manifest()%20%7B%0A%20%20echo%20%22Patching%20etcd-member%20manifest..%22%0A%20%20cp%20%24ASSET_DIR%2Fbackup%2Fetcd-member.yaml%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20sed%20-i%20%2F'%20'--discovery-srv%2Fd%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%0A%20%20mv%20%24ASSET_DIR%2Ftmp%2Fetcd-member.yaml.template%20%24MANIFEST_STOPPED_DIR%2Fetcd-member.yaml%0A%7D%0A%0A%23%20generate%20a%20kubeconf%20like%20file%20for%20the%20cert%20agent%20to%20consume%20and%20contact%20signer.%0Agen_config()%20%7B%0A%20%20CA%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20CERT%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20%7C%20tr%20-d%20'%5Cn')%0A%20%20KEY%3D%24(base64%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20%7C%20tr%20-d%20'%5Cn')%0A%0A%20%20cat%20%3E%20%24ETCD_STATIC_RESOURCES%2F.recoveryconfig%20%3C%3C%20EOF%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20%24%7BCA%7D%0A%20%20%20%20server%3A%20https%3A%2F%2F%24%7BRECOVERY_SERVER_IP%7D%3A9943%0A%20%20name%3A%20%24%7BCLUSTER_NAME%7D%0Acontexts%3A%0A-%20context%3A%0A%20%20%20%20cluster%3A%20%24%7BCLUSTER_NAME%7D%0A%20%20%20%20user%3A%20kubelet%0A%20%20name%3A%20kubelet%0Acurrent-context%3A%20kubelet%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20kubelet%0A%20%20user%3A%0A%20%20%20%20client-certificate-data%3A%20%24%7BCERT%7D%0A%20%20%20%20client-key-data%3A%20%24%7BKEY%7D%0AEOF%0A%7D%0A%0A%23%20add%20member%20cluster%0Aetcd_member_add()%20%7B%0A%20%20echo%20%22Updating%20etcd%20membership..%22%0A%20%20if%20%5B%20-d%20%22%24ETCD_DATA_DIR%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Removing%20etcd%20data_dir%20%24ETCD_DATA_DIR..%22%0A%20%20%20%20rm%20-rf%20%24ETCD_DATA_DIR%0A%20%20fi%0A%0A%20%20RESPONSE%3D%24(env%20ETCDCTL_API%3D3%20%24ETCDCTL%20--cert%20%24ASSET_DIR%2Fbackup%2Fetcd-client.crt%20--key%20%24ASSET_DIR%2Fbackup%2Fetcd-client.key%20--cacert%20%24ASSET_DIR%2Fbackup%2Fetcd-ca-bundle.crt%20%5C%0A%20%20%20%20--endpoints%20%24%7BRECOVERY_SERVER_IP%7D%3A2379%20member%20add%20%24ETCD_NAME%20--peer-urls%3Dhttps%3A%2F%2F%24%7BETCD_DNS_NAME%7D%3A2380)%0A%0A%20%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20APPEND_CONF%3D%24(echo%20%22%24RESPONSE%22%20%7C%20sed%20-e%20'1%2C2d')%0A%20%20%20%20%20echo%20-e%20%22%5Cn%5Cn%23%5Brecover%5D%5Cn%24APPEND_CONF%22%20%3E%3E%20%24ETCD_CONFIG%0A%20%20%20else%0A%20%20%20%20%20echo%20%22%24RESPONSE%22%0A%20%20%20%20%20exit%201%0A%20%20%20fi%0A%7D%0A%0Astart_etcd()%20%7B%0A%20%20echo%20%22Starting%20etcd..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-member.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Apopulate_template()%20%7B%0A%20%20FIND%3D%22%241%22%0A%20%20REPLACE%3D%22%242%22%0A%20%20TEMPLATE%3D%22%243%22%0A%20%20OUT%3D%22%244%22%0A%0A%20%20echo%20%22Populating%20template%20%24TEMPLATE%22%0A%0A%20%20if%20%5B%20-z%20%22%24FIND%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24REPLACE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24TEMPLATE%22%20%5D%20%7C%7C%20%5B%20-z%20%22%24OUT%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22populate_template%20requires%204%20arguments%20FIND%2C%20REPLACE%2C%20TEMPLATE%20and%20OUT%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20!%20-f%20%22%24TEMPLATE%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22template%20%24TEMPLATE%20does%20not%20exist%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20TMP_FILE%3D%24(date%20%2B%22%25m-%25d-%25Y-%25H%25M%22)%0A%20%20cp%20%24TEMPLATE%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%0A%20%20sed%20-i%20%22s%7C%24%7BFIND%7D%7C%24%7BREPLACE%7D%7C%22%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%0A%20%20mv%20%22%24ASSET_DIR%2Ftmp%2F%24%7BTMP_FILE%7D%22%20%22%24OUT%22%0A%7D%0A%0Astart_cert_recover()%20%7B%0A%20%20echo%20%22Starting%20etcd%20client%20cert%20recovery%20agent..%22%0A%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2Fetcd-generate-certs.yaml%20%24MANIFEST_DIR%0A%7D%0A%0Averify_certs()%20%7B%0A%20%20while%20%5B%20%22%24(ls%20%24ETCD_STATIC_RESOURCES%20%7C%20wc%20-l)%22%20-lt%209%20%20%5D%3B%20do%0A%20%20%20%20echo%20%22Waiting%20for%20certs%20to%20generate..%22%0A%20%20%20%20sleep%2010%0A%20%20done%0A%7D%0A%0Astop_cert_recover()%20%7B%0A%20%20echo%20%22Stopping%20cert%20recover..%22%0A%0A%20%20if%20%5B%20-f%20%22%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%22%20%5D%3B%20then%0A%20%20%20%20mv%20%24%7BCONFIG_FILE_DIR%7D%2Fmanifests%2Fetcd-generate-certs.yaml%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20for%20name%20in%20%7Bgenerate-env%2Cgenerate-certs%7D%3B%20do%0A%20%20%20%20while%20%5B%20!%20-z%20%22%24(crictl%20pods%20-name%20%24name%20--state%20Ready%20-q)%22%20%5D%3B%20do%0A%20%20%20%20%20%20echo%20%22Waiting%20for%20%24name%20to%20stop%22%0A%20%20%20%20%20%20sleep%2010%0A%20%20%20%20done%0A%20%20done%0A%7D%0A%0Astop_static_pods()%20%7B%0A%20%20echo%20%22Stopping%20all%20static%20pods..%22%0A%0A%20%20if%20%5B%20!%20-d%20%22%24MANIFEST_STOPPED_DIR%22%20%5D%3B%20then%0A%20%20%20%20mkdir%20%24MANIFEST_STOPPED_DIR%0A%20%20fi%0A%0A%20%20find%20%24%7BMANIFEST_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..stopping%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_STOPPED_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astart_static_pods()%20%7B%0A%20%20echo%20%22Starting%20static%20pods..%22%0A%20%20find%20%24%7BMANIFEST_STOPPED_DIR%7D%20-maxdepth%201%20-type%20f%20-printf%20%22%25f%5Cn%22%20%3E%20%24STOPPED_STATIC_PODS%0A%20%20while%20read%20STATIC_POD%3B%20do%0A%20%20%20%20echo%20%22..starting%20%24STATIC_POD%22%0A%20%20%20%20mv%20%24%7BMANIFEST_STOPPED_DIR%7D%2F%24%7BSTATIC_POD%7D%20%24MANIFEST_DIR%0A%20%20done%20%3C%24STOPPED_STATIC_PODS%0A%7D%0A%0Astop_kubelet()%20%7B%0A%20%20echo%20%22Stopping%20kubelet..%22%0A%20%20systemctl%20stop%20kubelet.service%0A%7D%0A%0Astart_kubelet()%20%7B%0A%20%20echo%20%22Starting%20kubelet..%22%0A%20%20systemctl%20daemon-reload%0A%20%20systemctl%20start%20kubelet.service%0A%7D%0A%0Astop_all_containers()%20%7B%0A%20%20echo%20%22Stopping%20all%20containers..%22%0A%20%20crictl%20ps%20-q%20%7C%20xargs%20-r%20crictl%20stop%0A%7D%0A%0A%23%20validate_environment%20performs%20the%20same%20actions%20as%20the%20discovery%20container%20in%20etcd-member%20init%0A%23%20sometimes%20%24RUN_ENV%20is%20not%20available%20if%20the%20node%20is%20rebooted%20so%20we%20recreate%20here.%0Avalidate_environment()%20%7B%0A%20%20if%20%5B%20-f%20%22%24RUN_ENV%22%20%5D%20%26%26%20%5B%20-s%20%22%24RUN_ENV%22%20%5D%3Bthen%0A%20%20%20%20return%200%0A%20%20fi%0A%20%20SRV_A_RECORD%3D%24(dig%20%2Bnoall%20%2Banswer%20SRV%20_etcd-server-ssl._tcp.%24%7BDISCOVERY_DOMAIN%7D%20%7C%20grep%20-oP%20'(%3F%3C%3D2380%20).*%5B%5E%5C.%5D'%20%7C%20xargs)%0A%20%20HOST_IPS%3D%24(ip%20-o%20addr%20%7C%20%20grep%20-oP%20'(%3F%3C%3Dinet%20)(%5Cd%7B1%2C3%7D%5C.%3F)%7B4%7D')%0A%0A%20%20if%20%5B%20-z%20%22%24SRV_A_RECORD%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22SRV%20A%20record%20query%20for%20%24%7BDISCOVERY_DOMAIN%7D%20failed%20please%20update%20DNS%22%0A%20%20%20%20exit%201%0A%20%20elif%20%5B%20-z%20%22%24HOST_IPS%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22Unable%20to%20find%20any%20IPv4%20addresses%20for%20host%20interfaces%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%0A%20%20for%20a%20in%20%24%7BSRV_A_RECORD%5B%40%5D%7D%3B%20do%0A%20%20%20%20echo%20%22checking%20against%20%24a%22%0A%20%20%20%20for%20i%20in%20%24%7BHOST_IPS%5B%40%5D%7D%3B%20do%0A%20%20%20%20%20%20DIG_IP%3D%24(dig%20%2Bshort%20%24a)%0A%20%20%20%20%20%20if%20%5B%20-z%20%22%24DIG_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22No%20matching%20A%20record%20found%20for%20%24a%20skipping%22%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20elif%20%5B%20%22%24DIG_IP%22%20%3D%3D%20%22%24i%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22dns%20name%20is%20%24a%22%0A%20%20%20%20%20%20%20%20cat%20%3E%20%24RUN_ENV%20%3C%3C%20EOF%0AETCD_IPV4_ADDRESS%3D%24DIG_IP%0AETCD_DNS_NAME%3D%24a%0AETCD_WILDCARD_DNS_NAME%3D*.%24%7BDISCOVERY_DOMAIN%7D%0AEOF%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20%20%20fi%0A%20%20%20%20done%0A%20%20done%0A%20%20echo%20%22SRV%20query%20failed%20no%20matching%20records%20found%22%0A%20%20exit%201%0A%7D%0A%0A%23%20validate_etcd_name%20uses%20regex%20to%20return%20the%20etcd%20member%20name%20key%20from%20ETCD_INITIAL_CLUSTER%20matching%20the%20local%20ETCD_DNS_NAME.%0Avalidate_etcd_name()%20%7B%0A%20%20ETCD_NAME%3D%24(echo%20%24%7BETCD_INITIAL_CLUSTER%7D%20%7C%20grep%20-oP%20%22(%3F%3C%3D)%5B%5E%2C%2C%5Cs%5D*(%3F%3D%3D%5B%5E%3D%5D*%24%7BETCD_DNS_NAME%7D%5Cb)%22)%0A%20%20if%20%5B%20-z%20%22%24ETCD_NAME%22%20%5D%3B%20then%0A%20%20%20%20echo%20%22%24%7BETCD_DNS_NAME%7D%20is%20not%20found%20in%20%24%7BETCD_INITIAL_CLUSTER%7D%22%0A%20%20%20%20exit%201%0A%20%20fi%0A%20%20echo%20%22%24ETCD_NAME%22%0A%7D%0A verification: {} filesystem: root mode: 420 diff --git a/templates/master/00-master/_base/files/usr-local-bin-etcd-member-recover-sh.yaml b/templates/master/00-master/_base/files/usr-local-bin-etcd-member-recover-sh.yaml index ded2adcabc..786cf511e8 100644 --- a/templates/master/00-master/_base/files/usr-local-bin-etcd-member-recover-sh.yaml +++ b/templates/master/00-master/_base/files/usr-local-bin-etcd-member-recover-sh.yaml @@ -4,12 +4,12 @@ path: "/usr/local/bin/etcd-member-recover.sh" contents: inline: | #!/usr/bin/env bash - + # example # export SETUP_ETCD_ENVIRONMENT=$(oc adm release info --image-for setup-etcd-environment --registry-config=./config.json) # export KUBE_CLIENT_AGENT=$(oc adm release info --image-for kube-client-agent --registry-config=./config.json) - # sudo -E ./etcd-member-recover.sh 192.168.1.100 - + # sudo -E ./etcd-member-recover.sh 192.168.1.100 $etcd_name + if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" exit 1 @@ -17,40 +17,49 @@ contents: : ${SETUP_ETCD_ENVIRONMENT:?"Need to set SETUP_ETCD_ENVIRONMENT"} : ${KUBE_CLIENT_AGENT:?"Need to set KUBE_CLIENT_AGENT"} - + usage () { - echo 'Recovery server IP address required: ./etcd-member-recover.sh 192.168.1.100' - exit + echo 'Recovery server IP address and etcd name required: ./etcd-member-recover.sh 192.168.1.100 $etcd_name' + exit 1 } - - if [ "$1" == "" ]; then + + if [ "$1" == "" ] || [ "$2" == "" ]; then usage fi - + RECOVERY_SERVER_IP=$1 - + ETCD_NAME=$2 + ASSET_DIR=./assets ASSET_DIR_TMP="$ASSET_DIR/tmp" CONFIG_FILE_DIR=/etc/kubernetes MANIFEST_DIR="${CONFIG_FILE_DIR}/manifests" - MANIFEST_STOPPED_DIR=/etc/kubernetes/manifests-stopped + RUN_ENV=/run/etcd/environment + MANIFEST_STOPPED_DIR="$ASSET_DIR/manifests-stopped" ETCD_MANIFEST="${MANIFEST_DIR}/etcd-member.yaml" ETCD_CONFIG=/etc/etcd/etcd.conf ETCDCTL=$ASSET_DIR/bin/etcdctl ETCD_VERSION=v3.3.10 ETCD_DATA_DIR=/var/lib/etcd ETCD_STATIC_RESOURCES="${CONFIG_FILE_DIR}/static-pod-resources/etcd-member" - + SHARED=/usr/local/share/openshift-recovery TEMPLATE="$SHARED/template/etcd-generate-certs.yaml.template" - + source "/usr/local/bin/openshift-recovery-tools" - + function run { init dl_etcdctl backup_manifest + DISCOVERY_DOMAIN=$(grep -oP '(?<=discovery-srv=).*[^"]' $ASSET_DIR/backup/etcd-member.yaml ) + if [ -z "$DISCOVERY_DOMAIN" ]; then + echo "Discovery domain can not be extracted from $ASSET_DIR/backup/etcd-member.yaml" + exit 1 + fi + validate_environment + source /run/etcd/environment backup_etcd_conf backup_etcd_client_certs stop_etcd @@ -58,12 +67,6 @@ contents: backup_certs remove_certs gen_config - download_cert_recover_template - DISCOVERY_DOMAIN=$(grep -oP '(?<=discovery-srv=).*[^"]' $ASSET_DIR/backup/etcd-member.yaml ) - if [ -z "$DISCOVERY_DOMAIN" ]; then - echo "Discovery domain can not be extracted from $ASSET_DIR/backup/etcd-member.yaml" - exit 1 - fi CLUSTER_NAME=$(echo ${DISCOVERY_DOMAIN} | grep -oP '^.*?(?=\.)') populate_template '__ETCD_DISCOVERY_DOMAIN__' "$DISCOVERY_DOMAIN" "$TEMPLATE" "$ASSET_DIR/tmp/etcd-generate-certs.stage1" populate_template '__SETUP_ETCD_ENVIRONMENT__' "$SETUP_ETCD_ENVIRONMENT" "$ASSET_DIR/tmp/etcd-generate-certs.stage1" "$ASSET_DIR/tmp/etcd-generate-certs.stage2" @@ -75,5 +78,5 @@ contents: etcd_member_add start_etcd } - + run diff --git a/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-backup-sh.yaml b/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-backup-sh.yaml index 5dea276177..9471713c6a 100644 --- a/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-backup-sh.yaml +++ b/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-backup-sh.yaml @@ -25,7 +25,7 @@ contents: CONFIG_FILE_DIR=/etc/kubernetes MANIFEST_DIR="${CONFIG_FILE_DIR}/manifests" - MANIFEST_STOPPED_DIR="${CONFIG_FILE_DIR}/manifests-stopped" + MANIFEST_STOPPED_DIR="${ASSET_DIR}/manifests-stopped" ETCD_VERSION=v3.3.10 ETCDCTL="${ASSET_DIR}/bin/etcdctl" ETCD_DATA_DIR=/var/lib/etcd diff --git a/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-restore-sh.yaml b/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-restore-sh.yaml index 2d986d81aa..603ea7a4b9 100644 --- a/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-restore-sh.yaml +++ b/templates/master/00-master/_base/files/usr-local-bin-etcd-snapshot-restore-sh.yaml @@ -4,47 +4,56 @@ path: "/usr/local/bin/etcd-snapshot-restore.sh" contents: inline: | #!/usr/bin/env bash - + set -o errexit set -o pipefail - + # example - - # etcd-snapshot-restore.sh $path-to-snapshot $etcd-connection-string + # ./etcd-snapshot-restore.sh $path-to-snapshot $inital_cluster + if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" exit 1 fi - - ASSET_DIR=./assets - SNAPSHOT_FILE="${ASSET_DIR}/backup/etcd/member/snap/db" - - if [ "$1" != "" ]; then - SNAPSHOT_FILE="$1" - fi - - ETCD_CONNSTRING="" - if [ "$2" != "" ]; then - ETCD_CONNSTRING="$2" + usage () { + echo 'Path to snapshot and initial cluster are required: ./etcd-snapshot-restore.sh $path-to-snapshot $initial_cluster' + exit 1 + } + + if [ "$1" == "" ] || [ "$2" == "" ]; then + usage fi + SNAPSHOT_FILE="$1" + ETCD_INITIAL_CLUSTER="$2" + ASSET_DIR=./assets CONFIG_FILE_DIR=/etc/kubernetes MANIFEST_DIR="${CONFIG_FILE_DIR}/manifests" - MANIFEST_STOPPED_DIR="${CONFIG_FILE_DIR}/manifests-stopped" + MANIFEST_STOPPED_DIR="${ASSET_DIR}/manifests-stopped" + RUN_ENV=/run/etcd/environment + ETCD_VERSION=v3.3.10 ETCDCTL="${ASSET_DIR}/bin/etcdctl" ETCD_DATA_DIR=/var/lib/etcd ETCD_MANIFEST="${MANIFEST_DIR}/etcd-member.yaml" ETCD_STATIC_RESOURCES="${CONFIG_FILE_DIR}/static-pod-resources/etcd-member" STOPPED_STATIC_PODS="${ASSET_DIR}/tmp/stopped-static-pods" - + source "/usr/local/bin/openshift-recovery-tools" - + function run { init dl_etcdctl backup_manifest + DISCOVERY_DOMAIN=$(grep -oP '(?<=discovery-srv=).*[^"]' $ASSET_DIR/backup/etcd-member.yaml ) + if [ -z "$DISCOVERY_DOMAIN" ]; then + echo "Discovery domain can not be extracted from $ASSET_DIR/backup/etcd-member.yaml" + exit 1 + fi + validate_environment + source /run/etcd/environment + ETCD_NAME=$(validate_etcd_name) stop_static_pods stop_etcd stop_kubelet @@ -55,5 +64,5 @@ contents: start_static_pods start_kubelet } - + run diff --git a/templates/master/00-master/_base/files/usr-local-bin-openshift-recovery-tools-sh.yaml b/templates/master/00-master/_base/files/usr-local-bin-openshift-recovery-tools-sh.yaml index 00321debd6..79a8736be5 100644 --- a/templates/master/00-master/_base/files/usr-local-bin-openshift-recovery-tools-sh.yaml +++ b/templates/master/00-master/_base/files/usr-local-bin-openshift-recovery-tools-sh.yaml @@ -139,27 +139,15 @@ contents: } restore_snapshot() { - HOSTNAME=$(hostname) - HOSTDOMAIN=$(hostname -d) - ETCD_NAME=etcd-member-${HOSTNAME}.${HOSTDOMAIN} - if [ -z "${ETCD_CONNSTRING}" ]; then - ETCD_CONNSTRING="${ETCD_NAME}=https://${ETCD_DNS_NAME}:2380" - fi - - source /run/etcd/environment - if [ ! -f "$SNAPSHOT_FILE" ]; then echo "Snapshot file not found, restore failed: $SNAPSHOT_FILE." exit 1 fi - sleep 2 - echo "Restoring etcd member $ETCD_NAME from snapshot.." - env ETCDCTL_API=3 ${ETCDCTL} snapshot restore $SNAPSHOT_FILE \ --name $ETCD_NAME \ - --initial-cluster ${ETCD_CONNSTRING} \ + --initial-cluster ${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token etcd-cluster-1 \ --skip-hash-check=true \ --initial-advertise-peer-urls https://${ETCD_IPV4_ADDRESS}:2380 \ @@ -202,17 +190,12 @@ contents: # add member cluster etcd_member_add() { - source /run/etcd/environment - HOSTNAME=$(hostname) - HOSTDOMAIN=$(hostname -d) - ETCD_NAME=etcd-member-${HOSTNAME}.${HOSTDOMAIN} - + echo "Updating etcd membership.." if [ -d "$ETCD_DATA_DIR" ]; then + echo "Removing etcd data_dir $ETCD_DATA_DIR.." rm -rf $ETCD_DATA_DIR fi - echo "Updating etcd membership.." - RESPONSE=$(env ETCDCTL_API=3 $ETCDCTL --cert $ASSET_DIR/backup/etcd-client.crt --key $ASSET_DIR/backup/etcd-client.key --cacert $ASSET_DIR/backup/etcd-ca-bundle.crt \ --endpoints ${RECOVERY_SERVER_IP}:2379 member add $ETCD_NAME --peer-urls=https://${ETCD_DNS_NAME}:2380) @@ -231,10 +214,6 @@ contents: mv ${MANIFEST_STOPPED_DIR}/etcd-member.yaml $MANIFEST_DIR } - download_cert_recover_template() { - curl -s https://raw.githubusercontent.com/hexfusion/openshift-recovery/master/manifests/etcd-generate-certs.yaml.template -o $ASSET_DIR/templates/etcd-generate-certs.yaml.template - } - populate_template() { FIND="$1" REPLACE="$2" @@ -302,6 +281,7 @@ contents: start_static_pods() { echo "Starting static pods.." + find ${MANIFEST_STOPPED_DIR} -maxdepth 1 -type f -printf "%f\n" > $STOPPED_STATIC_PODS while read STATIC_POD; do echo "..starting $STATIC_POD" mv ${MANIFEST_STOPPED_DIR}/${STATIC_POD} $MANIFEST_DIR @@ -315,6 +295,7 @@ contents: start_kubelet() { echo "Starting kubelet.." + systemctl daemon-reload systemctl start kubelet.service } @@ -322,3 +303,52 @@ contents: echo "Stopping all containers.." crictl ps -q | xargs -r crictl stop } + + # validate_environment performs the same actions as the discovery container in etcd-member init + # sometimes $RUN_ENV is not available if the node is rebooted so we recreate here. + validate_environment() { + if [ -f "$RUN_ENV" ] && [ -s "$RUN_ENV" ];then + return 0 + fi + SRV_A_RECORD=$(dig +noall +answer SRV _etcd-server-ssl._tcp.${DISCOVERY_DOMAIN} | grep -oP '(?<=2380 ).*[^\.]' | xargs) + HOST_IPS=$(ip -o addr | grep -oP '(?<=inet )(\d{1,3}\.?){4}') + + if [ -z "$SRV_A_RECORD" ]; then + echo "SRV A record query for ${DISCOVERY_DOMAIN} failed please update DNS" + exit 1 + elif [ -z "$HOST_IPS" ]; then + echo "Unable to find any IPv4 addresses for host interfaces" + exit 1 + fi + + for a in ${SRV_A_RECORD[@]}; do + echo "checking against $a" + for i in ${HOST_IPS[@]}; do + DIG_IP=$(dig +short $a) + if [ -z "$DIG_IP" ]; then + echo "No matching A record found for $a skipping" + continue + elif [ "$DIG_IP" == "$i" ]; then + echo "dns name is $a" + cat > $RUN_ENV << EOF + ETCD_IPV4_ADDRESS=$DIG_IP + ETCD_DNS_NAME=$a + ETCD_WILDCARD_DNS_NAME=*.${DISCOVERY_DOMAIN} + EOF + return 0 + fi + done + done + echo "SRV query failed no matching records found" + exit 1 + } + + # validate_etcd_name uses regex to return the etcd member name key from ETCD_INITIAL_CLUSTER matching the local ETCD_DNS_NAME. + validate_etcd_name() { + ETCD_NAME=$(echo ${ETCD_INITIAL_CLUSTER} | grep -oP "(?<=)[^,,\s]*(?==[^=]*${ETCD_DNS_NAME}\b)") + if [ -z "$ETCD_NAME" ]; then + echo "${ETCD_DNS_NAME} is not found in ${ETCD_INITIAL_CLUSTER}" + exit 1 + fi + echo "$ETCD_NAME" + }