illumio-pylo 0.3.11__py3-none-any.whl → 0.3.13__py3-none-any.whl

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.
Files changed (30) hide show
  1. illumio_pylo/API/APIConnector.py +138 -106
  2. illumio_pylo/API/CredentialsManager.py +168 -3
  3. illumio_pylo/API/Explorer.py +619 -14
  4. illumio_pylo/API/JsonPayloadTypes.py +64 -4
  5. illumio_pylo/FilterQuery.py +892 -0
  6. illumio_pylo/Helpers/exports.py +1 -1
  7. illumio_pylo/LabelCommon.py +13 -3
  8. illumio_pylo/LabelDimension.py +109 -0
  9. illumio_pylo/LabelStore.py +97 -38
  10. illumio_pylo/WorkloadStore.py +58 -0
  11. illumio_pylo/__init__.py +9 -3
  12. illumio_pylo/cli/__init__.py +5 -2
  13. illumio_pylo/cli/commands/__init__.py +1 -0
  14. illumio_pylo/cli/commands/credential_manager.py +555 -4
  15. illumio_pylo/cli/commands/label_delete_unused.py +0 -3
  16. illumio_pylo/cli/commands/traffic_export.py +358 -0
  17. illumio_pylo/cli/commands/ui/credential_manager_ui/app.js +638 -0
  18. illumio_pylo/cli/commands/ui/credential_manager_ui/index.html +217 -0
  19. illumio_pylo/cli/commands/ui/credential_manager_ui/styles.css +581 -0
  20. illumio_pylo/cli/commands/update_pce_objects_cache.py +1 -2
  21. illumio_pylo/cli/commands/ven_duplicate_remover.py +79 -59
  22. illumio_pylo/cli/commands/workload_export.py +29 -0
  23. illumio_pylo/utilities/cli.py +4 -1
  24. illumio_pylo/utilities/health_monitoring.py +5 -1
  25. {illumio_pylo-0.3.11.dist-info → illumio_pylo-0.3.13.dist-info}/METADATA +2 -1
  26. {illumio_pylo-0.3.11.dist-info → illumio_pylo-0.3.13.dist-info}/RECORD +29 -24
  27. {illumio_pylo-0.3.11.dist-info → illumio_pylo-0.3.13.dist-info}/WHEEL +1 -1
  28. illumio_pylo/Query.py +0 -331
  29. {illumio_pylo-0.3.11.dist-info → illumio_pylo-0.3.13.dist-info}/licenses/LICENSE +0 -0
  30. {illumio_pylo-0.3.11.dist-info → illumio_pylo-0.3.13.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,581 @@
1
+ /* Base styles */
2
+ * {
3
+ box-sizing: border-box;
4
+ margin: 0;
5
+ padding: 0;
6
+ }
7
+
8
+ /* CSS Variables for theming */
9
+ :root {
10
+ /* Light mode colors */
11
+ --bg-primary: #f5f7fa;
12
+ --bg-secondary: #ffffff;
13
+ --bg-tertiary: #e2e8f0;
14
+ --text-primary: #333;
15
+ --text-secondary: #4a5568;
16
+ --text-tertiary: #718096;
17
+ --border-color: #e2e8f0;
18
+ --shadow-color: rgba(0, 0, 0, 0.1);
19
+ --shadow-hover: rgba(0, 0, 0, 0.15);
20
+ --input-bg: #ffffff;
21
+ --input-border: #cbd5e0;
22
+ --table-hover: #f7fafc;
23
+ --gradient-start: #667eea;
24
+ --gradient-end: #764ba2;
25
+ --warning-text: #7a4a12;
26
+ --warning-bg: #fff7e6;
27
+ --warning-border: #d69e2e;
28
+ }
29
+
30
+ /* Dark mode colors */
31
+ [data-theme="dark"] {
32
+ --bg-primary: #1a202c;
33
+ --bg-secondary: #2d3748;
34
+ --bg-tertiary: #4a5568;
35
+ --text-primary: #e2e8f0;
36
+ --text-secondary: #cbd5e0;
37
+ --text-tertiary: #a0aec0;
38
+ --border-color: #4a5568;
39
+ --shadow-color: rgba(0, 0, 0, 0.3);
40
+ --shadow-hover: rgba(0, 0, 0, 0.5);
41
+ --input-bg: #2d3748;
42
+ --input-border: #4a5568;
43
+ --table-hover: #374151;
44
+ --gradient-start: #667eea;
45
+ --gradient-end: #764ba2;
46
+ --warning-text: #fbbf24;
47
+ --warning-bg: #44403c;
48
+ --warning-border: #d69e2e;
49
+ }
50
+
51
+ body {
52
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
53
+ background-color: var(--bg-primary);
54
+ color: var(--text-primary);
55
+ line-height: 1.6;
56
+ transition: background-color 0.3s ease, color 0.3s ease;
57
+ }
58
+
59
+ .container {
60
+ max-width: 95%;
61
+ margin: 0 auto;
62
+ padding: 20px;
63
+ }
64
+
65
+ /* Header */
66
+ header {
67
+ text-align: center;
68
+ margin-bottom: 30px;
69
+ padding: 20px;
70
+ background: linear-gradient(135deg, var(--gradient-start) 0%, var(--gradient-end) 100%);
71
+ border-radius: 10px;
72
+ color: white;
73
+ position: relative;
74
+ }
75
+
76
+ header h1 {
77
+ font-size: 2rem;
78
+ margin-bottom: 5px;
79
+ }
80
+
81
+ header .subtitle {
82
+ opacity: 0.9;
83
+ font-size: 1rem;
84
+ }
85
+
86
+ /* Theme toggle button */
87
+ .theme-toggle {
88
+ position: absolute;
89
+ top: 20px;
90
+ right: 20px;
91
+ background: rgba(255, 255, 255, 0.2);
92
+ border: 1px solid rgba(255, 255, 255, 0.3);
93
+ color: white;
94
+ padding: 8px 12px;
95
+ border-radius: 5px;
96
+ cursor: pointer;
97
+ font-size: 1.2rem;
98
+ transition: all 0.2s ease;
99
+ }
100
+
101
+ .theme-toggle:hover {
102
+ background: rgba(255, 255, 255, 0.3);
103
+ transform: scale(1.05);
104
+ }
105
+
106
+ /* Buttons */
107
+ .btn {
108
+ padding: 10px 20px;
109
+ border: none;
110
+ border-radius: 5px;
111
+ cursor: pointer;
112
+ font-size: 0.95rem;
113
+ font-weight: 500;
114
+ transition: all 0.2s ease;
115
+ }
116
+
117
+ .btn-primary {
118
+ background-color: #667eea;
119
+ color: white;
120
+ }
121
+
122
+ .btn-primary:hover {
123
+ background-color: #5a6fd6;
124
+ }
125
+
126
+ .btn-secondary {
127
+ background-color: var(--bg-tertiary);
128
+ color: var(--text-secondary);
129
+ }
130
+
131
+ .btn-secondary:hover {
132
+ background-color: var(--border-color);
133
+ }
134
+
135
+ .btn-danger {
136
+ background-color: #e53e3e;
137
+ color: white;
138
+ }
139
+
140
+ .btn-danger:hover {
141
+ background-color: #c53030;
142
+ }
143
+
144
+ .btn-success {
145
+ background-color: #38a169;
146
+ color: white;
147
+ }
148
+
149
+ .btn-success:hover {
150
+ background-color: #2f855a;
151
+ }
152
+
153
+ .btn-warning {
154
+ background-color: #d69e2e;
155
+ color: white;
156
+ }
157
+
158
+ .btn-warning:hover {
159
+ background-color: #b7791f;
160
+ }
161
+
162
+ .btn-small {
163
+ padding: 5px 10px;
164
+ font-size: 0.85rem;
165
+ }
166
+
167
+ /* Section styles */
168
+ section {
169
+ background: var(--bg-secondary);
170
+ border-radius: 10px;
171
+ padding: 25px;
172
+ box-shadow: 0 2px 10px var(--shadow-color);
173
+ transition: background-color 0.3s ease;
174
+ }
175
+
176
+ .section-header {
177
+ display: flex;
178
+ justify-content: space-between;
179
+ align-items: center;
180
+ margin-bottom: 20px;
181
+ }
182
+
183
+ .section-header h2 {
184
+ font-size: 1.3rem;
185
+ color: var(--text-primary);
186
+ }
187
+
188
+ /* Table styles */
189
+ table {
190
+ width: 100%;
191
+ border-collapse: collapse;
192
+ }
193
+
194
+ th, td {
195
+ padding: 12px 15px;
196
+ text-align: left;
197
+ border-bottom: 1px solid var(--border-color);
198
+ }
199
+
200
+ th {
201
+ background-color: var(--bg-tertiary);
202
+ font-weight: 600;
203
+ color: var(--text-secondary);
204
+ font-size: 0.85rem;
205
+ text-transform: uppercase;
206
+ letter-spacing: 0.5px;
207
+ }
208
+
209
+ tr:hover {
210
+ background-color: var(--table-hover);
211
+ }
212
+
213
+ td {
214
+ font-size: 0.95rem;
215
+ color: var(--text-primary);
216
+ }
217
+
218
+ .actions-cell {
219
+ white-space: nowrap;
220
+ }
221
+
222
+ .actions-cell .btn {
223
+ margin-right: 5px;
224
+ }
225
+
226
+ .actions-cell .btn:last-child {
227
+ margin-right: 0;
228
+ }
229
+
230
+ /* Status indicators */
231
+ .status-yes {
232
+ color: #38a169;
233
+ font-weight: 500;
234
+ }
235
+
236
+ .status-no {
237
+ color: #e53e3e;
238
+ font-weight: 500;
239
+ }
240
+
241
+ /* Loading and empty states */
242
+ .loading, .empty-state {
243
+ text-align: center;
244
+ padding: 40px;
245
+ color: var(--text-tertiary);
246
+ }
247
+
248
+ .loading::before {
249
+ content: '⏳ ';
250
+ }
251
+
252
+ .empty-state {
253
+ background-color: var(--bg-tertiary);
254
+ border-radius: 8px;
255
+ }
256
+
257
+ /* Notifications */
258
+ .notification {
259
+ padding: 15px 20px;
260
+ border-radius: 8px;
261
+ margin-bottom: 20px;
262
+ font-weight: 500;
263
+ }
264
+
265
+ .notification.success {
266
+ background-color: #c6f6d5;
267
+ color: #276749;
268
+ border: 1px solid #9ae6b4;
269
+ }
270
+
271
+ .notification.error {
272
+ background-color: #fed7d7;
273
+ color: #c53030;
274
+ border: 1px solid #feb2b2;
275
+ }
276
+
277
+ .notification.info {
278
+ background-color: #bee3f8;
279
+ color: #2b6cb0;
280
+ border: 1px solid #90cdf4;
281
+ }
282
+
283
+ /* Modal */
284
+ .modal {
285
+ position: fixed;
286
+ top: 0;
287
+ left: 0;
288
+ width: 100%;
289
+ height: 100%;
290
+ background-color: rgba(0, 0, 0, 0.5);
291
+ display: flex;
292
+ justify-content: center;
293
+ align-items: center;
294
+ z-index: 1000;
295
+ }
296
+
297
+ .modal-content {
298
+ background: var(--bg-secondary);
299
+ border-radius: 12px;
300
+ width: 90%;
301
+ max-width: 550px;
302
+ max-height: 90vh;
303
+ overflow-y: auto;
304
+ box-shadow: 0 10px 40px var(--shadow-hover);
305
+ }
306
+
307
+ .modal-small {
308
+ max-width: 400px;
309
+ }
310
+
311
+ .modal-header {
312
+ display: flex;
313
+ justify-content: space-between;
314
+ align-items: center;
315
+ padding: 20px 25px;
316
+ border-bottom: 1px solid var(--border-color);
317
+ }
318
+
319
+ .modal-header h2 {
320
+ font-size: 1.2rem;
321
+ color: var(--text-primary);
322
+ }
323
+
324
+ .btn-close {
325
+ background: none;
326
+ border: none;
327
+ font-size: 1.5rem;
328
+ color: var(--text-tertiary);
329
+ cursor: pointer;
330
+ line-height: 1;
331
+ }
332
+
333
+ .btn-close:hover {
334
+ color: var(--text-secondary);
335
+ }
336
+
337
+ /* Form styles */
338
+ form {
339
+ padding: 25px;
340
+ }
341
+
342
+ .form-group {
343
+ margin-bottom: 20px;
344
+ }
345
+
346
+ .form-group label {
347
+ display: block;
348
+ margin-bottom: 6px;
349
+ font-weight: 500;
350
+ color: var(--text-secondary);
351
+ font-size: 0.95rem;
352
+ }
353
+
354
+ .form-group input[type="text"],
355
+ .form-group input[type="number"],
356
+ .form-group input[type="password"],
357
+ .form-group select {
358
+ width: 100%;
359
+ padding: 10px 12px;
360
+ border: 1px solid var(--input-border);
361
+ border-radius: 6px;
362
+ font-size: 1rem;
363
+ transition: border-color 0.2s;
364
+ background-color: var(--input-bg);
365
+ color: var(--text-primary);
366
+ }
367
+
368
+ .form-group input:focus,
369
+ .form-group select:focus {
370
+ outline: none;
371
+ border-color: #667eea;
372
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
373
+ }
374
+
375
+ .form-group small {
376
+ display: block;
377
+ margin-top: 5px;
378
+ color: var(--text-tertiary);
379
+ font-size: 0.85rem;
380
+ }
381
+
382
+ .form-row {
383
+ display: flex;
384
+ gap: 15px;
385
+ }
386
+
387
+ .form-row .form-group {
388
+ flex: 1;
389
+ }
390
+
391
+ .checkbox-group label {
392
+ display: flex;
393
+ align-items: center;
394
+ cursor: pointer;
395
+ }
396
+
397
+ .checkbox-group input[type="checkbox"] {
398
+ margin-right: 10px;
399
+ width: 18px;
400
+ height: 18px;
401
+ }
402
+
403
+ .form-section {
404
+ background-color: var(--bg-tertiary);
405
+ padding: 15px;
406
+ border-radius: 8px;
407
+ margin-bottom: 20px;
408
+ }
409
+
410
+ .form-section h3 {
411
+ font-size: 1rem;
412
+ color: var(--text-secondary);
413
+ margin-bottom: 15px;
414
+ }
415
+
416
+ .form-actions {
417
+ display: flex;
418
+ justify-content: flex-end;
419
+ gap: 10px;
420
+ padding-top: 15px;
421
+ border-top: 1px solid var(--border-color);
422
+ }
423
+
424
+ /* Test result */
425
+ .test-result {
426
+ padding: 25px;
427
+ text-align: center;
428
+ }
429
+
430
+ .test-result.success {
431
+ color: #276749;
432
+ }
433
+
434
+ .test-result.success::before {
435
+ content: '✅ ';
436
+ font-size: 2rem;
437
+ display: block;
438
+ margin-bottom: 10px;
439
+ }
440
+
441
+ .test-result.error {
442
+ color: #c53030;
443
+ }
444
+
445
+ .test-result.error::before {
446
+ content: '❌ ';
447
+ font-size: 2rem;
448
+ display: block;
449
+ margin-bottom: 10px;
450
+ }
451
+
452
+ .test-result.loading::before {
453
+ content: '🔄 ';
454
+ font-size: 2rem;
455
+ display: block;
456
+ margin-bottom: 10px;
457
+ animation: spin 1s linear infinite;
458
+ }
459
+
460
+ @keyframes spin {
461
+ from { transform: rotate(0deg); }
462
+ to { transform: rotate(360deg); }
463
+ }
464
+
465
+ /* Utility classes */
466
+ .hidden {
467
+ display: none !important;
468
+ }
469
+
470
+ /* Warning text used in modals/forms to indicate potential SSH agent prompts */
471
+ .warning-text {
472
+ color: var(--warning-text);
473
+ background-color: var(--warning-bg);
474
+ border-left: 4px solid var(--warning-border);
475
+ padding: 8px 12px;
476
+ border-radius: 6px;
477
+ margin-top: 12px;
478
+ font-size: 0.95rem;
479
+ }
480
+
481
+ /* Responsive */
482
+ @media (max-width: 768px) {
483
+ .form-row {
484
+ flex-direction: column;
485
+ gap: 0;
486
+ }
487
+
488
+ table {
489
+ font-size: 0.85rem;
490
+ }
491
+
492
+ th, td {
493
+ padding: 8px 10px;
494
+ }
495
+
496
+ .section-header {
497
+ flex-direction: column;
498
+ gap: 15px;
499
+ align-items: flex-start;
500
+ }
501
+ }
502
+
503
+ /* Delete confirmation modal */
504
+ .delete-confirmation {
505
+ padding: 25px;
506
+ text-align: center;
507
+ }
508
+
509
+ .delete-confirmation p {
510
+ margin-bottom: 10px;
511
+ font-size: 1rem;
512
+ color: var(--text-primary);
513
+ }
514
+
515
+ .delete-confirmation .warning-text {
516
+ color: #c53030;
517
+ font-size: 0.9rem;
518
+ font-style: italic;
519
+ }
520
+
521
+ /* Encrypt confirmation modal */
522
+ .encrypt-confirmation {
523
+ padding: 25px;
524
+ text-align: center;
525
+ }
526
+
527
+ .encrypt-confirmation p {
528
+ margin-bottom: 15px;
529
+ font-size: 1rem;
530
+ color: var(--text-primary);
531
+ }
532
+
533
+ .encrypt-confirmation .form-group {
534
+ text-align: left;
535
+ margin-top: 20px;
536
+ }
537
+
538
+ /* Shutdown button */
539
+ .shutdown-button-container {
540
+ position: fixed;
541
+ bottom: 20px;
542
+ right: 20px;
543
+ z-index: 100;
544
+ }
545
+
546
+ .btn-shutdown {
547
+ background-color: #c53030;
548
+ color: white;
549
+ padding: 12px 24px;
550
+ font-size: 1rem;
551
+ font-weight: 600;
552
+ border-radius: 8px;
553
+ box-shadow: 0 4px 12px rgba(197, 48, 48, 0.4);
554
+ transition: all 0.2s ease;
555
+ }
556
+
557
+ .btn-shutdown:hover {
558
+ background-color: #9b2c2c;
559
+ box-shadow: 0 6px 16px rgba(197, 48, 48, 0.5);
560
+ transform: translateY(-2px);
561
+ }
562
+
563
+ /* Shutdown confirmation modal */
564
+ .shutdown-confirmation {
565
+ padding: 25px;
566
+ text-align: center;
567
+ }
568
+
569
+ .shutdown-confirmation p {
570
+ margin-bottom: 10px;
571
+ font-size: 1rem;
572
+ color: var(--text-primary);
573
+ }
574
+
575
+ .shutdown-confirmation .countdown-text {
576
+ font-size: 1.2rem;
577
+ font-weight: 600;
578
+ color: #c53030;
579
+ margin-top: 15px;
580
+ }
581
+
@@ -14,8 +14,7 @@ objects_load_filter = None
14
14
 
15
15
 
16
16
  def fill_parser(parser: argparse.ArgumentParser):
17
- parser.add_argument('--include-deleted-workloads', action='store_true',
18
- help='should deleted workloads be downloaded as well')
17
+ pass # All options are now handled by the global CLI arguments
19
18
 
20
19
 
21
20
  def __main(args, org: pylo.Organization = None, connector: pylo.APIConnector = None, config_data=None, **kwargs):