|
1 | 1 | package plan |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "sync" |
| 5 | + |
4 | 6 | log "github.com/sirupsen/logrus" |
5 | 7 |
|
6 | 8 | "github.com/mxcd/gitops-cli/internal/k8s" |
7 | 9 | "github.com/mxcd/gitops-cli/internal/secret" |
| 10 | + "github.com/mxcd/gitops-cli/internal/util" |
8 | 11 | ) |
9 | 12 |
|
10 | 13 | type Plan struct { |
@@ -64,33 +67,83 @@ func (p *Plan) Execute() error { |
64 | 67 | } |
65 | 68 |
|
66 | 69 | func executeKubernetesPlan(p *Plan) error { |
| 70 | + parallelism := util.GetCliContext().Int("parallelism") |
| 71 | + if parallelism < 1 { |
| 72 | + parallelism = 1 |
| 73 | + } |
| 74 | + |
| 75 | + // Filter items that need processing |
| 76 | + itemsToProcess := []PlanItem{} |
67 | 77 | for _, item := range p.Items { |
68 | | - if item.Diff.Equal { |
| 78 | + if !item.Diff.Equal { |
| 79 | + itemsToProcess = append(itemsToProcess, item) |
| 80 | + } else { |
69 | 81 | log.Trace("Secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " is equal, skipping...") |
70 | | - continue |
71 | 82 | } |
72 | | - if item.Diff.Type == secret.SecretDiffTypeAdded { |
73 | | - log.Trace("Secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " is new, creating...") |
74 | | - err := k8s.CreateSecret(item.LocalSecret, item.LocalSecret.Target) |
75 | | - if err != nil { |
76 | | - log.Error("Failed to create secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " in cluster") |
77 | | - return err |
78 | | - } |
79 | | - } else if item.Diff.Type == secret.SecretDiffTypeChanged { |
80 | | - log.Trace("Secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " is modified, updating...") |
81 | | - err := k8s.UpdateSecret(item.LocalSecret, item.LocalSecret.Target) |
82 | | - if err != nil { |
83 | | - log.Error("Failed to update secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " in cluster") |
84 | | - return err |
85 | | - } |
86 | | - } else if item.Diff.Type == secret.SecretDiffTypeRemoved { |
87 | | - log.Trace("Secret ", item.RemoteSecret.Namespace, "/", item.RemoteSecret.Name, " is deleted, deleting...") |
88 | | - err := k8s.DeleteSecret(item.RemoteSecret, item.RemoteSecret.Target) |
89 | | - if err != nil { |
90 | | - log.Error("Failed to delete secret ", item.RemoteSecret.Namespace, "/", item.RemoteSecret.Name, " in cluster") |
91 | | - return err |
| 83 | + } |
| 84 | + |
| 85 | + if len(itemsToProcess) == 0 { |
| 86 | + return nil |
| 87 | + } |
| 88 | + |
| 89 | + // Create channels for parallel processing |
| 90 | + itemChan := make(chan PlanItem, len(itemsToProcess)) |
| 91 | + errorChan := make(chan error, len(itemsToProcess)) |
| 92 | + |
| 93 | + // Start worker goroutines |
| 94 | + var workerGroup sync.WaitGroup |
| 95 | + for i := 0; i < parallelism; i++ { |
| 96 | + workerGroup.Add(1) |
| 97 | + go func() { |
| 98 | + defer workerGroup.Done() |
| 99 | + for item := range itemChan { |
| 100 | + var err error |
| 101 | + if item.Diff.Type == secret.SecretDiffTypeAdded { |
| 102 | + log.Trace("Secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " is new, creating...") |
| 103 | + err = k8s.CreateSecret(item.LocalSecret, item.LocalSecret.Target) |
| 104 | + if err != nil { |
| 105 | + log.Error("Failed to create secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " in cluster") |
| 106 | + } |
| 107 | + } else if item.Diff.Type == secret.SecretDiffTypeChanged { |
| 108 | + log.Trace("Secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " is modified, updating...") |
| 109 | + err = k8s.UpdateSecret(item.LocalSecret, item.LocalSecret.Target) |
| 110 | + if err != nil { |
| 111 | + log.Error("Failed to update secret ", item.LocalSecret.Namespace, "/", item.LocalSecret.Name, " in cluster") |
| 112 | + } |
| 113 | + } else if item.Diff.Type == secret.SecretDiffTypeRemoved { |
| 114 | + log.Trace("Secret ", item.RemoteSecret.Namespace, "/", item.RemoteSecret.Name, " is deleted, deleting...") |
| 115 | + err = k8s.DeleteSecret(item.RemoteSecret, item.RemoteSecret.Target) |
| 116 | + if err != nil { |
| 117 | + log.Error("Failed to delete secret ", item.RemoteSecret.Namespace, "/", item.RemoteSecret.Name, " in cluster") |
| 118 | + } |
| 119 | + } |
| 120 | + if err != nil { |
| 121 | + errorChan <- err |
| 122 | + } |
92 | 123 | } |
| 124 | + }() |
| 125 | + } |
| 126 | + |
| 127 | + // Send work to workers |
| 128 | + go func() { |
| 129 | + for _, item := range itemsToProcess { |
| 130 | + itemChan <- item |
| 131 | + } |
| 132 | + close(itemChan) |
| 133 | + }() |
| 134 | + |
| 135 | + // Wait for all workers to finish |
| 136 | + go func() { |
| 137 | + workerGroup.Wait() |
| 138 | + close(errorChan) |
| 139 | + }() |
| 140 | + |
| 141 | + // Check for errors |
| 142 | + for err := range errorChan { |
| 143 | + if err != nil { |
| 144 | + return err |
93 | 145 | } |
94 | 146 | } |
| 147 | + |
95 | 148 | return nil |
96 | 149 | } |
0 commit comments