ecreshore 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ecreshore-1.0.1/PKG-INFO +195 -0
- ecreshore-1.0.1/README.md +176 -0
- ecreshore-1.0.1/pyproject.toml +88 -0
- ecreshore-1.0.1/setup.cfg +4 -0
- ecreshore-1.0.1/src/ecreshore/__init__.py +5 -0
- ecreshore-1.0.1/src/ecreshore/async_docker_client.py +434 -0
- ecreshore-1.0.1/src/ecreshore/aws_utils.py +43 -0
- ecreshore-1.0.1/src/ecreshore/cache_config.py +168 -0
- ecreshore-1.0.1/src/ecreshore/cli/__init__.py +73 -0
- ecreshore-1.0.1/src/ecreshore/cli/cluster/__init__.py +20 -0
- ecreshore-1.0.1/src/ecreshore/cli/cluster/inspect.py +108 -0
- ecreshore-1.0.1/src/ecreshore/cli/cluster/scan.py +92 -0
- ecreshore-1.0.1/src/ecreshore/cli/cluster/scan_formatters.py +341 -0
- ecreshore-1.0.1/src/ecreshore/cli/cluster/scan_helpers.py +58 -0
- ecreshore-1.0.1/src/ecreshore/cli/core/__init__.py +27 -0
- ecreshore-1.0.1/src/ecreshore/cli/core/auth_test.py +69 -0
- ecreshore-1.0.1/src/ecreshore/cli/core/batch.py +412 -0
- ecreshore-1.0.1/src/ecreshore/cli/core/copy.py +373 -0
- ecreshore-1.0.1/src/ecreshore/cli/repository/__init__.py +7 -0
- ecreshore-1.0.1/src/ecreshore/cli/repository/list_images.py +276 -0
- ecreshore-1.0.1/src/ecreshore/cli/repository/list_repositories.py +100 -0
- ecreshore-1.0.1/src/ecreshore/cli/repository/purge.py +749 -0
- ecreshore-1.0.1/src/ecreshore/cli/tools/__init__.py +7 -0
- ecreshore-1.0.1/src/ecreshore/cli/tools/completion.py +193 -0
- ecreshore-1.0.1/src/ecreshore/cli/tools/generate_config.py +33 -0
- ecreshore-1.0.1/src/ecreshore/cli/tools/terminal_info.py +94 -0
- ecreshore-1.0.1/src/ecreshore/cli/utils/__init__.py +7 -0
- ecreshore-1.0.1/src/ecreshore/cli/utils/completion.py +143 -0
- ecreshore-1.0.1/src/ecreshore/cli/utils/logging_setup.py +80 -0
- ecreshore-1.0.1/src/ecreshore/cli/utils/ui_helpers.py +35 -0
- ecreshore-1.0.1/src/ecreshore/cli/utils/validation.py +32 -0
- ecreshore-1.0.1/src/ecreshore/ecr_auth.py +163 -0
- ecreshore-1.0.1/src/ecreshore/services/__init__.py +1 -0
- ecreshore-1.0.1/src/ecreshore/services/async_transfer_service.py +227 -0
- ecreshore-1.0.1/src/ecreshore/services/base_service.py +87 -0
- ecreshore-1.0.1/src/ecreshore/services/batch_config.py +650 -0
- ecreshore-1.0.1/src/ecreshore/services/batch_error_aggregator.py +304 -0
- ecreshore-1.0.1/src/ecreshore/services/batch_processor.py +666 -0
- ecreshore-1.0.1/src/ecreshore/services/batch_progress.py +1147 -0
- ecreshore-1.0.1/src/ecreshore/services/buildx_transfer_service.py +411 -0
- ecreshore-1.0.1/src/ecreshore/services/cache_backends.py +382 -0
- ecreshore-1.0.1/src/ecreshore/services/cache_manager.py +163 -0
- ecreshore-1.0.1/src/ecreshore/services/cache_service.py +453 -0
- ecreshore-1.0.1/src/ecreshore/services/digest_verification.py +663 -0
- ecreshore-1.0.1/src/ecreshore/services/ecr_repository.py +1105 -0
- ecreshore-1.0.1/src/ecreshore/services/error_handler.py +326 -0
- ecreshore-1.0.1/src/ecreshore/services/hybrid_transfer_service.py +294 -0
- ecreshore-1.0.1/src/ecreshore/services/image_parser.py +165 -0
- ecreshore-1.0.1/src/ecreshore/services/image_presence_checker.py +1084 -0
- ecreshore-1.0.1/src/ecreshore/services/k8s_config.py +258 -0
- ecreshore-1.0.1/src/ecreshore/services/k8s_models.py +150 -0
- ecreshore-1.0.1/src/ecreshore/services/k8s_scanner.py +333 -0
- ecreshore-1.0.1/src/ecreshore/services/output_modes.py +14 -0
- ecreshore-1.0.1/src/ecreshore/services/platform_models.py +177 -0
- ecreshore-1.0.1/src/ecreshore/services/progress_reporter.py +256 -0
- ecreshore-1.0.1/src/ecreshore/services/purge_service.py +559 -0
- ecreshore-1.0.1/src/ecreshore/services/resume_service.py +486 -0
- ecreshore-1.0.1/src/ecreshore/services/retry_service.py +292 -0
- ecreshore-1.0.1/src/ecreshore/services/single_transfer_progress.py +405 -0
- ecreshore-1.0.1/src/ecreshore/services/transfer_request_builder.py +325 -0
- ecreshore-1.0.1/src/ecreshore/services/transfer_service.py +151 -0
- ecreshore-1.0.1/src/ecreshore/terminal_detection.py +215 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/PKG-INFO +195 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/SOURCES.txt +109 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/dependency_links.txt +1 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/entry_points.txt +2 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/requires.txt +12 -0
- ecreshore-1.0.1/src/ecreshore.egg-info/top_level.txt +1 -0
- ecreshore-1.0.1/tests/test_async_transfer_service.py +217 -0
- ecreshore-1.0.1/tests/test_aws_utils.py +131 -0
- ecreshore-1.0.1/tests/test_batch_command_helpers.py +411 -0
- ecreshore-1.0.1/tests/test_batch_config.py +565 -0
- ecreshore-1.0.1/tests/test_batch_processor.py +382 -0
- ecreshore-1.0.1/tests/test_batch_progress_helpers.py +735 -0
- ecreshore-1.0.1/tests/test_batch_progress_simple.py +194 -0
- ecreshore-1.0.1/tests/test_buildx_digest_verification.py +169 -0
- ecreshore-1.0.1/tests/test_buildx_platform_limiting.py +220 -0
- ecreshore-1.0.1/tests/test_cache_service.py +570 -0
- ecreshore-1.0.1/tests/test_cached_decorator.py +329 -0
- ecreshore-1.0.1/tests/test_digest_verification.py +337 -0
- ecreshore-1.0.1/tests/test_ecr_auth.py +328 -0
- ecreshore-1.0.1/tests/test_ecr_cache_integration.py +365 -0
- ecreshore-1.0.1/tests/test_ecr_repository_helpers.py +336 -0
- ecreshore-1.0.1/tests/test_ecr_repository_statistics_helpers.py +306 -0
- ecreshore-1.0.1/tests/test_enhanced_copy_command.py +275 -0
- ecreshore-1.0.1/tests/test_error_handler.py +317 -0
- ecreshore-1.0.1/tests/test_field_parser.py +261 -0
- ecreshore-1.0.1/tests/test_finish_batch_refactoring.py +531 -0
- ecreshore-1.0.1/tests/test_hybrid_transfer_service.py +213 -0
- ecreshore-1.0.1/tests/test_image_parser.py +210 -0
- ecreshore-1.0.1/tests/test_image_presence_caching.py +370 -0
- ecreshore-1.0.1/tests/test_image_presence_checker.py +453 -0
- ecreshore-1.0.1/tests/test_k8s_config.py +296 -0
- ecreshore-1.0.1/tests/test_k8s_ecr_detection.py +172 -0
- ecreshore-1.0.1/tests/test_k8s_models.py +253 -0
- ecreshore-1.0.1/tests/test_list_images.py +448 -0
- ecreshore-1.0.1/tests/test_progress_reporter.py +369 -0
- ecreshore-1.0.1/tests/test_public_ecr_filtering.py +187 -0
- ecreshore-1.0.1/tests/test_purge_display_helpers.py +365 -0
- ecreshore-1.0.1/tests/test_purge_refactoring.py +418 -0
- ecreshore-1.0.1/tests/test_purge_service.py +707 -0
- ecreshore-1.0.1/tests/test_purge_service_helpers.py +403 -0
- ecreshore-1.0.1/tests/test_retry_service.py +398 -0
- ecreshore-1.0.1/tests/test_scan_formatters_helpers.py +404 -0
- ecreshore-1.0.1/tests/test_single_transfer_progress_helpers.py +296 -0
- ecreshore-1.0.1/tests/test_skip_decision_caching.py +393 -0
- ecreshore-1.0.1/tests/test_skip_if_present_e2e.py +366 -0
- ecreshore-1.0.1/tests/test_skip_if_present_fast.py +513 -0
- ecreshore-1.0.1/tests/test_skip_if_present_integration.py +263 -0
- ecreshore-1.0.1/tests/test_terminal_detection.py +609 -0
- ecreshore-1.0.1/tests/test_transfer_service.py +173 -0
ecreshore-1.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ecreshore
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: cli utility for copying container images to private ECR
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: aiodocker==0.24.0
|
|
8
|
+
Requires-Dist: boto3==1.40.25
|
|
9
|
+
Requires-Dist: click==8.2.1
|
|
10
|
+
Requires-Dist: docker==7.1.0
|
|
11
|
+
Requires-Dist: kubernetes==33.1.0
|
|
12
|
+
Requires-Dist: pytest-asyncio>=1.1.0
|
|
13
|
+
Requires-Dist: pytest-cov>=7.0.0
|
|
14
|
+
Requires-Dist: radon>=6.0.1
|
|
15
|
+
Requires-Dist: rich==14.1.0
|
|
16
|
+
Requires-Dist: structlog==25.4.0
|
|
17
|
+
Requires-Dist: tenacity==9.1.2
|
|
18
|
+
Requires-Dist: yaml-for-humans==1.1.1
|
|
19
|
+
|
|
20
|
+
# ECReshore - Container Image Migration Tool
|
|
21
|
+
|
|
22
|
+
ECReshore is a CLI tool for copying container images to AWS ECR registries with intelligent multi-architecture support and batch processing capabilities.
|
|
23
|
+
|
|
24
|
+
## Core Commands
|
|
25
|
+
|
|
26
|
+
### `copy` - Copy Single Images
|
|
27
|
+
|
|
28
|
+
Copy container images to ECR with automatic multi-architecture detection.
|
|
29
|
+
|
|
30
|
+
**Basic Usage:**
|
|
31
|
+
```bash
|
|
32
|
+
# Copy with automatic repository inference
|
|
33
|
+
ecreshore copy nginx:latest
|
|
34
|
+
|
|
35
|
+
# Copy with custom target repository
|
|
36
|
+
ecreshore copy nginx:latest my-nginx-repo
|
|
37
|
+
|
|
38
|
+
# Copy with specific platforms
|
|
39
|
+
ecreshore copy nginx:latest --platforms linux/amd64,linux/arm64
|
|
40
|
+
|
|
41
|
+
# Copy all architectures
|
|
42
|
+
ecreshore copy nginx:latest -A
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Key Features:**
|
|
46
|
+
- **Smart repository inference** - Automatically determines target repository name
|
|
47
|
+
- **Multi-architecture support** - Preserves all platforms when Docker Buildx available
|
|
48
|
+
- **Skip-if-present** - Automatically skips if target image already exists with matching content
|
|
49
|
+
- **Force override** - Use `--force` to transfer even if target exists
|
|
50
|
+
|
|
51
|
+
### `scan` - Kubernetes Cluster Scanning
|
|
52
|
+
|
|
53
|
+
Scan Kubernetes clusters to identify non-ECR container images.
|
|
54
|
+
|
|
55
|
+
**Basic Usage:**
|
|
56
|
+
```bash
|
|
57
|
+
# Scan current cluster and generate batch config
|
|
58
|
+
ecreshore scan --export batch-config.yaml
|
|
59
|
+
|
|
60
|
+
# Scan specific namespace
|
|
61
|
+
ecreshore scan -n production
|
|
62
|
+
|
|
63
|
+
# Scan all namespaces
|
|
64
|
+
ecreshore scan -A
|
|
65
|
+
|
|
66
|
+
# Generate report format
|
|
67
|
+
ecreshore scan --output report
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Key Features:**
|
|
71
|
+
- **Workload discovery** - Scans Deployments, DaemonSets, StatefulSets, Jobs, CronJobs, Pods
|
|
72
|
+
- **ECR filtering** - Only identifies non-ECR images that need migration
|
|
73
|
+
- **Batch config generation** - Creates ready-to-use configuration files
|
|
74
|
+
- **Namespace targeting** - Include/exclude specific namespaces
|
|
75
|
+
|
|
76
|
+
### `batch` - Batch Processing
|
|
77
|
+
|
|
78
|
+
Execute multiple image transfers from YAML configuration files.
|
|
79
|
+
|
|
80
|
+
**Basic Usage:**
|
|
81
|
+
```bash
|
|
82
|
+
# Execute batch transfers
|
|
83
|
+
ecreshore batch config.yaml
|
|
84
|
+
|
|
85
|
+
# Preview without executing
|
|
86
|
+
ecreshore batch config.yaml --dry-run
|
|
87
|
+
|
|
88
|
+
# Force rich UI display
|
|
89
|
+
ecreshore batch config.yaml --rich
|
|
90
|
+
|
|
91
|
+
# Output structured logs
|
|
92
|
+
ecreshore batch config.yaml --output log
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Configuration Format:**
|
|
96
|
+
```yaml
|
|
97
|
+
settings:
|
|
98
|
+
concurrent_transfers: 3 # Parallel transfers
|
|
99
|
+
retry_attempts: 3 # Retry attempts per transfer
|
|
100
|
+
verify_digests: true # Verify image integrity
|
|
101
|
+
region: us-east-2 # AWS region
|
|
102
|
+
|
|
103
|
+
transfers:
|
|
104
|
+
- source: nginx:latest
|
|
105
|
+
target: my-nginx
|
|
106
|
+
source_tag: latest
|
|
107
|
+
target_tag: latest
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Key Features:**
|
|
111
|
+
- **Concurrent processing** - Configurable parallel transfers (default: 3)
|
|
112
|
+
- **Progress tracking** - Rich UI with real-time transfer status
|
|
113
|
+
- **Error handling** - Automatic retries with configurable attempts
|
|
114
|
+
- **Skip detection** - Automatically skips existing images with matching content
|
|
115
|
+
|
|
116
|
+
### `purge` - Repository Cleanup
|
|
117
|
+
|
|
118
|
+
Remove images from ECR repositories with safety controls.
|
|
119
|
+
|
|
120
|
+
**Basic Usage:**
|
|
121
|
+
```bash
|
|
122
|
+
# Preview deletion for specific repository
|
|
123
|
+
ecreshore purge my-repo --dry-run
|
|
124
|
+
|
|
125
|
+
# Purge repository, keeping latest image
|
|
126
|
+
ecreshore purge my-repo --keep-latest
|
|
127
|
+
|
|
128
|
+
# Preview deletion for all repositories
|
|
129
|
+
ecreshore purge -A --dry-run
|
|
130
|
+
|
|
131
|
+
# Purge with pattern matching
|
|
132
|
+
ecreshore purge -A --filter my-app-* --keep-latest
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Key Features:**
|
|
136
|
+
- **Safety first** - Always use `--dry-run` to preview deletions
|
|
137
|
+
- **Selective deletion** - Target specific repositories or use patterns
|
|
138
|
+
- **Latest preservation** - `--keep-latest` protects most recent images
|
|
139
|
+
- **Bulk operations** - Process all repositories with filtering options
|
|
140
|
+
|
|
141
|
+
## Common Workflow
|
|
142
|
+
|
|
143
|
+
1. **Discovery**: Scan your cluster to identify images needing migration
|
|
144
|
+
```bash
|
|
145
|
+
ecreshore scan --export migration-plan.yaml
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
2. **Preview**: Review the generated configuration and preview the batch operation
|
|
149
|
+
```bash
|
|
150
|
+
ecreshore batch migration-plan.yaml --dry-run
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
3. **Execute**: Run the batch migration
|
|
154
|
+
```bash
|
|
155
|
+
ecreshore batch migration-plan.yaml
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
4. **Cleanup**: Optionally purge old/unused images
|
|
159
|
+
```bash
|
|
160
|
+
ecreshore purge old-repo --dry-run
|
|
161
|
+
ecreshore purge old-repo --keep-latest
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Global Options
|
|
165
|
+
|
|
166
|
+
- **`-v, --verbose`** - Increase verbosity (`-v` for INFO, `-vv` for DEBUG)
|
|
167
|
+
- **`--region`** - AWS region (respects `AWS_DEFAULT_REGION`, `AWS_REGION`, `~/.aws/config`)
|
|
168
|
+
- **`--registry-id`** - AWS account ID for ECR registry
|
|
169
|
+
- **`--simple/--rich`** - Force specific UI modes (auto-detected by default)
|
|
170
|
+
|
|
171
|
+
## UI Modes
|
|
172
|
+
|
|
173
|
+
ECReshore automatically detects your terminal capabilities and chooses the best display mode:
|
|
174
|
+
|
|
175
|
+
- **Rich UI** - Full-featured progress bars, colors, and real-time updates
|
|
176
|
+
- **Simple UI** - Text-based progress suitable for basic terminals
|
|
177
|
+
- **Log output** - Structured JSON logs for automation and monitoring
|
|
178
|
+
|
|
179
|
+
Use `ecreshore terminal-info` to see your terminal's detected capabilities.
|
|
180
|
+
|
|
181
|
+
## Authentication
|
|
182
|
+
|
|
183
|
+
ECReshore uses your existing AWS credentials. Ensure you have:
|
|
184
|
+
- AWS CLI configured (`aws configure`)
|
|
185
|
+
- Appropriate ECR permissions (`ecr:*` or specific ECR actions)
|
|
186
|
+
- Docker daemon running for image operations
|
|
187
|
+
|
|
188
|
+
Test authentication with:
|
|
189
|
+
```bash
|
|
190
|
+
ecreshore auth-test
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
For additional commands and advanced options, run `ecreshore --help` or `ecreshore COMMAND --help`.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# ECReshore - Container Image Migration Tool
|
|
2
|
+
|
|
3
|
+
ECReshore is a CLI tool for copying container images to AWS ECR registries with intelligent multi-architecture support and batch processing capabilities.
|
|
4
|
+
|
|
5
|
+
## Core Commands
|
|
6
|
+
|
|
7
|
+
### `copy` - Copy Single Images
|
|
8
|
+
|
|
9
|
+
Copy container images to ECR with automatic multi-architecture detection.
|
|
10
|
+
|
|
11
|
+
**Basic Usage:**
|
|
12
|
+
```bash
|
|
13
|
+
# Copy with automatic repository inference
|
|
14
|
+
ecreshore copy nginx:latest
|
|
15
|
+
|
|
16
|
+
# Copy with custom target repository
|
|
17
|
+
ecreshore copy nginx:latest my-nginx-repo
|
|
18
|
+
|
|
19
|
+
# Copy with specific platforms
|
|
20
|
+
ecreshore copy nginx:latest --platforms linux/amd64,linux/arm64
|
|
21
|
+
|
|
22
|
+
# Copy all architectures
|
|
23
|
+
ecreshore copy nginx:latest -A
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Key Features:**
|
|
27
|
+
- **Smart repository inference** - Automatically determines target repository name
|
|
28
|
+
- **Multi-architecture support** - Preserves all platforms when Docker Buildx available
|
|
29
|
+
- **Skip-if-present** - Automatically skips if target image already exists with matching content
|
|
30
|
+
- **Force override** - Use `--force` to transfer even if target exists
|
|
31
|
+
|
|
32
|
+
### `scan` - Kubernetes Cluster Scanning
|
|
33
|
+
|
|
34
|
+
Scan Kubernetes clusters to identify non-ECR container images.
|
|
35
|
+
|
|
36
|
+
**Basic Usage:**
|
|
37
|
+
```bash
|
|
38
|
+
# Scan current cluster and generate batch config
|
|
39
|
+
ecreshore scan --export batch-config.yaml
|
|
40
|
+
|
|
41
|
+
# Scan specific namespace
|
|
42
|
+
ecreshore scan -n production
|
|
43
|
+
|
|
44
|
+
# Scan all namespaces
|
|
45
|
+
ecreshore scan -A
|
|
46
|
+
|
|
47
|
+
# Generate report format
|
|
48
|
+
ecreshore scan --output report
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Key Features:**
|
|
52
|
+
- **Workload discovery** - Scans Deployments, DaemonSets, StatefulSets, Jobs, CronJobs, Pods
|
|
53
|
+
- **ECR filtering** - Only identifies non-ECR images that need migration
|
|
54
|
+
- **Batch config generation** - Creates ready-to-use configuration files
|
|
55
|
+
- **Namespace targeting** - Include/exclude specific namespaces
|
|
56
|
+
|
|
57
|
+
### `batch` - Batch Processing
|
|
58
|
+
|
|
59
|
+
Execute multiple image transfers from YAML configuration files.
|
|
60
|
+
|
|
61
|
+
**Basic Usage:**
|
|
62
|
+
```bash
|
|
63
|
+
# Execute batch transfers
|
|
64
|
+
ecreshore batch config.yaml
|
|
65
|
+
|
|
66
|
+
# Preview without executing
|
|
67
|
+
ecreshore batch config.yaml --dry-run
|
|
68
|
+
|
|
69
|
+
# Force rich UI display
|
|
70
|
+
ecreshore batch config.yaml --rich
|
|
71
|
+
|
|
72
|
+
# Output structured logs
|
|
73
|
+
ecreshore batch config.yaml --output log
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Configuration Format:**
|
|
77
|
+
```yaml
|
|
78
|
+
settings:
|
|
79
|
+
concurrent_transfers: 3 # Parallel transfers
|
|
80
|
+
retry_attempts: 3 # Retry attempts per transfer
|
|
81
|
+
verify_digests: true # Verify image integrity
|
|
82
|
+
region: us-east-2 # AWS region
|
|
83
|
+
|
|
84
|
+
transfers:
|
|
85
|
+
- source: nginx:latest
|
|
86
|
+
target: my-nginx
|
|
87
|
+
source_tag: latest
|
|
88
|
+
target_tag: latest
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Key Features:**
|
|
92
|
+
- **Concurrent processing** - Configurable parallel transfers (default: 3)
|
|
93
|
+
- **Progress tracking** - Rich UI with real-time transfer status
|
|
94
|
+
- **Error handling** - Automatic retries with configurable attempts
|
|
95
|
+
- **Skip detection** - Automatically skips existing images with matching content
|
|
96
|
+
|
|
97
|
+
### `purge` - Repository Cleanup
|
|
98
|
+
|
|
99
|
+
Remove images from ECR repositories with safety controls.
|
|
100
|
+
|
|
101
|
+
**Basic Usage:**
|
|
102
|
+
```bash
|
|
103
|
+
# Preview deletion for specific repository
|
|
104
|
+
ecreshore purge my-repo --dry-run
|
|
105
|
+
|
|
106
|
+
# Purge repository, keeping latest image
|
|
107
|
+
ecreshore purge my-repo --keep-latest
|
|
108
|
+
|
|
109
|
+
# Preview deletion for all repositories
|
|
110
|
+
ecreshore purge -A --dry-run
|
|
111
|
+
|
|
112
|
+
# Purge with pattern matching
|
|
113
|
+
ecreshore purge -A --filter my-app-* --keep-latest
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Key Features:**
|
|
117
|
+
- **Safety first** - Always use `--dry-run` to preview deletions
|
|
118
|
+
- **Selective deletion** - Target specific repositories or use patterns
|
|
119
|
+
- **Latest preservation** - `--keep-latest` protects most recent images
|
|
120
|
+
- **Bulk operations** - Process all repositories with filtering options
|
|
121
|
+
|
|
122
|
+
## Common Workflow
|
|
123
|
+
|
|
124
|
+
1. **Discovery**: Scan your cluster to identify images needing migration
|
|
125
|
+
```bash
|
|
126
|
+
ecreshore scan --export migration-plan.yaml
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
2. **Preview**: Review the generated configuration and preview the batch operation
|
|
130
|
+
```bash
|
|
131
|
+
ecreshore batch migration-plan.yaml --dry-run
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
3. **Execute**: Run the batch migration
|
|
135
|
+
```bash
|
|
136
|
+
ecreshore batch migration-plan.yaml
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
4. **Cleanup**: Optionally purge old/unused images
|
|
140
|
+
```bash
|
|
141
|
+
ecreshore purge old-repo --dry-run
|
|
142
|
+
ecreshore purge old-repo --keep-latest
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Global Options
|
|
146
|
+
|
|
147
|
+
- **`-v, --verbose`** - Increase verbosity (`-v` for INFO, `-vv` for DEBUG)
|
|
148
|
+
- **`--region`** - AWS region (respects `AWS_DEFAULT_REGION`, `AWS_REGION`, `~/.aws/config`)
|
|
149
|
+
- **`--registry-id`** - AWS account ID for ECR registry
|
|
150
|
+
- **`--simple/--rich`** - Force specific UI modes (auto-detected by default)
|
|
151
|
+
|
|
152
|
+
## UI Modes
|
|
153
|
+
|
|
154
|
+
ECReshore automatically detects your terminal capabilities and chooses the best display mode:
|
|
155
|
+
|
|
156
|
+
- **Rich UI** - Full-featured progress bars, colors, and real-time updates
|
|
157
|
+
- **Simple UI** - Text-based progress suitable for basic terminals
|
|
158
|
+
- **Log output** - Structured JSON logs for automation and monitoring
|
|
159
|
+
|
|
160
|
+
Use `ecreshore terminal-info` to see your terminal's detected capabilities.
|
|
161
|
+
|
|
162
|
+
## Authentication
|
|
163
|
+
|
|
164
|
+
ECReshore uses your existing AWS credentials. Ensure you have:
|
|
165
|
+
- AWS CLI configured (`aws configure`)
|
|
166
|
+
- Appropriate ECR permissions (`ecr:*` or specific ECR actions)
|
|
167
|
+
- Docker daemon running for image operations
|
|
168
|
+
|
|
169
|
+
Test authentication with:
|
|
170
|
+
```bash
|
|
171
|
+
ecreshore auth-test
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
For additional commands and advanced options, run `ecreshore --help` or `ecreshore COMMAND --help`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "ecreshore"
|
|
3
|
+
version = "1.0.1"
|
|
4
|
+
description = "cli utility for copying container images to private ECR"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"aiodocker==0.24.0",
|
|
9
|
+
"boto3==1.40.25",
|
|
10
|
+
"click==8.2.1",
|
|
11
|
+
"docker==7.1.0",
|
|
12
|
+
"kubernetes==33.1.0",
|
|
13
|
+
"pytest-asyncio>=1.1.0",
|
|
14
|
+
"pytest-cov>=7.0.0",
|
|
15
|
+
"radon>=6.0.1",
|
|
16
|
+
"rich==14.1.0",
|
|
17
|
+
"structlog==25.4.0",
|
|
18
|
+
"tenacity==9.1.2",
|
|
19
|
+
"yaml-for-humans==1.1.1",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[project.scripts]
|
|
23
|
+
ecreshore = "ecreshore.cli:cli"
|
|
24
|
+
|
|
25
|
+
[dependency-groups]
|
|
26
|
+
dev = [
|
|
27
|
+
"pytest==8.4.2",
|
|
28
|
+
"mypy==1.17.1",
|
|
29
|
+
"vulture>=2.14",
|
|
30
|
+
"unimport>=1.2.1",
|
|
31
|
+
"types-pyyaml>=6.0.12.20250915",
|
|
32
|
+
"types-psutil>=7.0.0.20250822",
|
|
33
|
+
"boto3-stubs>=1.40.32",
|
|
34
|
+
"lxml>=6.0.2",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[tool.uv]
|
|
38
|
+
package = true
|
|
39
|
+
|
|
40
|
+
[tool.mypy]
|
|
41
|
+
python_version = "3.10"
|
|
42
|
+
warn_return_any = false
|
|
43
|
+
warn_unused_configs = true
|
|
44
|
+
disallow_untyped_defs = false
|
|
45
|
+
disallow_incomplete_defs = false
|
|
46
|
+
check_untyped_defs = true
|
|
47
|
+
disallow_untyped_decorators = false
|
|
48
|
+
no_implicit_optional = true
|
|
49
|
+
warn_redundant_casts = true
|
|
50
|
+
warn_unused_ignores = true
|
|
51
|
+
warn_no_return = true
|
|
52
|
+
warn_unreachable = false
|
|
53
|
+
strict_equality = true
|
|
54
|
+
show_error_codes = true
|
|
55
|
+
implicit_reexport = true
|
|
56
|
+
|
|
57
|
+
# Allow untyped calls for third-party libraries without stubs
|
|
58
|
+
[[tool.mypy.overrides]]
|
|
59
|
+
module = [
|
|
60
|
+
"aiodocker.*",
|
|
61
|
+
"docker.*",
|
|
62
|
+
"kubernetes.*",
|
|
63
|
+
"tenacity.*",
|
|
64
|
+
"psutil.*",
|
|
65
|
+
"yaml.*",
|
|
66
|
+
"botocore.*",
|
|
67
|
+
]
|
|
68
|
+
ignore_missing_imports = true
|
|
69
|
+
follow_imports = "skip"
|
|
70
|
+
disable_error_code = ["attr-defined", "no-any-return", "union-attr", "unreachable"]
|
|
71
|
+
|
|
72
|
+
# Targeted suppression for files with heavy third-party integration
|
|
73
|
+
[[tool.mypy.overrides]]
|
|
74
|
+
module = [
|
|
75
|
+
"ecreshore.async_docker_client",
|
|
76
|
+
"ecreshore.services.k8s_config",
|
|
77
|
+
"ecreshore.services.k8s_scanner",
|
|
78
|
+
"ecreshore.services.retry_service",
|
|
79
|
+
]
|
|
80
|
+
disable_error_code = ["unreachable", "no-any-return", "attr-defined", "assignment", "return-value", "union-attr"]
|
|
81
|
+
|
|
82
|
+
[tool.pytest.ini_options]
|
|
83
|
+
markers = [
|
|
84
|
+
"slow: marks tests as slow (deselected by default)",
|
|
85
|
+
"ux: marks tests that involve Rich UI components (may have threading warnings)",
|
|
86
|
+
"integration: marks tests that involve remote APIs"
|
|
87
|
+
]
|
|
88
|
+
addopts = "-m 'not slow and not ux'"
|