Add DB update support for IPAM interaction
[ccsdk/sli/adaptors.git] / netbox-client / provider / src / main / java / org / onap / ccsdk / sli / adaptors / netbox / impl / NetboxClientImpl.java
index 0520ad5..036ff44 100644 (file)
 package org.onap.ccsdk.sli.adaptors.netbox.impl;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Lists;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonSerializer;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.concurrent.CompletionException;
 import org.apache.http.HttpResponse;
 import org.onap.ccsdk.sli.adaptors.netbox.api.IpamException;
@@ -29,19 +32,29 @@ import org.onap.ccsdk.sli.adaptors.netbox.api.NetboxClient;
 import org.onap.ccsdk.sli.adaptors.netbox.model.IPAddress;
 import org.onap.ccsdk.sli.adaptors.netbox.model.Prefix;
 import org.onap.ccsdk.sli.adaptors.netbox.model.Status;
+import org.onap.ccsdk.sli.core.dblib.DbLibService;
+import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
 
-public class NetboxClientImpl implements NetboxClient {
+public class NetboxClientImpl implements NetboxClient, SvcLogicJavaPlugin {
 
     private static final String NEXT_AVAILABLE_IP_IN_PREFIX_PATH = "/api/ipam/prefixes/%s/available-ips/";
     private static final String IP_ADDRESS_PATH = "/api/ipam/ip-addresses/%s/";
     private static final String EMPTY_STRING = "";
     private static final String ID_MISSING_MSG = "Id must be set";
 
+    private static final String ASSIGN_IP_SQL_STATEMENT =
+        "INSERT INTO IPAM_IP_ASSIGNEMENT (service_instance_id, vf_module_id, prefix_id, ip_address_id, ip_adress, ip_status) \n"
+            + "VALUES (?, ?, ?, ?, ?, ?)";
+    private static final String UNASSIGN_IP_SQL_STATEMENT =
+        "DELETE FROM IPAM_IP_ASSIGNEMENT WHERE service_instance_id = ? AND vf_module_id = ? AND ip_address_id = ?";
+
     private final NetboxHttpClient client;
     private final Gson gson;
+    private final DbLibService dbLibService;
 
-    public NetboxClientImpl(final NetboxHttpClient client) {
+    public NetboxClientImpl(final NetboxHttpClient client, final DbLibService dbLibService) {
         this.client = client;
+        this.dbLibService = dbLibService;
         final JsonSerializer<Status> vlanStatusDeserializer = (val, type, context) -> val.toJson();
         gson = new GsonBuilder()
             .registerTypeAdapter(Status.class, vlanStatusDeserializer)
@@ -49,31 +62,54 @@ public class NetboxClientImpl implements NetboxClient {
     }
 
     @Override
-    public IPAddress assign(final Prefix prefix) throws IpamException {
+    public IPAddress assign(final Prefix prefix, final String serviceInstanceId, final String vfModuleId)
+        throws IpamException, SQLException {
+
         checkArgument(prefix.getId() != null);
         try {
-            return client.post(String.format(NEXT_AVAILABLE_IP_IN_PREFIX_PATH, prefix.getId()), EMPTY_STRING)
+            IPAddress ipAddress = client
+                .post(String.format(NEXT_AVAILABLE_IP_IN_PREFIX_PATH, prefix.getId()), EMPTY_STRING)
                 .thenApply(this::getIpAddress)
                 .toCompletableFuture()
                 .join();
+
+            ArrayList<String> args = Lists.newArrayList(serviceInstanceId,
+                vfModuleId,
+                String.valueOf(prefix.getId()),
+                String.valueOf(ipAddress.getId()),
+                ipAddress.getAddress(),
+                ipAddress.getStatus().getLabel());
+            dbLibService.writeData(ASSIGN_IP_SQL_STATEMENT, args, null);
+
+            return ipAddress;
         } catch (CompletionException e) {
-            // Unwrap the ComplettionException and wrap in IpamException
+            // Unwrap the CompletionException and wrap in IpamException
             throw new IpamException("Fail to assign IP for Prefix(id= " + prefix.getId() + "). " + e.getMessage(),
                 e.getCause());
         }
     }
 
     @Override
-    public void unassign(final IPAddress ipAddress) throws IpamException {
+    public void unassign(final IPAddress ipAddress, final String serviceInstanceId, final String vfModuleId)
+        throws IpamException, SQLException {
+
         checkArgument(ipAddress.getId() != null);
         try {
             client.delete(String.format(IP_ADDRESS_PATH, ipAddress.getId()))
                 .thenAccept(this::checkResult)
                 .toCompletableFuture()
                 .join();
+
+            ArrayList<String> args = Lists.newArrayList(
+                serviceInstanceId,
+                vfModuleId,
+                String.valueOf(ipAddress.getId()));
+            dbLibService.writeData(UNASSIGN_IP_SQL_STATEMENT, args, null);
+
         } catch (CompletionException e) {
-            // Unwrap the ComplettionException and wrap in IpamException
-            throw new IpamException("Fail to unassign IP for IPAddress(id= " + ipAddress.getId() + "). " + e.getMessage(),
+            // Unwrap the CompletionException and wrap in IpamException
+            throw new IpamException(
+                "Fail to unassign IP for IPAddress(id= " + ipAddress.getId() + "). " + e.getMessage(),
                 e.getCause());
         }
     }