2
2
3
3
import com .github .containersolutions .operator .api .Controller ;
4
4
import com .github .containersolutions .operator .api .ResourceController ;
5
+ import io .fabric8 .kubernetes .api .model .Secret ;
6
+ import io .fabric8 .kubernetes .api .model .SecretBuilder ;
7
+ import io .fabric8 .kubernetes .client .KubernetesClient ;
8
+ import org .apache .commons .lang .RandomStringUtils ;
5
9
import org .slf4j .Logger ;
6
10
import org .slf4j .LoggerFactory ;
7
11
8
12
import java .sql .Connection ;
9
13
import java .sql .DriverManager ;
10
14
import java .sql .ResultSet ;
11
15
import java .sql .SQLException ;
16
+ import java .util .Base64 ;
12
17
import java .util .Optional ;
13
18
14
19
import static java .lang .String .format ;
17
22
crdName = "schemas.mysql.sample.javaoperatorsdk" ,
18
23
customResourceClass = Schema .class )
19
24
public class SchemaController implements ResourceController <Schema > {
20
-
25
+ static final String USERNAME_FORMAT = "%s-user" ;
26
+ static final String SECRET_FORMAT = "%s-secret" ;
21
27
22
28
private final Logger log = LoggerFactory .getLogger (getClass ());
23
29
30
+ private final KubernetesClient kubernetesClient ;
31
+
32
+ public SchemaController (KubernetesClient kubernetesClient ) { this .kubernetesClient = kubernetesClient ; }
33
+
24
34
@ Override
25
35
public Optional <Schema > createOrUpdateResource (Schema schema ) {
26
36
try (Connection connection = getConnection ()) {
@@ -29,14 +39,36 @@ public Optional<Schema> createOrUpdateResource(Schema schema) {
29
39
schema .getMetadata ().getName (),
30
40
schema .getSpec ().getEncoding ()));
31
41
42
+ String password = RandomStringUtils .randomAlphanumeric (16 );
43
+ String userName = String .format (USERNAME_FORMAT ,
44
+ schema .getMetadata ().getName ());
45
+ String secretName = String .format (SECRET_FORMAT ,
46
+ schema .getMetadata ().getName ());
47
+ connection .createStatement ().execute (format (
48
+ "CREATE USER '%1$s' IDENTIFIED BY '%2$s'" ,
49
+ userName , password ));
50
+ connection .createStatement ().execute (format (
51
+ "GRANT ALL ON `%1$s`.* TO '%2$s'" ,
52
+ schema .getMetadata ().getName (), userName ));
53
+ Secret credentialsSecret = new SecretBuilder ()
54
+ .withNewMetadata ().withName (secretName ).endMetadata ()
55
+ .addToData ("MYSQL_USERNAME" , Base64 .getEncoder ().encodeToString (userName .getBytes ()))
56
+ .addToData ("MYSQL_PASSWORD" , Base64 .getEncoder ().encodeToString (password .getBytes ()))
57
+ .build ();
58
+ this .kubernetesClient .secrets ()
59
+ .inNamespace (schema .getMetadata ().getNamespace ())
60
+ .create (credentialsSecret );
61
+
32
62
SchemaStatus status = new SchemaStatus ();
33
63
status .setUrl (format ("jdbc:mysql://%1$s/%2$s" ,
34
64
System .getenv ("MYSQL_HOST" ),
35
65
schema .getMetadata ().getName ()));
66
+ status .setUserName (userName );
67
+ status .setSecretName (secretName );
36
68
status .setStatus ("CREATED" );
37
69
schema .setStatus (status );
38
-
39
70
log .info ("Schema {} created" , schema .getMetadata ().getName ());
71
+
40
72
return Optional .of (schema );
41
73
}
42
74
return Optional .empty ();
@@ -45,6 +77,8 @@ public Optional<Schema> createOrUpdateResource(Schema schema) {
45
77
46
78
SchemaStatus status = new SchemaStatus ();
47
79
status .setUrl (null );
80
+ status .setUserName (null );
81
+ status .setSecretName (null );
48
82
status .setStatus ("ERROR" );
49
83
schema .setStatus (status );
50
84
@@ -60,6 +94,16 @@ public boolean deleteResource(Schema schema) {
60
94
if (schemaExists (connection , schema .getMetadata ().getName ())) {
61
95
connection .createStatement ().execute ("DROP DATABASE `" + schema .getMetadata ().getName () + "`" );
62
96
log .info ("Deleted Schema '{}'" , schema .getMetadata ().getName ());
97
+
98
+ if (userExists (connection , schema .getStatus ().getUserName ())) {
99
+ connection .createStatement ().execute ("DROP USER '" + schema .getStatus ().getUserName () + "'" );
100
+ log .info ("Deleted User '{}'" , schema .getStatus ().getUserName ());
101
+ }
102
+
103
+ this .kubernetesClient .secrets ()
104
+ .inNamespace (schema .getMetadata ().getNamespace ())
105
+ .withName (schema .getStatus ().getSecretName ())
106
+ .delete ();
63
107
} else {
64
108
log .info ("Delete event ignored for schema '{}', real schema doesn't exist" ,
65
109
schema .getMetadata ().getName ());
@@ -86,4 +130,10 @@ private boolean schemaExists(Connection connection, String schemaName) throws SQ
86
130
return resultSet .first ();
87
131
}
88
132
133
+ private boolean userExists (Connection connection , String userName ) throws SQLException {
134
+ ResultSet resultSet = connection .createStatement ().executeQuery (
135
+ format ("SELECT User FROM mysql.user WHERE User='%1$s'" , userName )
136
+ );
137
+ return resultSet .first ();
138
+ }
89
139
}
0 commit comments