11. Managing Application Snapshots¶
Application Snapshots
An application snapshot is a reference marker for an application at a particular point in time. It contains a copy of the application’s data plus the application’s current state. Snapshots provide a safeguard against application data corruption. For example, if key application data is accidentally deleted, a snapshot can be used to revert (roll back) the app to a point in time before the deletion occurred.
Taking snapshots of storage volumes has existed for decades in the industry. However, when an application is distributed and/or uses multiple storage volumes across one or more pods, orchestrating storage-only snapshots across all of them is tedious, error-prone and inconsistent. Storage-only snapshots are also unaware of the application configuration and its topology, which makes cloning, backing up or restoring cumbersome and prone to misconfiguration.
Robin allows creating application-consistent snapshots of an entire application, which capture:
The entire application topology and its configuration (i.e., specs of Pod, Service, StatefulSet, Secrets, ConfigMaps, etc)
Snapshots of all data volumes (PersistentVolumeClaims)
Robin snapshots at the storage layer use redirect-on-write, which means that snapshots can be taken in less than a second even for terabyte sized data volumes. Because only the changed blocks are tracked between snapshots, Robin snapshots are very space efficient.
Topics covered in this chapter:
|
Snapshot an entire application (data and metadata) |
|
Delete the snapshot of an application |
|
Restore a snapshot from a backup copy stored on an external storage repository |
|
List snapshots for one or more applications |
|
Show detailed information about a specific snapshot |
|
Show status of snapshot pull and push operations |
11.1. Create an Application Snapshot¶
An application snapshot is created using this command:
# robin snapshot create <snapname> <app_name>
|
A name that would be assigned to the snapshot being taken |
|
Name of the application being snapshotted |
Example:
# robin snapshot create mysql3 --wait
Job: 331 Name: ApplicationSnapshot State: VALIDATED Error: 0
Job: 331 Name: ApplicationSnapshot State: WAITING Error: 0
Job: 331 Name: ApplicationSnapshot State: COMPLETED Error: 0
# robin snapshot list --app mysql3
+----------------------------------+--------+----------+----------+----------------------------+
| Snapshot ID | State | App Name | App Kind | Snapshot name |
+----------------------------------+--------+----------+----------+----------------------------+
| b6033a5a4d6a11eab805255c7aa2236e | ONLINE | mysql3 | ROBIN | mysql3_snapshot-1581493122 |
+----------------------------------+--------+----------+----------+----------------------------+
Creates an application snapshot.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: snapshot
- This mandatory field within the payload specifies the snapshot operation is to be performed.snapname: <snap_name>
- This mandatory field within the payload specifies the name of the snapshot.quiesce: <list_of_quiesce_options>
- Utilizing this parameter by specifiying a comma seperated list of quiesce options results in them being exercised in order to acheive a consistent application state. Valid values include: ‘fs’, ‘container’ and ‘all’. Note this option is only valid for ROBIN applications.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid Api Usage Error)
Example Response:
Output
{
"jobid":275,
"plan":{
"kind":"robin",
"quiesce":[
"fs"
],
"original_app_tenant":1,
"snapname":"snap1",
"action":"snapshot",
"original_app_owner":3,
"opcode":8,
"current_user":{
"session_expires":"2020-09-10T10:40:27",
"tenant_id":1,
"tenant":"Administrators",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"user_contexts":[
"robin"
],
"username":"robin",
"user_permissions":{
},
"tenant_role":"superadmin",
"user_context":"robin",
"tenants":[
"Administrators"
],
"user_id":3,
"namespace":"t001-u000003",
"ip_addr":"172.17.0.1"
},
"namespace":"t001-u000003",
"name":"custom-labels-app"
}
}
11.2. Configuring snapshot schedules and retention policies¶
This is covered under the Manage Application Snapshot Schedules section of
Applications chapter. See details of the command robin app snapshot-schedule
.
11.3. Delete an Application Snapshot¶
In order to delete an application snapshot, issue the following command:
# robin snapshot delete <snapshotid>
|
Unique ID of the snapshot (obtained from the output of |
Example:
# robin snapshot list --app mysql3
+----------------------------------+--------+----------+----------+----------------------------+
| Snapshot ID | State | App Name | App Kind | Snapshot name |
+----------------------------------+--------+----------+----------+----------------------------+
| b6033a5a4d6a11eab805255c7aa2236e | ONLINE | mysql3 | ROBIN | mysql3_snapshot-1581493122 |
+----------------------------------+--------+----------+----------+----------------------------+
# robin snapshot delete b6033a5a4d6a11eab805255c7aa2236e --wait
Job: 330 Name: ApplicationDelete State: VALIDATED Error: 0
Job: 330 Name: ApplicationDelete State: COMPLETED Error: 0
# robin snapshot list --app mysql3
+-------------+--------+----------+----------+---------------+
| Snapshot ID | State | App Name | App Kind | Snapshot name |
+-------------+--------+----------+----------+---------------+
+-------------+--------+----------+----------+---------------+
Delete an application snapshot from a Robin CNS cluster
End Point: /api/v6/robin_server/apps/<snapshot_id>?objtype=snapshot
Method: DELETE
URL Parameters: None
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid Api Usage Error)
Example Response:
Output
{
"plan":{
"version":"1.15.8",
"pvcpolicy":"create",
"roles":[
{
"display_name":"nginx",
"serviceAccountName":"{{app['name'].lower()}}-sa",
"scaleout":"enabled",
"name":"nginx",
"restart_on_qoscfg":true,
"vnodes":[
{
"allocated_initContainers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"init",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"limits":{
"memory":"128Mi",
"cpu":"25m"
}
},
"imagePullPolicy":"IfNotPresent",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"k8s_provider":"robin",
"bundle_object_id":"a9f229864a74f936047b1b005de391a8",
"allocated_volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"mem":{
"hugepages_2m":0,
"hugepages_1g":0,
"size":1283457024
},
"restart_num":15,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597953097832\/1597953155269\/nginx-1.0",
"root_fs":"\/usr\/local\/robin\/instances\/demo-nginx-01.t001-u000003.svc.cluster.local",
"pod_name":"demo-nginx-01",
"appid":13,
"host_ip":"172.21.20.104",
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm3"
}
}
],
"service_uids":[
"8de44f8e-fec0-47ee-b425-970758749188",
"3ca02e11-24b9-4555-8386-4f1b0e5e44fc",
"d273da82-86c3-4be6-9b29-1b930bece779"
],
"appname":"demo",
"restart_on_qoscfg":true,
"env":{
"allocated":{
"ROBINHOST_TAG_ROBINRPOOL":"default",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"POD_NS":"t001-u000003",
"POD_NAME":"demo-nginx-01",
"K8S_NODE":"cscale-82-140",
"ROBINHOST":"cscale-82-140.robinsystems.com",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64"
}
},
"serviceAccountName":"{{app['name'].lower()}}-sa",
"initContainers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"init",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"limits":{
"memory":"128Mi",
"cpu":"25m"
}
},
"imagePullPolicy":"IfNotPresent",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"enable_hooklogs":true,
"vnodeid":13,
"allocated_volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"demo-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"demo-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"demo-cm3"
}
}
],
"volume_groups":[
{
"rpoolid":1,
"name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7",
"media":"HDD",
"stormgr_id":6,
"layout":"round-robin",
"replicas":1,
"volumes":[
"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42"
],
"device_sets":[
{
"devices":[
{
"host":"cscale-82-140.robinsystems.com",
"tags":{
},
"wwn":"0x600224803bcdafde95b1f5cd27ceb5fb",
"hostname":"cscale-82-140.robinsystems.com",
"max_volumes_per_disk":10,
"stormgr_id":2,
"slices":77,
"score":73,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224803bcdafde95b1f5cd27ceb5fb",
"allocated_slices":24,
"max_latency_sensitive_vols_per_disk":2,
"write_unit":4096,
"psize":107374182400,
"reattachable":0,
"pused":1107296256,
"max_throughput_intensive_vols_per_disk":1,
"protected":0,
"role":"Storage",
"aslices":50,
"state":"READY",
"capacity":107374182400
}
],
"name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7.0.a6cab386-2774-46d1-ad51-7a0f11fcdb35",
"stormgr_id":6
}
]
}
],
"gpu":{
"min":0,
"max":0
},
"bundleid":1,
"engine":"docker",
"annotations":{
"annokey1":"annovalue1",
"allocated":{
"annokey1":"annovalue1",
"annokey2":"annovalue2"
},
"annokey2":"annovalue2"
},
"ctime":1598453564,
"podSecurityContext":{
"runAsUser":0,
"allocated":{
"runAsUser":0
}
},
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
],
"kubernetes.io\/os":[
"linux"
]
},
"allocated_host":"cscale-82-140.robinsystems.com",
"calico_inuse":true,
"image":{
"version":"1.15.8-alpine",
"registry_hostname":"",
"name":"nginx",
"engine":"docker",
"registry_port":""
},
"hostAliases":[
{
"hostnames":[
"foo.remote",
"bar.remote"
],
"ip":"1.2.3.4"
}
],
"readinessProbe":{
"exec":{
"command":[
"sleep",
"1"
]
},
"initialDelaySeconds":5,
"allocated":{
"exec":{
"command":[
"sleep",
"1"
]
},
"initialDelaySeconds":5
}
},
"rpoolid":1,
"role":"nginx",
"livenessProbe":{
"allocated":{
"periodSeconds":3,
"httpGet":{
"path":"\/",
"httpHeaders":[
{
"value":"Awesome",
"name":"Custom-Header"
}
],
"port":80
},
"initialDelaySeconds":3
},
"periodSeconds":3,
"httpGet":{
"path":"\/",
"httpHeaders":[
{
"value":"Awesome",
"name":"Custom-Header"
}
],
"port":80
},
"initialDelaySeconds":3
},
"utime":1598453564,
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"hostname":"demo-nginx-01.t001-u000003.svc.cluster.local",
"name":"demo.nginx.01",
"numa_allocations":{
"0":{
"gpu_used":0,
"isol_shared_cores_used":0,
"isol_dedicated_cores_used":0,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"mem_used":1283457024,
"non_isol_cores_used":1
}
},
"sidecars":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"busyside1",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"requests":{
"memory":"100Mi"
},
"limits":{
"memory":"200Mi"
}
},
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"3000"
]
}
],
"storage":[
{
"faultdomain":"host",
"pvcpolicy":"create",
"compression":"disabled",
"vol_ns":"t001-u000003",
"snapname":"snap1",
"lvm_vol_count":"0",
"replication":1,
"name":"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42",
"blocksize":4096,
"workload":0,
"protection":0,
"type":"data",
"k8s_name":"demo-nginx-01-data-1-68f51300",
"volgrp_name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7",
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"lvm_type":"None",
"snapshot_space_limit":4294967296,
"layout":"round-robin",
"encryption":"none",
"disk_tags":{
},
"mount_in_sidecars":true,
"allocated":{
"qgroupid":5,
"multinode_mounting":false,
"compression":0,
"genkey":1598453534287911,
"priority":2,
"snapname":"snap1",
"vtype":0,
"replication":1,
"current_snapshotid":1,
"name":"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42",
"params":{
},
"protection":0,
"appid":1,
"appname":"default",
"snapshot_space_limit":4294967296,
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"block_size":4096,
"partitions":0,
"current_snapshot":"active_snap",
"grpid":6,
"next_snapshotid":2,
"next_backupid":1,
"media":72,
"size":21474836480,
"slice_size":1073741824,
"volumeid":"6",
"resource_poolid":1
},
"snap_reserved":20,
"media":"HDD",
"mount_in_initcontainers":true,
"path":"\/opt\/data",
"fstype":"ext4",
"size":21474836480
}
],
"labels":{
"labelkey2":"labelvalue2",
"allocated":{
"labelkey2":"labelvalue2",
"labelkey1":"labelvalue1"
},
"labelkey1":"labelvalue1"
},
"allocated_host_type":"physical",
"enable_metrics":true,
"pod_ns":"t001-u000003",
"allocated_host_public_ip":"10.9.82.140",
"enable_portmapping":true,
"vnodehookargs":{
},
"cpu":{
"reserve":false,
"min":0,
"max":1
},
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"allocated_sidecars":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"busyside1",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"requests":{
"memory":"100Mi"
},
"limits":{
"memory":"200Mi"
}
},
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"3000"
]
}
],
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCULUZ7abTGyeGhxSuXejf0VohBrk2ndhAQj0mx8whbs\/qyJmVmzenvGUVGGXSfri7m3PE++2V0xMathKizVpjcrWXoFTNZLlJKBVWog5XaCYIYRswAlow+rQU6aKJ+lP2DlUgmpZ9iG9VCae0vt+JosC2LeIDmgNm5vD6AN0aB\/rKHeQjCiJyvr90d9MbQ\/JAsh+\/1EkA4fTuTXRstlMH86gB+7JhAeCROIBz32Y7HV8hKf0SQx2fj2XFeQsRcZm8oC8n1En87qBXk+iz3qKkZBduNDp8XnKWFvhsKDQkuWGr1jUNp1SyaqNSFFZrv+EyFC1sHoORuJwAwYp8DLwyF root@cscale-82-140"
],
"role_name":"nginx",
"allocated":{
"zonename":"default",
"nodeid":1,
"nodename":"cscale-82-140",
"zoneid":1597969746
},
"allocated_serviceAccountName":"demo-sa",
"securityContext":{
"allowPrivilegeEscalation":true,
"allocated":{
"allowPrivilegeEscalation":true
}
},
"network":[
{
"allocated_names":[
"eth0"
],
"interfaces":1,
"allocated_netmask":"255.255.0.0",
"name":"robin-default",
"ippool":"robin-default",
"allocated_ip":"172.21.20.104",
"driver":"calico",
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_prefix":16
}
],
"sidecar_info":{
"containers":[
{
"hugepages_2m":0,
"name":"busyside1",
"cpu":0,
"mem":209715200,
"gpu":0,
"hugepages_1g":0
}
],
"hugepages_2m":0,
"cpu":0,
"mem":209715200,
"gpu":0,
"hugepages_1g":0
},
"state":"STARTED",
"id":13,
"services":[
{
"annotations":{
"a1":"av1",
"a2":"av2"
},
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"vnode",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"appname":"demo",
"scope":"pod",
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":31574,
"port":80,
"target_port":80
}
],
"cluster_ip":"172.19.64.18",
"vnodename":"demo-nginx-01",
"type":"NodePort",
"k8s_name":"demo-nginx-01-np-0",
"selectors":{
"robin.io\/vnode":"demo-nginx-01"
}
}
]
}
],
"hostAliases":[
{
"hostnames":[
"foo.remote",
"bar.remote"
],
"ip":"1.2.3.4"
}
],
"volume_groups":[
],
"image":{
"version":"1.15.8-alpine",
"registry_hostname":"",
"name":"nginx",
"engine":"docker",
"registry_port":""
},
"services":[
{
"rolename":"nginx",
"annotations":{
"a1":"av1",
"a2":"av2"
},
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":null,
"port":80,
"target_port":80
}
],
"appname":"demo",
"cluster_ip":"172.19.177.184",
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"role",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"type":"ClusterIP",
"k8s_name":"demo-nginx-cl-0",
"selectors":{
"app":"demo",
"robin.io\/role":"nginx"
}
},
{
"rolename":"nginx",
"annotations":{
"a1":"av1",
"a2":"av2"
},
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":32392,
"port":80,
"target_port":80
}
],
"appname":"demo",
"cluster_ip":"172.19.51.165",
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"role",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"type":"LoadBalancer",
"k8s_name":"demo-nginx-lb-0",
"selectors":{
"app":"demo",
"robin.io\/role":"nginx"
}
}
],
"qgroups":{
"data":{
"rd_min_iops":0,
"rd_weight":1,
"enabled":false,
"rd_max_iops":2000000,
"wr_min_window":500,
"wr_weight":1,
"priority":1,
"wr_min_iops":0,
"rd_min_window":500,
"wr_max_iops":2000000
}
}
}
],
"apphooks":{
"postdestroy":"python3 postdestroy.py",
"allocated":{
"postcreate":{
"spec":{
"template":{
"spec":{
"containers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"demo-pin1",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"backoffLimit":4,
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"demo-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"demo-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"demo-cm3"
}
}
],
"restartPolicy":"Never"
}
}
},
"type":"job"
},
"precreate":"python3 precreate.py",
"info":"python3 app_info.py",
"preclone":"python3 precreate.py",
"postdestroy":"python3 postdestroy.py"
},
"postcreate":{
"spec":{
"template":{
"spec":{
"containers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"{{app['name'].lower()}}-pin1",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"backoffLimit":4,
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm3"
}
}
],
"restartPolicy":"Never"
}
}
},
"type":"job"
},
"info":"python3 app_info.py",
"preclone":"python3 precreate.py",
"precreate":"python3 precreate.py"
},
"bundle_object_id":"a9f229864a74f936047b1b005de391a8",
"clonemode":"unfenced",
"zoneid":1597969746,
"tenant":"Administrators",
"from_template":null,
"master_name":"demo",
"parent_app_state":6,
"parent_last_known_state":6,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597953097832\/1597953155269\/nginx-1.0",
"rpoolid":1,
"snapshot":"enabled",
"appvars":{
"var2":"{{APP_NAME}}-val2",
"var1":"{{APP_NAME}}-val1"
},
"snapname":"snap1",
"rpool":"default",
"restart_num":15,
"username":"robin",
"app_ns":"t001-u000003",
"namespace":"t001-u000003",
"desc":"",
"parentid":13,
"enable_metrics":true,
"enable_hooklogs":true,
"allocated_appvars":{
"var2":"demo-val2",
"var1":"demo-val1"
},
"id":13,
"robin_version":"5.3.1-230",
"auto_relocate":true,
"bundleid":1,
"name":"demo_snap1",
"content_id":"a9f229864a74f936047b1b005de391a8",
"planid":14,
"clone":"enabled",
"parent_app":"demo"
},
"jobid":147
}
11.4. Restore an Application Snapshot from a Backup¶
In order to restore a locally deleted snapshot from a backup copy stored in an external storage repository, issue the following command:
# robin snapshot restore <backupid>
|
Unique ID of a backup (obtained from the output of |
Example:
List backups
# robin backup list
+----------------------------------+--------------------------+----------+----------------------------+--------+
| Backup ID | Backup Name | Repo | Snapshot Name | State |
+----------------------------------+--------------------------+----------+----------------------------+--------+
| a9a29bf44c6611ea80e52dcf1d27e528 | mysql2_backup-1581381428 | testrepo | mysql2_snapshot-1581381428 | Pushed |
+----------------------------------+--------------------------+----------+----------------------------+--------+
Verify the snapshot does not exist locally
# robin snapshot list
+----------------------------------+--------+----------+----------+------------------------------+
| Snapshot ID | State | App Name | App Kind | Snapshot name |
+----------------------------------+--------+----------+----------+------------------------------+
+----------------------------------+--------+----------+----------+------------------------------+
Restore the snapshot from the backup
# robin snapshot restore a9a29bf44c6611ea80e52dcf1d27e528 --wait
Job: 354 Name: K8SAppSnapshotRestore State: PREPARED Error: 0
Job: 354 Name: K8SAppSnapshotRestore State: AGENT_WAIT Error: 0
Job: 354 Name: K8SAppSnapshotRestore State: COMPLETED Error: 0
Verify the snapshot has been restored
# robin snapshot list
+----------------------------------+--------+----------+----------+------------------------------+
| Snapshot ID | State | App Name | App Kind | Snapshot name |
+----------------------------------+--------+----------+----------+------------------------------+
| a4e900c84c6611eab476b72c237544ba | ONLINE | mysql2 | helm | mysql2_snapshot-1581381428 |
+----------------------------------+--------+----------+----------+------------------------------+
Restores a locally deleted snapshot from a backup copy stored in an external storage repository
End Point: /v3/robin_server/snapshots/
Method: PUT
URL Parameters: None
Data Parameters:
action: restore
- This mandatory field within the payload specifies that the restore operation is to be performed.backupid: <backupid>
- This mandatory field within the payload specifies which backup the snapshot should be restored from.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"snapshotid":"41c719f0e77911ea93d70b35167412fa",
"action":"restore",
"backupname":"bkp-1",
"vols":{
"pvc-098e3286-a989-42ba-9333-12d922973514":{
"metadata":{
"annotations":{
"robin.io\/fstype":"ext4",
"robin.io\/appid":"1",
"robin.io\/snapshotid":"1",
"volume.beta.kubernetes.io\/storage-provisioner":"robin",
"robin.io\/snapname":"mysql-1_s1_r-100000",
"robin.io\/zoneid":"1598446881",
"robin.io\/volumeid":"4",
"meta.helm.sh\/release-namespace":"t001-u000003",
"robin.io\/encryption":"none",
"robin.io\/vol_snapname":"s1_r-100000",
"robin.io\/backupid":"2",
"meta.helm.sh\/release-name":"mysql-1",
"robin.io\/blocksize":"4096",
"volume.kubernetes.io\/selected-node":"qct-07",
"robin.io\/volumename":"pvc-098e3286-a989-42ba-9333-12d922973514"
},
"labels":{
"app.kubernetes.io\/managed-by":"Helm",
"chart":"mysql-1.6.6",
"app":"mysql-1",
"heritage":"Helm",
"release":"mysql-1"
},
"namespace":"t001-u000003",
"name":"mysql-1"
},
"apiVersion":"v1",
"kind":"PersistentVolumeClaim",
"spec":{
"storageClassName":"workers",
"accessModes":[
"ReadWriteOnce"
],
"resources":{
"requests":{
"storage":"10Gi"
}
},
"volumeMode":"Filesystem"
}
}
},
"appname":"mysql-1",
"import":false,
"snapname":"mysql-1_s1_r-100000",
"repo":"repo-1",
"backupid":"b94b6db0e7c311ea9d9f49af5651f4a6",
"job_finished":true,
"backup_path_prefix":"1598446881\/mysql-1_1\/b94b6db0e7c311ea9d9f49af5651f4a6"
},
"jobid":190
}
11.5. List Application Snapshots¶
Issue the following command to list application snapshots the current user is entitled to view:
# robin snapshot list --app <app_name>
--app-kind <app_kind>
--verbose
|
Only include snapshots for the specified applicaiton instance |
|
Filter by application kind (valid choices are ‘robin’, ‘helm’, and ‘flexapp’) |
|
Include additional information in the output |
Example 1: List snapshots of a specific app
# robin snapshot list --app mydb
+----------------------------------+--------+----------+----------+---------------+
| Snapshot ID | State | App Name | App type | Snapshot name |
+----------------------------------+--------+----------+----------+---------------+
| 861bd41c5a4e11e9b18bf189ccf1d49b | ONLINE | mydb | helm | mydb_snap1 |
+----------------------------------+--------+----------+----------+---------------+
Example 2: List all snapshots
# robin snapshot list
+----------------------------------+--------+----------+----------+--------------------+
| Snapshot ID | State | App Name | App type | Snapshot name |
+----------------------------------+--------+----------+----------+--------------------+
| 861bd41c5a4e11e9b18bf189ccf1d49b | ONLINE | mydb | helm | mydb_snap1 |
| 8d2fa8145a4f11e9b59c2d26c7e69a00 | ONLINE | mysql-1 | helm | mysql-1_snap-mysql |
+----------------------------------+--------+----------+----------+--------------------+
Lists all application snapshots.
End Point: /api/v6/robin_server/appsview?atype=SNAPSHOT
Method: GET
URL Parameters:
parentapp=<app_name>
: Utilizing this parameter filters the results such that only snapshots of the specified application are returned.akind=[robin,helm,flexapp]
: Utilizing this parameter filters the results by the kind specified. Valid values include robin, helm and flexapp.
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error)
Example Response:
Output
{
"robin":{
"tenants":[
{
"name":"Administrators",
"id":1
}
],
"rpools":[
{
"name":"default",
"id":1
}
],
"zones":[
{
"zoneid":1597969746,
"name":"default",
"id":1
}
],
"vnodes":[
{
"nodeid":1,
"mem":4194304,
"userid":3,
"zoneid":null,
"cpu":1,
"role":"dsbundle",
"gpu":0,
"hugepages_1g":0,
"utime":1598343982,
"hugepages_2m":0,
"hostname":"test-app-new-dsbundle-01.t001-u000003.svc.cluster.local",
"name":"test-app-new.dsbundle.01",
"status":"ONLINE",
"pod_name":"test-app-new-dsbundle-01",
"appid":12,
"engine":"docker",
"tenantid":1,
"state":"STARTED",
"id":12,
"desired_status":"ONLINE",
"pod_ns":"t001-u000003"
},
{
"nodeid":1,
"mem":1283457024,
"userid":3,
"zoneid":null,
"cpu":1,
"role":"nginx",
"gpu":0,
"hugepages_1g":0,
"utime":1598453564,
"hugepages_2m":0,
"hostname":"demo-nginx-01.t001-u000003.svc.cluster.local",
"name":"demo.nginx.01",
"status":"ONLINE",
"pod_name":"demo-nginx-01",
"appid":13,
"engine":"docker",
"tenantid":1,
"state":"STARTED",
"id":13,
"desired_status":"ONLINE",
"pod_ns":"t001-u000003"
}
],
"users":[
{
"email":null,
"tenantid":1,
"firstname":"Robin",
"id":3,
"username":"robin",
"lastname":"Systems"
}
],
"nodes":[
{
"rpoolid":1,
"memory_used":0,
"nvnodes":0,
"k8s_node_name":"cscale-82-140",
"zoneid":1,
"cpu":40,
"mem":33555701760,
"mem_for_storage":1073741824,
"cpu_prov_factor":10,
"name":"cscale-82-140.robinsystems.com",
"cpu_cores_present":40,
"state":"ONLINE",
"id":1,
"cores_used":0,
"services":"{\"update_time\":1598470070.8638851643,\"services\":{\"stormgr-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:43.555551\",\"MainPID\":2275,\"Id\":\"stormgr-server\"},\"consul-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:49.778591\",\"MainPID\":566,\"Id\":\"consul-server\"},\"consul_members\":[{\"Port\":29460,\"Status\":1,\"DelegateMax\":5,\"ProtocolMin\":1,\"Tags\":{\"segment\":\"\",\"bootstrap\":\"1\",\"vsn_min\":\"2\",\"build\":\"0.9.4:40f243a+\",\"vsn_max\":\"3\",\"vsn\":\"2\",\"raft_vsn\":\"2\",\"role\":\"consul\",\"dc\":\"consul\",\"id\":\"9d550700-9fac-4de6-b6bc-1b957e82bda9\",\"wan_join_port\":\"29461\",\"port\":\"29459\"},\"Name\":\"cscale-82-140.robinsystems.com\",\"DelegateMin\":2,\"ProtocolCur\":2,\"DelegateCur\":4,\"Addr\":\"10.9.82.140\",\"ProtocolMax\":5}],\"robin-auth-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:10.587576\",\"MainPID\":1007,\"Id\":\"robin-auth-server\"},\"robin-node-monitor\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:31.387560\",\"MainPID\":1245,\"Id\":\"robin-node-monitor\"},\"robin-watchdog\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:54.388588\",\"MainPID\":867,\"Id\":\"robin-watchdog\"},\"sherlock-server\":{\"ActiveState\":\"inactive\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":0,\"MainPID\":0,\"Id\":\"sherlock-server\"},\"httpd\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:46.799549\",\"MainPID\":2590,\"Id\":\"httpd\"},\"robin-file-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:15.559572\",\"MainPID\":1074,\"Id\":\"robin-file-server\"},\"robin-event-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:15.088572\",\"MainPID\":1041,\"Id\":\"robin-event-server\"},\"consul-client\":{\"ActiveState\":\"inactive\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":0,\"MainPID\":0,\"Id\":\"consul-client\"},\"gui-cli\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:46.964548\",\"MainPID\":2622,\"Id\":\"gui-cli\"},\"robin-agent\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:38.987554\",\"MainPID\":1716,\"Id\":\"robin-agent\"},\"robin-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-26 12:27:39.201277\",\"MainPID\":15116,\"Id\":\"robin-server\"},\"iomgr-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 12:51:14.290049\",\"MainPID\":29172,\"Id\":\"iomgr-server\"},\"monitor-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:47.114548\",\"MainPID\":2662,\"Id\":\"monitor-server\"},\"postgresql-9.6\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:52.396589\",\"MainPID\":662,\"Id\":\"postgresql-9.6\"},\"consul_dns\":true}}"
}
],
"bundles":[
{
"version":"1.0",
"name":"nginx",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":1
},
{
"version":"1.0",
"name":"tolerations",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":2
},
{
"version":"1.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":3
},
{
"version":"2.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":4
},
{
"version":"3.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":5
},
{
"version":"4.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":6
},
{
"version":"10.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":7
},
{
"version":"11.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":8
},
{
"version":"12.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":9
},
{
"version":"15.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":10
},
{
"version":"new",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":11
},
{
"version":"20.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":12
}
],
"apps":[
{
"rpoolid":1,
"nvnodes":0,
"zoneid":1,
"mem":0,
"atype":"SNAPSHOT",
"name":"demo_snap1",
"status":"Ready",
"hugepages_1g":0,
"tenantid":1,
"error":0,
"utime":0,
"parentid":13,
"userid":3,
"cpu":0,
"gpu":0,
"bundleid":1,
"hugepages_2m":0,
"health":"Unknown",
"ctime":1598454187,
"unique_id":"3fb7b2c0e7ad11eaaa9ea101b344257c",
"parent_app_type":"MASTER",
"state":"ONLINE",
"id":14,
"parent_app":"demo"
}
]
},
"k8s":[
{
"spec":"apiVersion: v1\ndata: {run.sh: ''}\nkind: ConfigMap\nmetadata:\n labels: {app: ideal-giraffe-mysql, chart: mysql-1.6.6, heritage: Tiller, release: ideal-giraffe}\n name: ideal-giraffe-mysql-test\n namespace: t001-u000003\n---\napiVersion: v1\ndata: {mysql-password: Z0dPczVJRnc3aA==, mysql-root-password: WGdoZ0tRd0kyaQ==}\nkind: Secret\nmetadata:\n labels: {app: ideal-giraffe-mysql, chart: mysql-1.6.6, heritage: Tiller, release: ideal-giraffe}\n name: ideal-giraffe-mysql\n namespace: t001-u000003\ntype: Opaque\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n annotations: {robin.io\/appid: '1', robin.io\/blocksize: '4096', robin.io\/encryption: none,\n robin.io\/fstype: ext4, robin.io\/snapname: demo-helm_snap1, robin.io\/snapshotid: '1',\n robin.io\/vol_snapname: snap1, robin.io\/volumeid: '7', robin.io\/volumename: pvc-b4d27bfb-a898-4acc-a250-071591c5da14,\n robin.io\/zoneid: '1597969746', volume.beta.kubernetes.io\/storage-provisioner: robin,\n volume.kubernetes.io\/selected-node: cscale-82-140}\n labels: {app: ideal-giraffe-mysql, chart: mysql-1.6.6, heritage: Tiller, release: ideal-giraffe}\n name: ideal-giraffe-mysql\n namespace: t001-u000003\nspec:\n accessModes: [ReadWriteOnce]\n resources:\n requests: {storage: 8Gi}\n storageClassName: robin\n volumeMode: Filesystem\n---\napiVersion: v1\nkind: Pod\nmetadata:\n annotations: {cni.projectcalico.org\/podIPs: 172.21.7.204\/32, k8s.v1.cni.cncf.io\/network-status: \"[{\\n\\\n \\ \\\"name\\\": \\\"calico\\\",\\n \\\"ips\\\": [\\n \\\"172.21.7.204\\\"\\n ],\\n\\\n \\ \\\"default\\\": true,\\n \\\"dns\\\": {}\\n}]\", k8s.v1.cni.cncf.io\/networks-status: \"[{\\n\\\n \\ \\\"name\\\": \\\"calico\\\",\\n \\\"ips\\\": [\\n \\\"172.21.7.204\\\"\\n ],\\n\\\n \\ \\\"default\\\": true,\\n \\\"dns\\\": {}\\n}]\"}\n labels: {app: ideal-giraffe-mysql, pod-template-hash: 7bdc9fd456, release: ideal-giraffe}\n name: ideal-giraffe-mysql-7bdc9fd456-ld9mm\n namespace: t001-u000003\nspec:\n containers:\n - env:\n - name: MYSQL_ROOT_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-root-password, name: ideal-giraffe-mysql}\n - name: MYSQL_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-password, name: ideal-giraffe-mysql, optional: true}\n - {name: MYSQL_USER}\n - {name: MYSQL_DATABASE}\n image: mysql:5.7.30\n imagePullPolicy: IfNotPresent\n livenessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 30\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 5\n name: ideal-giraffe-mysql\n ports:\n - {containerPort: 3306, name: mysql, protocol: TCP}\n readinessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 5\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 1\n resources:\n requests: {cpu: 100m, memory: 256Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n dnsPolicy: ClusterFirst\n initContainers:\n - command: [rm, -fr, \/var\/lib\/mysql\/lost+found]\n image: busybox:1.32\n imagePullPolicy: IfNotPresent\n name: remove-lost-found\n resources:\n requests: {cpu: 10m, memory: 10Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n nodeName: cscale-82-140\n priority: 0\n restartPolicy: Always\n schedulerName: default-scheduler\n securityContext: {}\n serviceAccount: default\n serviceAccountName: default\n terminationGracePeriodSeconds: 30\n tolerations:\n - {effect: NoExecute, key: node.kubernetes.io\/not-ready, operator: Exists, tolerationSeconds: 300}\n - {effect: NoExecute, key: node.kubernetes.io\/unreachable, operator: Exists, tolerationSeconds: 300}\n volumes:\n - name: data\n persistentVolumeClaim: {claimName: ideal-giraffe-mysql}\n---\napiVersion: v1\nkind: Service\nmetadata:\n labels: {app: ideal-giraffe-mysql, chart: mysql-1.6.6, heritage: Tiller, release: ideal-giraffe}\n name: ideal-giraffe-mysql\n namespace: t001-u000003\nspec:\n ports:\n - {name: mysql, port: 3306, protocol: TCP, targetPort: mysql}\n selector: {app: ideal-giraffe-mysql}\n sessionAffinity: None\n type: ClusterIP\n---\napiVersion: apps\/v1\nkind: ReplicaSet\nmetadata:\n annotations: {deployment.kubernetes.io\/desired-replicas: '1', deployment.kubernetes.io\/max-replicas: '1',\n deployment.kubernetes.io\/revision: '1'}\n labels: {app: ideal-giraffe-mysql, pod-template-hash: 7bdc9fd456, release: ideal-giraffe}\n name: ideal-giraffe-mysql-7bdc9fd456\n namespace: t001-u000003\nspec:\n replicas: 1\n selector:\n matchLabels: {app: ideal-giraffe-mysql, pod-template-hash: 7bdc9fd456, release: ideal-giraffe}\n template:\n metadata:\n creationTimestamp: null\n labels: {app: ideal-giraffe-mysql, pod-template-hash: 7bdc9fd456, release: ideal-giraffe}\n spec:\n containers:\n - env:\n - name: MYSQL_ROOT_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-root-password, name: ideal-giraffe-mysql}\n - name: MYSQL_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-password, name: ideal-giraffe-mysql, optional: true}\n - {name: MYSQL_USER}\n - {name: MYSQL_DATABASE}\n image: mysql:5.7.30\n imagePullPolicy: IfNotPresent\n livenessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 30\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 5\n name: ideal-giraffe-mysql\n ports:\n - {containerPort: 3306, name: mysql, protocol: TCP}\n readinessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 5\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 1\n resources:\n requests: {cpu: 100m, memory: 256Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n dnsPolicy: ClusterFirst\n initContainers:\n - command: [rm, -fr, \/var\/lib\/mysql\/lost+found]\n image: busybox:1.32\n imagePullPolicy: IfNotPresent\n name: remove-lost-found\n resources:\n requests: {cpu: 10m, memory: 10Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n restartPolicy: Always\n schedulerName: default-scheduler\n securityContext: {}\n serviceAccount: default\n serviceAccountName: default\n terminationGracePeriodSeconds: 30\n volumes:\n - name: data\n persistentVolumeClaim: {claimName: ideal-giraffe-mysql}\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n annotations: {deployment.kubernetes.io\/revision: '1'}\n labels: {app: ideal-giraffe-mysql, chart: mysql-1.6.6, heritage: Tiller, release: ideal-giraffe}\n name: ideal-giraffe-mysql\n namespace: t001-u000003\nspec:\n progressDeadlineSeconds: 600\n replicas: 1\n revisionHistoryLimit: 10\n selector:\n matchLabels: {app: ideal-giraffe-mysql, release: ideal-giraffe}\n strategy: {type: Recreate}\n template:\n metadata:\n creationTimestamp: null\n labels: {app: ideal-giraffe-mysql, release: ideal-giraffe}\n spec:\n containers:\n - env:\n - name: MYSQL_ROOT_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-root-password, name: ideal-giraffe-mysql}\n - name: MYSQL_PASSWORD\n valueFrom:\n secretKeyRef: {key: mysql-password, name: ideal-giraffe-mysql, optional: true}\n - {name: MYSQL_USER}\n - {name: MYSQL_DATABASE}\n image: mysql:5.7.30\n imagePullPolicy: IfNotPresent\n livenessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 30\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 5\n name: ideal-giraffe-mysql\n ports:\n - {containerPort: 3306, name: mysql, protocol: TCP}\n readinessProbe:\n exec:\n command: [sh, -c, 'mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}']\n failureThreshold: 3\n initialDelaySeconds: 5\n periodSeconds: 10\n successThreshold: 1\n timeoutSeconds: 1\n resources:\n requests: {cpu: 100m, memory: 256Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n dnsPolicy: ClusterFirst\n initContainers:\n - command: [rm, -fr, \/var\/lib\/mysql\/lost+found]\n image: busybox:1.32\n imagePullPolicy: IfNotPresent\n name: remove-lost-found\n resources:\n requests: {cpu: 10m, memory: 10Mi}\n terminationMessagePath: \/dev\/termination-log\n terminationMessagePolicy: File\n volumeMounts:\n - {mountPath: \/var\/lib\/mysql, name: data}\n restartPolicy: Always\n schedulerName: default-scheduler\n securityContext: {}\n serviceAccount: default\n serviceAccountName: default\n terminationGracePeriodSeconds: 30\n volumes:\n - name: data\n persistentVolumeClaim: {claimName: ideal-giraffe-mysql}\n",
"description":"",
"kind":"helm",
"tenant":"Administrators",
"restored":false,
"name":"demo-helm_snap1",
"appname":"demo-helm",
"create_time":1598471771,
"state":"ONLINE",
"id":"2e9b06e2e7d611eabebb977b67a45f3b",
"username":"robin",
"num_backups":0,
"desc":"-"
}
]
}
11.6. Show Information About a Specific Snapshot¶
In order to attain details about a specific snapshot such as its kind, the objects which are captured within it and its creation time, issue the following command:
# robin snapshot info <snapshotid>
--specs
|
Unique ID of the snapshot |
|
Output the spec file associated with the snapshot |
Example 1: Information displayed for a Robin Bundle based application snapshot
# robin snapshot info 3fb7b2c0e7ad11eaaa9ea101b344257c
Name : demo_snap1
Id : 3fb7b2c0e7ad11eaaa9ea101b344257c
Application Name : demo
Application Kind : ROBIN
State : ONLINE
Description : -
Number of volumes : 1
Number of backups : 0
Creation Time : 26 Aug 2020 08:03:07
Restored : FALSE
Instances:
+---------------+---------------+--------------+
| Name | Pod Name | Namespace |
+---------------+---------------+--------------+
| demo.nginx.01 | demo-nginx-01 | t001-u000003 |
+---------------+---------------+--------------+
Volumes:
+-----------------------------------------------------------+-------------------------------+--------------+-----------+---------------------------+
| ROBIN Name | K8s Name | Namespace | Size (GB) | Snapshot Space Limit (GB) |
+-----------------------------------------------------------+-------------------------------+--------------+-----------+---------------------------+
| demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42 | demo-nginx-01-data-1-68f51300 | t001-u000003 | 20G | 4G |
+-----------------------------------------------------------+-------------------------------+--------------+-----------+---------------------------+
Example 2: Information displayed for a Helm based application snapshot
# robin snapshot info a4e900c84c6611eab476b72c237544ba
Name : mysql2_snapshot-1581381428
Id : a4e900c84c6611eab476b72c237544ba
Application Name : mysql2
Application Kind : helm
State : ONLINE
Description : -
Number of volumes : 1
Number of backups : 0
Creation Time : 10 Feb 2020 16:37:20
Restored : TRUE
Spec:
+-----------------------+-------------------------------------------+--------------+
| Kind | Name | Namespace |
+-----------------------+-------------------------------------------+--------------+
| ConfigMap | jaundiced-lionfish-mysql-test | t003-u000005 |
| Secret | jaundiced-lionfish-mysql | t003-u000005 |
| PersistentVolumeClaim | jaundiced-lionfish-mysql | t003-u000005 |
| Pod | jaundiced-lionfish-mysql-84bc874656-q4twd | t003-u000005 |
| Service | jaundiced-lionfish-mysql | t003-u000005 |
| ReplicaSet | jaundiced-lionfish-mysql-84bc874656 | t003-u000005 |
| Deployment | jaundiced-lionfish-mysql | t003-u000005 |
+-----------------------+-------------------------------------------+--------------+
Volumes:
+------------------------------------------+-----------+--------------------+
| ROBIN Name | Size (GB) | Snapshot Size (GB) |
+------------------------------------------+-----------+--------------------+
| pvc-a17b6cb2-a6bb-4fc4-a0e3-97baa28ffdc6 | 8 | - |
+------------------------------------------+-----------+--------------------+
Returns details about a specific snapshot such as its kind, the objects which are captured within it and its creation time,
End Point: /api/v6/robin_server/apps/<snapshot_id>?objtype=snapshot
Method: GET
URL Parameters: None
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error)
Example Response:
Output
{
"nsnapshots":0,
"updates_available":false,
"nvnodes":0,
"app_kind":"robin",
"bundle_name":"nginx",
"zoneid":1597969746,
"error":0,
"mem":0,
"gpu":0,
"vnodes":[
],
"name":"demo_snap1",
"status":"Ready",
"message":"",
"resources":[
],
"user_shares":[
],
"rpool":"default",
"nbackups":0,
"backups":[
],
"utime":0,
"owner":{
"first_name":"Robin",
"last_name":"Systems",
"email":null,
"tenant_id":1,
"username":"robin",
"user_id":3,
"tenant_name":"Administrators"
},
"restore_status":{
"bytes_count":0,
"bytes_skipped":0,
"creation_end_time":0,
"bytes_transferred":0,
"creation_time":0
},
"parentid":13,
"local_avail":true,
"clone":false,
"parent_app":"demo",
"bundle_version":"1.0",
"atype":"SNAPSHOT",
"bundleid":1,
"ctime":1598454187,
"autopilot":true,
"health":"Unknown",
"ainstances":[
],
"config":{
"version":"1.15.8",
"pvcpolicy":"create",
"roles":[
{
"display_name":"nginx",
"serviceAccountName":"{{app['name'].lower()}}-sa",
"scaleout":"enabled",
"name":"nginx",
"restart_on_qoscfg":true,
"vnodes":[
{
"allocated_initContainers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"init",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"limits":{
"memory":"128Mi",
"cpu":"25m"
}
},
"imagePullPolicy":"IfNotPresent",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"k8s_provider":"robin",
"bundle_object_id":"a9f229864a74f936047b1b005de391a8",
"allocated_volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"mem":{
"hugepages_2m":0,
"hugepages_1g":0,
"size":1283457024
},
"restart_num":15,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597953097832\/1597953155269\/nginx-1.0",
"root_fs":"\/usr\/local\/robin\/instances\/demo-nginx-01.t001-u000003.svc.cluster.local",
"pod_name":"demo-nginx-01",
"appid":13,
"host_ip":"172.21.20.104",
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm3"
}
}
],
"service_uids":[
"8de44f8e-fec0-47ee-b425-970758749188",
"3ca02e11-24b9-4555-8386-4f1b0e5e44fc",
"d273da82-86c3-4be6-9b29-1b930bece779"
],
"appname":"demo",
"restart_on_qoscfg":true,
"env":{
"allocated":{
"ROBINHOST_TAG_ROBINRPOOL":"default",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"POD_NS":"t001-u000003",
"POD_NAME":"demo-nginx-01",
"K8S_NODE":"cscale-82-140",
"ROBINHOST":"cscale-82-140.robinsystems.com",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64"
}
},
"serviceAccountName":"{{app['name'].lower()}}-sa",
"initContainers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"init",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"limits":{
"memory":"128Mi",
"cpu":"25m"
}
},
"imagePullPolicy":"IfNotPresent",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"enable_hooklogs":true,
"vnodeid":13,
"allocated_volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"demo-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"demo-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"demo-cm3"
}
}
],
"volume_groups":[
{
"rpoolid":1,
"name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7",
"media":"HDD",
"stormgr_id":6,
"layout":"round-robin",
"replicas":1,
"volumes":[
"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42"
],
"device_sets":[
{
"devices":[
{
"host":"cscale-82-140.robinsystems.com",
"tags":{
},
"wwn":"0x600224803bcdafde95b1f5cd27ceb5fb",
"hostname":"cscale-82-140.robinsystems.com",
"max_volumes_per_disk":10,
"stormgr_id":2,
"slices":77,
"score":73,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224803bcdafde95b1f5cd27ceb5fb",
"allocated_slices":24,
"max_latency_sensitive_vols_per_disk":2,
"write_unit":4096,
"psize":107374182400,
"reattachable":0,
"pused":1107296256,
"max_throughput_intensive_vols_per_disk":1,
"protected":0,
"role":"Storage",
"aslices":50,
"state":"READY",
"capacity":107374182400
}
],
"name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7.0.a6cab386-2774-46d1-ad51-7a0f11fcdb35",
"stormgr_id":6
}
]
}
],
"gpu":{
"min":0,
"max":0
},
"bundleid":1,
"engine":"docker",
"annotations":{
"annokey1":"annovalue1",
"allocated":{
"annokey1":"annovalue1",
"annokey2":"annovalue2"
},
"annokey2":"annovalue2"
},
"ctime":1598453564,
"podSecurityContext":{
"runAsUser":0,
"allocated":{
"runAsUser":0
}
},
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
],
"kubernetes.io\/os":[
"linux"
]
},
"allocated_host":"cscale-82-140.robinsystems.com",
"calico_inuse":true,
"image":{
"version":"1.15.8-alpine",
"registry_hostname":"",
"name":"nginx",
"engine":"docker",
"registry_port":""
},
"hostAliases":[
{
"hostnames":[
"foo.remote",
"bar.remote"
],
"ip":"1.2.3.4"
}
],
"readinessProbe":{
"exec":{
"command":[
"sleep",
"1"
]
},
"initialDelaySeconds":5,
"allocated":{
"exec":{
"command":[
"sleep",
"1"
]
},
"initialDelaySeconds":5
}
},
"rpoolid":1,
"role":"nginx",
"livenessProbe":{
"allocated":{
"periodSeconds":3,
"httpGet":{
"path":"\/",
"httpHeaders":[
{
"value":"Awesome",
"name":"Custom-Header"
}
],
"port":80
},
"initialDelaySeconds":3
},
"periodSeconds":3,
"httpGet":{
"path":"\/",
"httpHeaders":[
{
"value":"Awesome",
"name":"Custom-Header"
}
],
"port":80
},
"initialDelaySeconds":3
},
"utime":1598453564,
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"hostname":"demo-nginx-01.t001-u000003.svc.cluster.local",
"name":"demo.nginx.01",
"numa_allocations":{
"0":{
"gpu_used":0,
"isol_shared_cores_used":0,
"isol_dedicated_cores_used":0,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"mem_used":1283457024,
"non_isol_cores_used":1
}
},
"sidecars":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"busyside1",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"requests":{
"memory":"100Mi"
},
"limits":{
"memory":"200Mi"
}
},
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"3000"
]
}
],
"storage":[
{
"faultdomain":"host",
"pvcpolicy":"create",
"compression":"disabled",
"vol_ns":"t001-u000003",
"snapname":"snap1",
"lvm_vol_count":"0",
"replication":1,
"name":"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42",
"blocksize":4096,
"workload":0,
"protection":0,
"type":"data",
"k8s_name":"demo-nginx-01-data-1-68f51300",
"volgrp_name":"demo.nginx.01.72.1.9457505a-dcf2-4f0c-b416-9467c10342d7",
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"lvm_type":"None",
"snapshot_space_limit":4294967296,
"layout":"round-robin",
"encryption":"none",
"disk_tags":{
},
"mount_in_sidecars":true,
"allocated":{
"qgroupid":5,
"multinode_mounting":false,
"compression":0,
"genkey":1598453534287911,
"priority":2,
"snapname":"snap1",
"vtype":0,
"replication":1,
"current_snapshotid":1,
"name":"demo.nginx.01.data.1.68f51300-c283-4df7-bd9e-43d7314e1a42",
"params":{
},
"protection":0,
"appid":1,
"appname":"default",
"snapshot_space_limit":4294967296,
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"block_size":4096,
"partitions":0,
"current_snapshot":"active_snap",
"grpid":6,
"next_snapshotid":2,
"next_backupid":1,
"media":72,
"size":21474836480,
"slice_size":1073741824,
"volumeid":"6",
"resource_poolid":1
},
"snap_reserved":20,
"media":"HDD",
"mount_in_initcontainers":true,
"path":"\/opt\/data",
"fstype":"ext4",
"size":21474836480
}
],
"labels":{
"labelkey2":"labelvalue2",
"allocated":{
"labelkey2":"labelvalue2",
"labelkey1":"labelvalue1"
},
"labelkey1":"labelvalue1"
},
"allocated_host_type":"physical",
"enable_metrics":true,
"pod_ns":"t001-u000003",
"allocated_host_public_ip":"10.9.82.140",
"enable_portmapping":true,
"vnodehookargs":{
},
"cpu":{
"reserve":false,
"min":0,
"max":1
},
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"allocated_sidecars":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"busyside1",
"securityContext":{
"allowPrivilegeEscalation":true
},
"resources":{
"requests":{
"memory":"100Mi"
},
"limits":{
"memory":"200Mi"
}
},
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"3000"
]
}
],
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCULUZ7abTGyeGhxSuXejf0VohBrk2ndhAQj0mx8whbs\/qyJmVmzenvGUVGGXSfri7m3PE++2V0xMathKizVpjcrWXoFTNZLlJKBVWog5XaCYIYRswAlow+rQU6aKJ+lP2DlUgmpZ9iG9VCae0vt+JosC2LeIDmgNm5vD6AN0aB\/rKHeQjCiJyvr90d9MbQ\/JAsh+\/1EkA4fTuTXRstlMH86gB+7JhAeCROIBz32Y7HV8hKf0SQx2fj2XFeQsRcZm8oC8n1En87qBXk+iz3qKkZBduNDp8XnKWFvhsKDQkuWGr1jUNp1SyaqNSFFZrv+EyFC1sHoORuJwAwYp8DLwyF root@cscale-82-140"
],
"role_name":"nginx",
"allocated":{
"zonename":"default",
"nodeid":1,
"nodename":"cscale-82-140",
"zoneid":1597969746
},
"allocated_serviceAccountName":"demo-sa",
"securityContext":{
"allowPrivilegeEscalation":true,
"allocated":{
"allowPrivilegeEscalation":true
}
},
"network":[
{
"allocated_names":[
"eth0"
],
"interfaces":1,
"allocated_netmask":"255.255.0.0",
"name":"robin-default",
"ippool":"robin-default",
"allocated_ip":"172.21.20.104",
"driver":"calico",
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_prefix":16
}
],
"sidecar_info":{
"containers":[
{
"hugepages_2m":0,
"name":"busyside1",
"cpu":0,
"mem":209715200,
"gpu":0,
"hugepages_1g":0
}
],
"hugepages_2m":0,
"cpu":0,
"mem":209715200,
"gpu":0,
"hugepages_1g":0
},
"state":"STARTED",
"id":13,
"services":[
{
"annotations":{
"a1":"av1",
"a2":"av2"
},
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"vnode",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"appname":"demo",
"scope":"pod",
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":31574,
"port":80,
"target_port":80
}
],
"cluster_ip":"172.19.64.18",
"vnodename":"demo-nginx-01",
"type":"NodePort",
"k8s_name":"demo-nginx-01-np-0",
"selectors":{
"robin.io\/vnode":"demo-nginx-01"
}
}
]
}
],
"hostAliases":[
{
"hostnames":[
"foo.remote",
"bar.remote"
],
"ip":"1.2.3.4"
}
],
"volume_groups":[
],
"image":{
"version":"1.15.8-alpine",
"registry_hostname":"",
"name":"nginx",
"engine":"docker",
"registry_port":""
},
"services":[
{
"rolename":"nginx",
"annotations":{
"a1":"av1",
"a2":"av2"
},
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":null,
"port":80,
"target_port":80
}
],
"appname":"demo",
"cluster_ip":"172.19.177.184",
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"role",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"type":"ClusterIP",
"k8s_name":"demo-nginx-cl-0",
"selectors":{
"app":"demo",
"robin.io\/role":"nginx"
}
},
{
"rolename":"nginx",
"annotations":{
"a1":"av1",
"a2":"av2"
},
"ports":[
{
"protocol":"TCP",
"name":"web",
"node_port":32392,
"port":80,
"target_port":80
}
],
"appname":"demo",
"cluster_ip":"172.19.51.165",
"labels":{
"l2":"v2",
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"scope":"role",
"robin.io\/tenant":"Administrators",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"l1":"v1"
},
"type":"LoadBalancer",
"k8s_name":"demo-nginx-lb-0",
"selectors":{
"app":"demo",
"robin.io\/role":"nginx"
}
}
],
"qgroups":{
"data":{
"rd_min_iops":0,
"rd_weight":1,
"enabled":false,
"rd_max_iops":2000000,
"wr_min_window":500,
"wr_weight":1,
"priority":1,
"wr_min_iops":0,
"rd_min_window":500,
"wr_max_iops":2000000
}
}
}
],
"apphooks":{
"postdestroy":"python3 postdestroy.py",
"allocated":{
"postcreate":{
"spec":{
"template":{
"spec":{
"containers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"demo-pin1",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"backoffLimit":4,
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"demo-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"demo-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"demo-cm3"
}
}
],
"restartPolicy":"Never"
}
}
},
"type":"job"
},
"precreate":"python3 precreate.py",
"info":"python3 app_info.py",
"preclone":"python3 precreate.py",
"postdestroy":"python3 postdestroy.py"
},
"postcreate":{
"spec":{
"template":{
"spec":{
"containers":[
{
"volumeMounts":[
{
"mountPath":"\/cm1",
"name":"vol-cm1"
},
{
"mountPath":"\/cm2",
"name":"vol-cm2"
},
{
"mountPath":"\/cm3",
"name":"vol-cm3"
}
],
"name":"{{app['name'].lower()}}-pin1",
"image":"k8s.gcr.io\/busybox",
"command":[
"sleep",
"1"
]
}
],
"backoffLimit":4,
"volumes":[
{
"name":"vol-cm1",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm1"
}
},
{
"name":"vol-cm2",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm2"
}
},
{
"name":"vol-cm3",
"configMap":{
"defaultMode":420,
"name":"{{app['name'].lower()}}-cm3"
}
}
],
"restartPolicy":"Never"
}
}
},
"type":"job"
},
"info":"python3 app_info.py",
"preclone":"python3 precreate.py",
"precreate":"python3 precreate.py"
},
"bundle_object_id":"a9f229864a74f936047b1b005de391a8",
"clonemode":"unfenced",
"zoneid":1597969746,
"tenant":"Administrators",
"from_template":null,
"master_name":"demo",
"parent_last_known_state":6,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597953097832\/1597953155269\/nginx-1.0",
"rpoolid":1,
"snapshot":"enabled",
"appvars":{
"var2":"{{APP_NAME}}-val2",
"var1":"{{APP_NAME}}-val1"
},
"snapname":"snap1",
"rpool":"default",
"restart_num":15,
"username":"robin",
"app_ns":"t001-u000003",
"namespace":"t001-u000003",
"desc":"",
"parentid":13,
"enable_metrics":true,
"enable_hooklogs":true,
"allocated_appvars":{
"var2":"demo-val2",
"var1":"demo-val1"
},
"id":13,
"robin_version":"5.3.1-230",
"auto_relocate":true,
"bundleid":1,
"name":"demo_snap1",
"content_id":"a9f229864a74f936047b1b005de391a8",
"planid":14,
"clone":"enabled"
},
"appcfg_autopilot":true,
"snapshots":[
],
"unique_id":"3fb7b2c0e7ad11eaaa9ea101b344257c",
"disk":0,
"backup_state":"Push failed",
"state":"ONLINE",
"id":14,
"cpu":0,
"repos":[
],
"storagerepos":[
]
}