19
19
import com .devshawn .kafka .gitops .service .ConfluentCloudService ;
20
20
import com .devshawn .kafka .gitops .service .KafkaService ;
21
21
import com .devshawn .kafka .gitops .service .ParserService ;
22
+ import com .devshawn .kafka .gitops .service .RoleService ;
22
23
import com .devshawn .kafka .gitops .util .LogUtil ;
23
24
import com .fasterxml .jackson .core .JsonParser ;
24
25
import com .fasterxml .jackson .databind .DeserializationFeature ;
@@ -38,6 +39,7 @@ public class StateManager {
38
39
private final ObjectMapper objectMapper ;
39
40
private final ParserService parserService ;
40
41
private final KafkaService kafkaService ;
42
+ private final RoleService roleService ;
41
43
private final ConfluentCloudService confluentCloudService ;
42
44
43
45
private PlanManager planManager ;
@@ -49,6 +51,7 @@ public StateManager(ManagerConfig managerConfig, ParserService parserService) {
49
51
this .objectMapper = initializeObjectMapper ();
50
52
this .kafkaService = new KafkaService (KafkaGitopsConfigLoader .load ());
51
53
this .parserService = parserService ;
54
+ this .roleService = new RoleService ();
52
55
this .confluentCloudService = new ConfluentCloudService (objectMapper );
53
56
this .planManager = new PlanManager (managerConfig , kafkaService , objectMapper );
54
57
this .applyManager = new ApplyManager (managerConfig , kafkaService );
@@ -93,11 +96,12 @@ public void createServiceAccounts() {
93
96
AtomicInteger count = new AtomicInteger ();
94
97
if (isConfluentCloudEnabled (desiredStateFile )) {
95
98
desiredStateFile .getServices ().forEach ((name , service ) -> {
96
- if (serviceAccounts .stream ().noneMatch (it -> it .getName ().equals (name ))) {
97
- confluentCloudService .createServiceAccount (name );
98
- LogUtil .printSimpleSuccess (String .format ("Successfully created service account: %s" , name ));
99
- count .getAndIncrement ();
100
- }
99
+ createServiceAccount (name , serviceAccounts , count );
100
+ });
101
+
102
+ desiredStateFile .getUsers ().forEach ((name , user ) -> {
103
+ String serviceAccountName = String .format ("user-%s" , name );
104
+ createServiceAccount (serviceAccountName , serviceAccounts , count );
101
105
});
102
106
} else {
103
107
throw new ConfluentCloudException ("Confluent Cloud must be enabled in the state file to use this command." );
@@ -108,6 +112,14 @@ public void createServiceAccounts() {
108
112
}
109
113
}
110
114
115
+ private void createServiceAccount (String name , List <ServiceAccount > serviceAccounts , AtomicInteger count ) {
116
+ if (serviceAccounts .stream ().noneMatch (it -> it .getName ().equals (name ))) {
117
+ confluentCloudService .createServiceAccount (name );
118
+ LogUtil .printSimpleSuccess (String .format ("Successfully created service account: %s" , name ));
119
+ count .getAndIncrement ();
120
+ }
121
+ }
122
+
111
123
private DesiredState getDesiredState () {
112
124
DesiredStateFile desiredStateFile = parserService .parseStateFile ();
113
125
DesiredState .Builder desiredState = new DesiredState .Builder ()
@@ -116,6 +128,7 @@ private DesiredState getDesiredState() {
116
128
117
129
if (isConfluentCloudEnabled (desiredStateFile )) {
118
130
generateConfluentCloudServiceAcls (desiredState , desiredStateFile );
131
+ generateConfluentCloudUserAcls (desiredState , desiredStateFile );
119
132
} else {
120
133
generateServiceAcls (desiredState , desiredStateFile );
121
134
}
@@ -147,6 +160,22 @@ private void generateConfluentCloudServiceAcls(DesiredState.Builder desiredState
147
160
});
148
161
}
149
162
163
+ private void generateConfluentCloudUserAcls (DesiredState .Builder desiredState , DesiredStateFile desiredStateFile ) {
164
+ List <ServiceAccount > serviceAccounts = confluentCloudService .getServiceAccounts ();
165
+ desiredStateFile .getUsers ().forEach ((name , user ) -> {
166
+ AtomicReference <Integer > index = new AtomicReference <>(0 );
167
+ String serviceAccountName = String .format ("user-%s" , name );
168
+
169
+ Optional <ServiceAccount > serviceAccount = serviceAccounts .stream ().filter (it -> it .getName ().equals (serviceAccountName )).findFirst ();
170
+ String serviceAccountId = serviceAccount .orElseThrow (() -> new ServiceAccountNotFoundException (serviceAccountName )).getId ();
171
+
172
+ user .getRoles ().forEach (role -> {
173
+ List <AclDetails .Builder > acls = roleService .getAcls (role , String .format ("User:%s" , serviceAccountId ));
174
+ acls .forEach (acl -> desiredState .putAcls (String .format ("%s-%s" , name , index .getAndSet (index .get () + 1 )), acl .build ()));
175
+ });
176
+ });
177
+ }
178
+
150
179
private void generateServiceAcls (DesiredState .Builder desiredState , DesiredStateFile desiredStateFile ) {
151
180
desiredStateFile .getServices ().forEach ((name , service ) -> {
152
181
AtomicReference <Integer > index = new AtomicReference <>(0 );
0 commit comments