f308e22639af91b59dcb2a3f06ea06d50e7ada6d
[aaf/authz.git] / auth / auth-batch / src / main / java / org / onap / aaf / auth / update / Upload.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  */
20
21 package org.onap.aaf.auth.update;
22
23 import java.io.BufferedReader;
24 import java.io.File;
25 import java.io.FileReader;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import org.onap.aaf.auth.Batch;
31 import org.onap.aaf.auth.env.AuthzTrans;
32 import org.onap.aaf.auth.org.OrganizationException;
33 import org.onap.aaf.misc.env.APIException;
34 import org.onap.aaf.misc.env.Env;
35 import org.onap.aaf.misc.env.TimeTaken;
36
37 import com.datastax.driver.core.ResultSet;
38
39 public class Upload extends Batch {
40         public Upload(AuthzTrans trans) throws APIException, IOException, OrganizationException {
41                 super(trans.env());
42             trans.info().log("Starting Connection Process");
43             
44             TimeTaken tt0 = trans.start("Cassandra Initialization", Env.SUB);
45             try {
46                         TimeTaken tt = trans.start("Connect to Cluster", Env.REMOTE);
47                         try {
48                                 session = cluster.connect();
49                         } finally {
50                                 tt.done();
51                         }
52
53             } finally {
54                 tt0.done();
55             }
56         }
57
58         private static final int BATCH_LENGTH = 100;
59
60         int count,batchCnt;
61
62         @Override
63         protected void run(AuthzTrans trans) {
64                 String line;
65                 StringBuilder sb = new StringBuilder();
66                 StringBuilder query = new StringBuilder();
67                 List<String> array = new ArrayList<String>();
68                 for(String feed : args()) {
69                         File file = new File(feed + ".dat");
70                         TimeTaken tt = trans.start(file.getAbsolutePath(), Env.SUB);
71                         System.out.println("#### Running " + feed + ".dat Feed ####");
72                     try {
73
74                                 if(file.exists()) {
75                                         count=batchCnt=0;
76                                         try {
77                                                 BufferedReader br = new BufferedReader(new FileReader(file));
78                                                 try {
79                                                         while((line=br.readLine())!=null) {
80                                                                 if(query.length()==0) {
81                                                                         query.append("BEGIN BATCH\n");
82                                                                 }
83                                                                 // Split into fields, first turning Escaped values into something we can convert back from
84                                                                 char c=0;
85                                                                 boolean inQuote = false;
86                                                                 int fldcnt = 0;
87                                                                 
88                                                                 for(int i=0;i<line.length();++i) {
89                                                                         switch(c=line.charAt(i)) {
90                                                                                 case '"':
91                                                                                         inQuote = !inQuote;
92                                                                                         break;
93                                                                                 case '|':
94                                                                                         if(inQuote) {
95                                                                                                 sb.append(c);
96                                                                                         } else {
97                                                                                                 addField(feed,fldcnt++,array,sb);
98                                                                                         }
99                                                                                         break;
100                                                                                 default:
101                                                                                         sb.append(c);
102                                                                         }
103                                                                 }
104                                                                 addField(feed,fldcnt,array,sb);
105                                                                 query.append(build(feed, array));
106                                                                 
107                                                                 if((++count % BATCH_LENGTH)==0) {
108                                                                         applyBatch(query);
109                                                                 }
110                                                         }
111                                                         if((count % BATCH_LENGTH)!=0) {
112                                                                 applyBatch(query);
113                                                         }
114                                                         
115                                                 } finally {
116                                                         br.close();
117                                                         sb.setLength(0);
118                                                         query.setLength(0);
119                                                 }
120                                                 
121                                         } catch (IOException e) {
122                                                 trans.error().log(e);
123                                                 e.printStackTrace();
124                                         }
125
126                                 } else {
127                                         trans.error().log("No file found: ", file.getAbsolutePath());
128                                 }
129                         } finally {
130                                 tt.done();
131                                 System.err.flush();
132                                 System.out.printf("\n%d applied in %d batches\n",count,batchCnt);
133                         }
134
135                 }
136
137         }
138
139         // APPROVALS
140         private static final String APPR_INS_FMT="  INSERT INTO authz.approval "
141                         + "(id,approver,last_notified,memo,operation,status,ticket,type,user) "
142                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s);\n";
143         private static final Boolean[] APPR_QUOTES = new Boolean[]{false,true,true,true,true,true,false,true,true};
144
145         // ARTIFACTS
146         private static final String ARTI_INS_FMT="  INSERT INTO authz.artifact "
147                         + "(mechid,machine,ca,dir,expires,notify,ns,os_user,renewdays,sans,sponsor,type) "
148                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);\n";
149         private static final Boolean[] ARTI_QUOTES = new Boolean[]
150                         {true,true,true,true,true,true,true,true,false,false,true,false};
151         
152         // CREDS
153         private static final String CRED_INS_FMT="  INSERT INTO authz.cred "
154                         + "(id,type,expires,cred,notes,ns,other,prev) "
155                         + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s);\n";
156         private static final Boolean[] CRED_QUOTES = new Boolean[]
157                         {true,false,true,false,true,true,false,false};
158         
159         // NS
160         private static final String NS_INS_FMT="  INSERT INTO authz.ns "
161                         + "(name,description,parent,scope,type) "
162                         + "VALUES (%s,%s,%s,%s,%s);\n";
163         private static final Boolean[] NS_QUOTES = new Boolean[]
164                         {true,true,true,false,false};
165
166         // x509
167         private static final String X509_INS_FMT="  INSERT INTO authz.x509 "
168                         + "(ca,serial,id,x500,x509) "
169                         + "VALUES (%s,%s,%s,%s,%s);\n";
170         private static final Boolean[] X509_QUOTES = new Boolean[]
171                         {true,false,true,true,true};
172
173         // ROLE
174         private static final String ROLE_INS_FMT="  INSERT INTO authz.role "
175                         + "(ns,name,description,perms) "
176                         + "VALUES (%s,%s,%s,%s);\n";
177         private static final Boolean[] ROLE_QUOTES = new Boolean[]
178                         {true,true,true,false};
179         // ROLE
180         private static final String PERM_INS_FMT="  INSERT INTO authz.perm "
181                         + "(ns,type,instance,action,description,roles) "
182                         + "VALUES (%s,%s,%s,%s,%s,%s);\n";
183         private static final Boolean[] PERM_QUOTES = new Boolean[]
184                         {true,true,true,true,true,false};
185
186
187         private String build(String feed, List<String> array) {
188                 String rv;
189                 switch(feed) {
190                         case "approval":
191                                 rv = String.format(APPR_INS_FMT,array.toArray());
192                                 break;
193                         case "artifact":
194                                 rv = String.format(ARTI_INS_FMT,array.toArray());
195                                 break;
196                         case "cred":
197                                 rv = String.format(CRED_INS_FMT,array.toArray());
198                                 break;
199                         case "ns":
200                                 rv = String.format(NS_INS_FMT,array.toArray());
201                                 break;
202                         case "role":
203                                 rv = String.format(ROLE_INS_FMT,array.toArray());
204                                 break;
205                         case "perm":
206                                 rv = String.format(PERM_INS_FMT,array.toArray());
207                                 break;
208                         case "x509":
209                                 rv = String.format(X509_INS_FMT,array.toArray());
210                                 break;
211                         default:
212                                 rv = "";
213                 }
214                 array.clear();
215                 return rv;
216         }
217         
218         private void addField(String feed, int fldcnt, List<String> array, StringBuilder sb) {
219                 Boolean[] ba;
220                 switch(feed) {
221                         case "approval":
222                                 ba = APPR_QUOTES;
223                                 break;
224                         case "artifact":
225                                 ba = ARTI_QUOTES;
226                                 break;
227                         case "cred":
228                                 ba = CRED_QUOTES;
229                                 break;
230                         case "ns":
231                                 ba = NS_QUOTES;
232                                 break;
233                         case "role":
234                                 ba = ROLE_QUOTES;
235                                 break;
236                         case "perm":
237                                 ba = PERM_QUOTES;
238                                 break;
239                         case "x509":
240                                 ba = X509_QUOTES;
241                                 break;
242                         default:
243                                 ba = null;
244                 }
245                 if(ba!=null) {
246                         if(sb.toString().length()==0) {
247                                 array.add("null");
248                         } else {
249                                 if(ba[fldcnt]) {
250                                         String s = null;
251                                         if(sb.indexOf("'")>=0) {
252                                                 s = sb.toString().replace("'","''");
253                                         }
254                                         if(sb.indexOf("\\n")>=0) {
255                                                 if(s==null) {
256                                                         s = sb.toString().replace("\\n","\n");
257                                                 } else {
258                                                         s = s.replace("\\n","\n");
259                                                 }
260                                         }
261                                         if(sb.indexOf("\\t")>=0) {
262                                                 if(s==null) {
263                                                         s = sb.toString().replace("\\t","\t");
264                                                 } else {
265                                                         s = s.replace("\\t","\t");
266                                                 }
267                                         }
268                                         if(s==null) {
269                                                 array.add("'" + sb + '\'');
270                                         } else {
271                                                 array.add("'" + s + '\'');
272                                         }
273                                 } else {
274                                         array.add(sb.toString());
275                                 }
276                         }
277                         sb.setLength(0);
278                 }
279         }
280
281         private void applyBatch(StringBuilder query) {
282                 query.append("APPLY BATCH;");
283                 ResultSet rv = session.execute(query.toString());
284                 if(rv.wasApplied()) {
285                         System.out.print('.');
286                         if((++batchCnt % 60)==0) {
287                                 System.out.println();
288                         }
289                 } else {
290                         System.out.print("Data NOT APPLIED");
291                 }
292                 query.setLength(0);
293         }
294
295
296         @Override
297         protected void _close(AuthzTrans trans) {
298         session.close();
299         }
300
301 }
302