|
15 | 15 | parser.add_argument('-d', '--domain', type=str, default='local') # Cohesity User Domain |
16 | 16 | parser.add_argument('-v', '--view', type=str, required=True) # name of source view to clone |
17 | 17 | parser.add_argument('-n', '--newname', type=str, required=True) # name of target view to create |
| 18 | +parser.add_argument('-f', '--filedate', type=str, default=None) # date time to recover view to |
18 | 19 | parser.add_argument('-w', '--wait', action='store_true') # wait for completion |
19 | 20 |
|
20 | 21 | args = parser.parse_args() |
|
24 | 25 | domain = args.domain |
25 | 26 | viewName = args.view |
26 | 27 | newName = args.newname |
| 28 | +filedate = args.filedate |
27 | 29 | wait = args.wait |
28 | 30 |
|
29 | 31 | ### authenticate |
|
41 | 43 | print("View %s not found" % viewName) |
42 | 44 | exit() |
43 | 45 |
|
44 | | -viewResult = viewResults[0] |
| 46 | +doc = viewResults[0]['vmDocument'] |
45 | 47 |
|
46 | | -view = api('get', 'views/%s?includeInactive=True' % viewResult['vmDocument']['objectName']) |
| 48 | +view = api('get', 'views/%s?includeInactive=True' % doc['objectName']) |
| 49 | + |
| 50 | +if filedate is not None: |
| 51 | + if ':' not in filedate: |
| 52 | + filedate = '%s 00:00:00' % filedate |
| 53 | + filedateusecs = dateToUsecs(filedate) |
| 54 | + versions = [v for v in doc['versions'] if filedateusecs <= v['snapshotTimestampUsecs']] |
| 55 | + if versions: |
| 56 | + version = versions[-1] |
| 57 | + else: |
| 58 | + print('No backups from the specified date') |
| 59 | + exit(1) |
| 60 | +else: |
| 61 | + version = doc['versions'][0] |
47 | 62 |
|
48 | 63 | taskName = "Clone-View_%s_as_%s" % (viewName, newName) |
49 | 64 |
|
50 | 65 | cloneTask = { |
51 | 66 | "name": taskName, |
52 | 67 | "objects": [ |
53 | 68 | { |
54 | | - "jobUid": viewResult['vmDocument']['objectId']['jobUid'], |
55 | | - "jobId": viewResult['vmDocument']['objectId']['jobId'], |
56 | | - "jobInstanceId": viewResult['vmDocument']['versions'][0]['instanceId']['jobInstanceId'], |
57 | | - "startTimeUsecs": viewResult['vmDocument']['versions'][0]['instanceId']['jobStartTimeUsecs'], |
58 | | - "entity": viewResult['vmDocument']['objectId']['entity'] |
| 69 | + "jobUid": doc['objectId']['jobUid'], |
| 70 | + "jobId": doc['objectId']['jobId'], |
| 71 | + "jobInstanceId": version['instanceId']['jobInstanceId'], |
| 72 | + "startTimeUsecs": version['instanceId']['jobStartTimeUsecs'], |
| 73 | + "entity": doc['objectId']['entity'] |
59 | 74 | } |
60 | 75 | ], |
61 | 76 | "viewName": newName, |
|
64 | 79 | "sourceViewName": view['name'], |
65 | 80 | "cloneViewName": newName, |
66 | 81 | "viewBoxId": view['viewBoxId'], |
67 | | - "viewId": viewResult['vmDocument']['objectId']['entity']['id'] |
| 82 | + "viewId": doc['objectId']['entity']['id'] |
68 | 83 | } |
69 | 84 | } |
70 | 85 |
|
|
75 | 90 | exit(1) |
76 | 91 |
|
77 | 92 | print("Cloning View %s as %s..." % (viewName, newName)) |
| 93 | +print("Backup date: %s" % usecsToDate(version['instanceId']['jobStartTimeUsecs'])) |
| 94 | + |
| 95 | +# wait for completion and report status |
78 | 96 | taskId = response['restoreTask']['performRestoreTaskState']['base']['taskId'] |
79 | 97 | status = api('get', '/restoretasks/%s' % taskId) |
80 | 98 |
|
|
0 commit comments