Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

""" CLI for checking status of tasks and exports 

""" 

from collections import defaultdict 

import json 

import logging 

from pathlib import Path 

 

import click 

 

from . import options 

 

 

@click.group('status', short_help='Check status of tasks and exports') 

@click.pass_context 

def group_status(ctx): 

""" Programs for checking, printing, modifying, and cancelling orders 

""" 

pass 

 

 

@group_status.command('list', short_help='List tracked metadata') 

@click.pass_context 

def list(ctx): 

""" List tracked orders 

""" 

logger = ctx.obj['logger'] 

 

config = options.fetch_config(ctx) 

tracker = config.get_tracker() 

 

# Find tracker metadata 

try: 

tracked_infos = tracker.list() 

except FileNotFoundError as e: 

click.echo('No tracked orders (could not find tracking prefix)') 

else: 

# Display 

if tracked_infos: 

if logger.level <= logging.WARNING: 

click.echo('Tracked orders:') 

for tracked_info in tracked_infos: 

click.echo(tracked_info) 

else: 

click.echo('No tracked orders') 

 

 

@group_status.command('cancel', 

short_help='Cancel Earth Engine tasks for this order') 

@options.arg_tracking_name 

@click.pass_context 

def cancel(ctx, tracking_name): 

from ..utils import get_ee_tasks, load_ee 

ee_api = load_ee(True) 

 

logger = ctx.obj['logger'] 

config = options.fetch_config(ctx) 

tracker = config.get_tracker() 

 

# Read tracking info 

info = tracker.read(tracking_name) 

 

# Cancel tasks 

for task in info.tasks: 

if task is not None: 

task.cancel() 

click.echo(f'Cancelled task ID "{task.id}"') 

else: 

click.echo('Skipping task that may be unsubmitted ' 

'or already expired') 

 

# Delete tracking 

tracker.clean(info, tracking_name=tracking_name) 

 

if logger.level <= logging.WARNING: 

click.echo('Complete') 

 

 

@group_status.command('print', short_help='Print job tracking info') 

@options.arg_tracking_name 

@click.option('--order', 'order_id', type=int, multiple=True, 

help='Display verbose info about a specific order') 

@click.option('--all', 'all_orders', is_flag=True, 

help='Display verbose info about all orders') 

@click.pass_context 

def print(ctx, tracking_name, order_id, all_orders): 

""" Print job submission tracking info 

""" 

from cedar.metadata import repr_tracking 

 

logger = ctx.obj['logger'] 

config = options.fetch_config(ctx) 

tracker = config.get_tracker() 

 

info = tracker.read(tracking_name) 

 

if all_orders: 

show_orders = True 

elif order_id: 

show_orders = order_id 

else: 

show_orders = None 

 

click.echo(repr_tracking(info, show_orders=show_orders)) 

 

 

@group_status.command('completed', short_help='Check if order has completed') 

@click.argument('tracking_name', type=str) 

@options.opt_update_order 

@click.pass_context 

def completed(ctx, tracking_name, update_): 

""" Print percent of order completed & exit 1 if not complete 

""" 

from cedar.utils import load_ee 

ee = load_ee(True) 

 

logger = ctx.obj['logger'] 

config = options.fetch_config(ctx) 

tracker = config.get_tracker() 

 

if update_: 

info = tracker.update(tracking_name) 

else: 

info = tracker.read(tracking_name) 

 

percent = info.progress 

 

if logger.level <= logging.WARNING: 

click.echo(f'Percent complete: {percent * 100. :03.2f}') 

 

if percent == 1.0: 

ctx.exit(0) 

else: 

ctx.exit(1) 

 

 

@group_status.command('update', short_help='Update tracking info') 

@click.argument('tracking_name', required=False, type=str) 

@click.option('--all', 'all_', is_flag=True, help='Update all tracked orders') 

@click.option('--dest', type=click.Path(file_okay=False, resolve_path=True), 

help='Save a local copy of tracking information to this folder') 

@click.pass_context 

def update(ctx, tracking_name, all_, dest): 

""" Update job submission tracking info 

""" 

if all_ and tracking_name: 

raise click.BadParameter('Cannot specify tracking names AND `--all`', 

param_hint='--all') 

 

from cedar.utils import load_ee 

ee = load_ee(True) 

 

logger = ctx.obj['logger'] 

config = options.fetch_config(ctx) 

tracker = config.get_tracker() 

 

if all_: 

tracking_name = tracker.list() 

else: 

tracking_name = [tracking_name] 

 

dest = Path(dest) if dest else None 

 

for name in tracking_name: 

if logger.level <= logging.WARNING: 

click.echo(f'Updating "{name}"') 

 

info = tracker.update(name) 

 

if dest: 

dest.mkdir(exist_ok=True, parents=True) 

dest_ = dest.joinpath(name) 

with open(str(dest_), 'w') as dst: 

json.dump(info, dst, indent=2) 

 

if logger.level <= logging.WARNING: 

click.echo('Complete')