fixes to accomodate docker creation in ONF - added onap-enabler parent POM, renamed osam-core to osam-core-framework and removed junit that requires connection to DB

Change-Id: Ifdc95438c8b1e5856860882824a11eecac80e19a
Signed-off-by: Aharoni, Pavel (pa0916) <pavel.aharoni@intl.att.com>
diff --git a/osam-core-framework/core/pom.xml b/osam-core-framework/core/pom.xml
new file mode 100644
index 0000000..ba559c1
--- /dev/null
+++ b/osam-core-framework/core/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--/*-

+        * ============LICENSE_START=======================================================

+        * OSAM Core

+        * ================================================================================

+        * Copyright (C) 2018 Netsia

+        * ================================================================================

+        * Licensed under the Apache License, Version 2.0 (the "License");

+        * you may not use this file except in compliance with the License.

+        * You may obtain a copy of the License at

+        *

+        *      http://www.apache.org/licenses/LICENSE-2.0

+        *

+        * Unless required by applicable law or agreed to in writing, software

+        * distributed under the License is distributed on an "AS IS" BASIS,

+        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+        * See the License for the specific language governing permissions and

+        * limitations under the License.

+        * ============LICENSE_END=========================================================

+        */-->

+

+<project xmlns="http://maven.apache.org/POM/4.0.0"

+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

+    <parent>

+        <artifactId>osam-core-framework</artifactId>

+        <groupId>org.onap.osam</groupId>

+        <version>0.0.2</version>

+    </parent>

+    <modelVersion>4.0.0</modelVersion>

+    <artifactId>core</artifactId>

+    <dependencies>

+        <dependency>

+            <groupId>org.onap.osam</groupId>

+            <artifactId>external</artifactId>

+            <version>${project.version}</version>

+        </dependency>

+        <dependency>

+            <groupId>org.onap.osam</groupId>

+            <artifactId>api</artifactId>

+            <version>${project.version}</version>

+        </dependency>

+    </dependencies>

+</project>
\ No newline at end of file
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
new file mode 100644
index 0000000..ef69df9
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
@@ -0,0 +1,72 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.common.exception.NotFoundException;

+import org.onap.osam.model.dao.BaseEntity;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+import org.springframework.data.repository.CrudRepository;

+

+import java.util.ArrayList;

+import java.util.Collections;

+import java.util.List;

+import java.util.Optional;

+

+/**

+ * Created by cemturker on 18.09.2018.

+ */

+

+public abstract class AbstractBaseServiceImpl {

+

+    protected Logger log = LoggerFactory.getLogger(this.getClass());

+

+    protected <T extends BaseEntity> T add(T t, CrudRepository<T, Long> repository) {

+        t = repository.save(t);

+        log.info("{} is added",t);

+        return t;

+    }

+

+    protected <T extends BaseEntity> void remove(Long id, CrudRepository<T, Long> repository, Class classz) {

+        repository.deleteById(id);

+        log.info("{} is deleted for {}", id, classz.getName());

+    }

+

+    protected <T extends BaseEntity> T get(Long id, CrudRepository<T, Long> repository) {

+        Optional<T> optional = repository.findById(id);

+        if (!optional.isPresent()) {

+            throw new NotFoundException("id:"+id+" is not found");

+        }

+        return optional.get();

+    }

+

+    protected <T extends BaseEntity> List<T> getAll(CrudRepository<T, Long> repository) {

+        List<T> ts = new ArrayList<>();

+        repository.findAll().iterator().forEachRemaining(ts::add);

+        return Collections.unmodifiableList(ts);

+    }

+

+    protected <T extends BaseEntity> Long count(CrudRepository<T, Long> repository) {

+        return repository.count();

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
new file mode 100644
index 0000000..4113d1b
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
@@ -0,0 +1,97 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.external.aai.AaiClient;

+import org.onap.osam.external.aai.model.PNF;

+import org.onap.osam.model.dao.AccessPod;

+import org.onap.osam.common.exception.NotFoundException;

+import org.onap.osam.model.repository.AccessPodRepository;

+import org.onap.osam.api.service.AccessPodService;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Service;

+

+import java.util.List;

+import java.util.Optional;

+

+/**

+ * Created by cemturker on 26.09.2018.

+ */

+@Service

+public class AccessPodServiceImpl extends AbstractBaseServiceImpl implements AccessPodService {

+

+    private AccessPodRepository accessPodRepository;

+

+    private AaiClient aaiClient;

+

+    @Autowired

+    public AccessPodServiceImpl(AccessPodRepository accessPodRepository, AaiClient aaiClient) {

+        this.accessPodRepository = accessPodRepository;

+        this.aaiClient = aaiClient;

+    }

+

+

+    @Override

+    public AccessPod addOrUpdate(AccessPod value) {

+        //aai logic is commented out, to allow manual registering of SEBA PODs in OSAM Core

+        //PNF pnf = aaiClient.queryPnf(value.getPnfId());

+        Optional<AccessPod> accessPodOptional = accessPodRepository.findByPnfId(value.getPnfId());

+        if (accessPodOptional.isPresent()) {

+            AccessPod tmp = accessPodOptional.get();

+            value.setId(tmp.getId());

+        }

+        add(value,accessPodRepository);

+        //TODO need to update connection to grpc!!

+        return value;

+    }

+

+    @Override

+    public void removeById(Long key) {

+        remove(key,accessPodRepository,AccessPod.class);

+    }

+

+    @Override

+    public AccessPod getById(Long key) {

+        return get(key,accessPodRepository);

+    }

+

+    @Override

+    public List<AccessPod> getAll() {

+        return getAll(accessPodRepository);

+    }

+

+    @Override

+    public AccessPod findByPnfId(String pnfId) {

+        Optional<AccessPod> accessPodOp = accessPodRepository.findByPnfId(pnfId);

+        if (!accessPodOp.isPresent()) {

+            log.error("Access POD with pnfId : {} is not found", pnfId);

+            throw new NotFoundException("Access POD with pnfId : {} is not found", pnfId);

+        }

+        return accessPodOp.get();

+    }

+

+    @Override

+    public void removeByPnfId(String pnfId) {

+        accessPodRepository.removeByPnfId(pnfId);

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
new file mode 100644
index 0000000..57aa5f1
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
@@ -0,0 +1,78 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.model.dao.AlarmsAndEvents;

+import org.onap.osam.api.service.AlarmService;

+import org.onap.osam.common.exception.UnknownTypeException;

+import org.onap.osam.model.dao.ActiveAlarmsAndEvents;

+import org.onap.osam.model.dao.HistoricalAlarmsAndEvents;

+import org.onap.osam.model.repository.ActiveAlarmsAndEventsRepository;

+import org.onap.osam.model.repository.HistoricalAlarmsAndEventsRepository;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Service;

+

+import java.util.Date;

+import java.util.List;

+

+@Service

+public class AlarmServiceImpl extends AbstractBaseServiceImpl implements AlarmService {

+

+    ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository;

+    HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository;

+

+    @Autowired

+    public AlarmServiceImpl(ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository,

+                            HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository){

+        this.activeAlarmsAndEventsRepository = activeAlarmsAndEventsRepository;

+        this.historicalAlarmsAndEventsRepository = historicalAlarmsAndEventsRepository;

+    }

+

+    @Override

+    public List<ActiveAlarmsAndEvents> getActiveAlarmsAndEventsByDate(Date startDate, Date endDate) {

+        return activeAlarmsAndEventsRepository.findAllActiveAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual

+                (endDate,startDate);

+    }

+

+    @Override

+    public List<HistoricalAlarmsAndEvents> getHistoricalAlarmsAndEventsByDate(Date startDate, Date endDate) {

+        return historicalAlarmsAndEventsRepository.findAllHistoricalAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual(endDate,startDate);

+

+    }

+

+    @Override

+    public void addOrUpdate(AlarmsAndEvents alarmsAndEvents) {

+       switch (alarmsAndEvents.getAlarmStatus()){

+           case ACTIVE:

+               add(new ActiveAlarmsAndEvents(alarmsAndEvents),activeAlarmsAndEventsRepository);

+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents),historicalAlarmsAndEventsRepository);

+               break;

+           case DEACTIVE:

+               remove(alarmsAndEvents.getId(),activeAlarmsAndEventsRepository,AlarmsAndEvents.class);

+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents) ,historicalAlarmsAndEventsRepository);

+               break;

+           default:

+               throw new UnknownTypeException("alarm status is unknown" + alarmsAndEvents.getAlarmStatus());

+       }

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
new file mode 100644
index 0000000..fa0fdbc
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
@@ -0,0 +1,115 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.model.dao.SpeedProfile;

+import org.onap.osam.model.dao.Service;

+import org.onap.osam.model.dao.TechnologyProfile;

+import org.onap.osam.model.repository.ServiceRepository;

+import org.onap.osam.model.repository.SpeedProfileRepository;

+import org.onap.osam.model.repository.TechnologyProfileRepository;

+import org.onap.osam.api.service.BroadBandService;

+import org.springframework.beans.factory.annotation.Autowired;

+

+import java.util.List;

+

+/**

+ * Created by cemturker on 18.09.2018.

+ */

+@org.springframework.stereotype.Service

+public class BroadBandServiceImpl extends AbstractBaseServiceImpl implements BroadBandService {

+    private SpeedProfileRepository speedProfileRepository;

+    private TechnologyProfileRepository technologyProfileRepository;

+    private ServiceRepository serviceRepository;

+

+    @Autowired

+    public BroadBandServiceImpl(SpeedProfileRepository speedProfileRepository,

+                                TechnologyProfileRepository technologyProfileRepository,

+                                ServiceRepository serviceRepository) {

+        super();

+        this.speedProfileRepository = speedProfileRepository;

+        this.technologyProfileRepository = technologyProfileRepository;

+        this.serviceRepository = serviceRepository;

+    }

+

+    @Override

+    public SpeedProfile addSpeedProfile(SpeedProfile speedProfile) {

+        return add(speedProfile, speedProfileRepository);

+    }

+

+    @Override

+    public TechnologyProfile addTechnologyProfile(TechnologyProfile technologyProfile) {

+        return add(technologyProfile,technologyProfileRepository);

+    }

+

+    @Override

+    public Service addService(Service service) {

+        return add(service,serviceRepository);

+    }

+

+    @Override

+    public void removeSpeedProfile(Long id) {

+        remove(id, speedProfileRepository, SpeedProfile.class);

+

+    }

+

+    @Override

+    public void removeTechnologyProfile(Long id) {

+        remove(id, technologyProfileRepository, TechnologyProfile.class);

+    }

+

+    @Override

+    public void removeService(Long id) {

+        remove(id, serviceRepository, Service.class);

+    }

+

+    @Override

+    public SpeedProfile getSpeedProfile(Long id) {

+        return get(id, speedProfileRepository);

+    }

+

+    @Override

+    public TechnologyProfile getTechnologyProfile(Long id) {

+        return get(id, technologyProfileRepository);

+    }

+

+    @Override

+    public Service getService(Long id) {

+        return get(id, serviceRepository);

+    }

+

+    @Override

+    public List<SpeedProfile> getSpeedProfiles() {

+        return getAll(speedProfileRepository);

+    }

+

+    @Override

+    public List<TechnologyProfile> getTechnologyProfiles() {

+        return getAll(technologyProfileRepository);

+    }

+

+    @Override

+    public List<Service> getServices() {

+        return getAll(serviceRepository);

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
new file mode 100644
index 0000000..0d6828f
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
@@ -0,0 +1,312 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import com.google.common.collect.Lists;

+import org.onap.osam.api.service.AccessPodService;

+import org.onap.osam.common.exception.AbstractOLTException;

+import org.onap.osam.common.exception.InvalidOperationException;

+import org.onap.osam.common.exception.NotFoundException;

+import org.onap.osam.api.service.DeviceService;

+import org.onap.osam.common.exception.ServerException;

+import org.onap.osam.external.grpc.AbstractOLTClient;

+import org.onap.osam.model.dao.*;

+import org.onap.osam.model.repository.ChassisRepository;

+import org.onap.osam.model.repository.OLTPortRepository;

+import org.onap.osam.model.repository.OLTSlotRepository;

+import org.onap.osam.model.repository.ONTDeviceRepository;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Service;

+

+import java.util.HashSet;

+import java.util.List;

+import java.util.Optional;

+import java.util.Set;

+

+/**

+ * Created by Zafer Kaban on 18.09.2018.

+ */

+@Service

+public class DeviceServiceImpl extends AbstractBaseServiceImpl implements DeviceService {

+

+    private ChassisRepository chassisRepository;

+    private OLTPortRepository oltPortRepository;

+    private OLTSlotRepository oltSlotRepository;

+    private ONTDeviceRepository ontDeviceRepository;

+    private AbstractOLTClient abstractOLTClient;

+    private AccessPodService accessPodService;

+

+    public static int NUMBER_OF_OLT_PORTS   = 16;

+    public static int NUMBER_OF_ONT_DEVICES = 64;

+

+    @Autowired

+    public DeviceServiceImpl(ChassisRepository chassisRepository,

+                             OLTPortRepository oltPortRepository,

+                             OLTSlotRepository oltSlotRepository,

+                             ONTDeviceRepository ontDeviceRepository,

+                             AbstractOLTClient abstractOLTClient,

+                             AccessPodService accessPodService) {

+        this.chassisRepository = chassisRepository;

+        this.oltPortRepository = oltPortRepository;

+        this.oltSlotRepository = oltSlotRepository;

+        this.ontDeviceRepository = ontDeviceRepository;

+        this.abstractOLTClient = abstractOLTClient;

+        this.accessPodService = accessPodService;

+    }

+

+    @Override

+    public Chassis addChassis(Chassis chassis) {

+        AccessPod accessPod = accessPodService.findByPnfId(chassis.getAccessPod().getPnfId());

+        chassis.setAccessPod(accessPod);

+        abstractOLTClient.createChassis(chassis);

+        return add(chassis, chassisRepository);

+    }

+

+    @Override

+    public void deleteChassis(Long id) {

+        log.info("Deleting chassis, id: {}", id);

+        remove(id, chassisRepository,Chassis.class);

+    }

+

+    public void deleteChassisByClli(String clli) {

+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);

+        if (chassis.isPresent()){

+            Long id = chassis.get().getId();

+            log.trace("Deleting chassis, clli: {}", clli);

+            remove(id, chassisRepository,Chassis.class);

+        } else {

+            log.error("Chassis not found for clli {}, nothing to delete", clli);

+            throw new NotFoundException("Chassis not found for clli {}",clli);

+        }

+    }

+

+    @Override

+    public Chassis getChassisById(Long id) {

+        Optional<Chassis> chassis = chassisRepository.findById(id);

+        if (!chassis.isPresent()) {

+            log.error("Chassis not found for id {}", id);

+            throw new NotFoundException("Chassis not found for id {}",id);

+        }

+        return chassis.get();

+    }

+

+    @Override

+    public Chassis getChassisByClli(String clli) {

+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);

+        if (!chassis.isPresent()) {

+            log.error("Chassis not found for clli {}", clli);

+            throw new NotFoundException("Chassis not found for clli {}",clli);

+        }

+        return chassis.get();

+    }

+

+    @Override

+    public Long getChassisCount() {

+        return chassisRepository.count();

+    }

+

+    @Override

+    public List<Chassis> getByPnfId(String pnfId) {

+        Optional<List<Chassis>> chassisList = chassisRepository.findByAccessPodPnfId(pnfId);

+        if (!chassisList.isPresent()) {

+            log.error("Chassis is not found with pnfId {}", pnfId);

+            throw new NotFoundException("Chassis is not found with pnfId : {}",pnfId);

+        }

+        return chassisList.get();

+    }

+

+    @Override

+    public List<Chassis> getAllChassis() {

+        return Lists.newArrayList(chassisRepository.findAll());

+    }

+

+    @Override

+    public OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis) {

+        Set<OLTSlot> oltSlots = Optional.ofNullable(chassis.getOltSlots()).orElse(new HashSet<>());

+        int size = oltSlots.size();

+        if (size == NUMBER_OF_OLT_PORTS) {

+            log.error("Maximum number of OLTs exceeded, max size per chassis: {}", NUMBER_OF_OLT_PORTS);

+            throw new InvalidOperationException("Maximum number of OLTs exceeded");

+        }

+        oltSlot.setNumber(size+1);

+        oltSlot.setAdminState(AdminState.ENABLED);

+        oltSlot.setOperationalState(ActivityState.ACTIVE);

+        oltSlot.setPortAuthState(ActivityState.ACTIVE);

+        abstractOLTClient.createOLTChassis(oltSlot);

+

+        oltSlot.setChassis(chassis);

+        log.trace("Adding OLT Slot, OLT slot: {}", oltSlot);

+        add(oltSlot, oltSlotRepository);

+        for (int j = 0; j < 16 ; j++) {

+            OLTPort oltPort = new OLTPort();

+            oltPort.setOltSlot(oltSlot);

+            oltPort.setPortNumber(j+1);

+            oltPort.setAdminState(AdminState.ENABLED);

+            oltPort.setPortAuthState(ActivityState.ACTIVE);

+            log.trace("Adding OLT Port on this slot, OLT port: {}", oltPort);

+            add(oltPort, oltPortRepository);

+        }

+        oltSlots.add(oltSlot);

+        chassis.setOltSlots(oltSlots);

+        log.trace("Adding this OLT slot to chassis {}", chassis);

+        chassisRepository.save(chassis);

+        return oltSlot;

+    }

+

+    @Override

+    public void deleteOLTSlot(Long id) {

+        log.info("Deleting OLT slot, id: {}", id);

+        oltSlotRepository.deleteById(id);

+    }

+

+    @Override

+    public OLTSlot getOLTSlotById(Long id) {

+        Optional<OLTSlot> oltSlot = oltSlotRepository.findById(id);

+        if (!oltSlot.isPresent()) {

+            log.error("OLT Slot not found with id {}", id);

+            throw new NotFoundException("OLT Slot not found with id "+id);

+        }

+        return oltSlot.get();

+    }

+

+    @Override

+    public OLTSlot getOLTSlotBySerialNumber(String serialNumber) {

+        Optional<OLTSlot> oltSlot = oltSlotRepository.findBySerialNumber(serialNumber);

+        if (!oltSlot.isPresent()) {

+            log.error("OLT Slot not found with serial number {}", serialNumber);

+            throw new NotFoundException("OLT Slot not found with serialNumber {}",serialNumber);

+        }

+        return oltSlot.get();

+    }

+

+    @Override

+    public List<OLTSlot> getAllOLTSlots() {

+        return Lists.newArrayList(oltSlotRepository.findAll());

+    }

+

+    @Override

+    public void deleteOLTPort(Long id) {

+        log.info("Deleting OLT port, id: {}", id);

+        oltPortRepository.deleteById(id);

+    }

+

+    @Override

+    public OLTPort getOLTPortById(Long id) {

+        Optional<OLTPort> oltPort = oltPortRepository.findById(id);

+        if (!oltPort.isPresent()) {

+            log.error("OLT Port not found, id: {}", id);

+            throw new NotFoundException("OLT Port not found, id {}",id);

+        }

+        return oltPort.get();

+    }

+

+    @Override

+    public ONTDevice provisionONTDevice(ONTDevice ont, OntProvisioningType provisioningType){

+        log.trace("ONT Device provisioning, ONT Device: {}, provisioning type: ");

+        OLTPort oltPort = ont.getOLTPort();

+        int portNumber = oltPort.getPortNumber();

+        OLTSlot oltSlot = oltPort.getOltSlot();

+        int slotNumber = oltSlot.getNumber();

+        Chassis chassis = oltSlot.getChassis();

+        String clli = chassis.getClli();

+        int ontNumber = ont.getNumber();

+        String serialNumber = ont.getSerialNumber();

+        Optional<OLTPort> thePort = oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(portNumber,slotNumber,clli);

+        if (thePort.isPresent()) {

+            OLTPort port = thePort.get();

+            log.trace("Port found : {}", thePort);

+            Set<ONTDevice> ontDevices = Optional.ofNullable(port.getOntDevices()).orElse(new HashSet<>());

+

+            ONTDevice ontDevice = new ONTDevice();

+            ontDevice.setSerialNumber(serialNumber);

+            ontDevice.setNumber(ontNumber);

+            ontDevice.setOLTPort(port);

+            ontDevice.setAdminState(AdminState.ENABLED);

+            ontDevice.setOperationalState(ActivityState.ACTIVE);

+            ontDevice.setPortAuthState(ActivityState.ACTIVE);

+            ontDevice.setCTag(ont.getCTag());

+            ontDevice.setSTag(ont.getSTag());

+            ontDevice.setCircuitId(ont.getCircuitId());

+            ontDevice.setNasPortId(ont.getNasPortId());

+

+            //TODO Handle technology and speed profiles later

+            ontDevice.setSpeedProfile(null);

+            ontDevice.setTechProfile(null);

+

+            boolean success =  false;

+            if (provisioningType == OntProvisioningType.FULL) {

+                success = abstractOLTClient.provisionOntFull(ont);

+            } else if (provisioningType == OntProvisioningType.PREPROVISION) {

+                success = abstractOLTClient.preProvisionOnt(ont);

+            } else {

+                success = abstractOLTClient.provisionONT(ont);

+            }

+

+            if (success){

+                ontDevice = add(ontDevice, ontDeviceRepository);

+                ontDevices.add(ontDevice);

+                port.setOntDevices(ontDevices);

+                oltPortRepository.save(port);

+            } else {

+                log.error("Failed to process ONTDevice at Abstract OLT, ONTDevice: {}", ont);

+                throw new ServerException("Failed to provision ONTDevice with serial number " + ont.getSerialNumber());

+            }

+

+        } else {

+            log.error("Port not found, port number: {}", portNumber);

+            throw new NotFoundException("Port not found, port number {}",portNumber);

+        }

+        return ont;

+    }

+

+    @Override

+    public void deleteONTDevice(Long id) {

+        log.info("Deleting ONT device port, id: {}", id);

+        ontDeviceRepository.deleteById(id);

+    }

+

+    @Override

+    public ONTDevice getONTDeviceById(Long id) {

+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findById(id);

+        if (!ontDevice.isPresent()) {

+            log.error("Couldn't find ONT Device with ID {}", id);

+            throw new NotFoundException("Couldn't find ONT Device with ID {}",id);

+        }

+        return ontDevice.get();

+    }

+

+    @Override

+    public ONTDevice getONTDeviceBySerialNumber(String serialNumber) {

+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findBySerialNumber(serialNumber);

+        if (!ontDevice.isPresent()) {

+            log.error("Couldn't find ONT Device with serialNumber {}", serialNumber);

+            throw new NotFoundException("Couldn't find ONT Device with serialNumber {}",serialNumber);

+        }

+        return ontDevice.get();

+    }

+

+    @Override

+    public List<ONTDevice> getAllONTDevices() {

+        return Lists.newArrayList(ontDeviceRepository.findAll());

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
new file mode 100644
index 0000000..b1e3f29
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
@@ -0,0 +1,104 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.model.repository.PmConfigsRepository;

+import org.onap.osam.model.dao.PmConfig;

+import org.onap.osam.model.dao.PmConfigs;

+import org.onap.osam.model.dao.PmGroupConfig;

+import org.onap.osam.model.repository.PmConfigRepository;

+import org.onap.osam.model.repository.PmGroupConfigRepository;

+import org.onap.osam.api.service.PmConfigsService;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Service;

+

+import java.util.List;

+

+@Service

+public class PmConfigsServiceImpl extends AbstractBaseServiceImpl implements PmConfigsService{

+

+    protected PmConfigRepository pmConfigRepository;

+    protected PmConfigsRepository pmConfigsRepository;

+    protected PmGroupConfigRepository pmGroupConfigRepository;

+

+    @Autowired

+    public PmConfigsServiceImpl(PmConfigRepository pmConfigRepository,PmConfigsRepository pmConfigsRepository,

+                                PmGroupConfigRepository pmGroupConfigRepository){

+

+        this.pmConfigRepository=pmConfigRepository;

+        this.pmGroupConfigRepository=pmGroupConfigRepository;

+        this.pmConfigsRepository=pmConfigsRepository;

+    }

+

+

+    @Override

+    public List<PmConfig> getPmConfigByPmConfigsId(Long pmConfigsId) {

+        return pmConfigRepository.getByPmConfigs_Id(pmConfigsId);

+    }

+

+    @Override

+    public List<PmConfig> getPmConfigByPmConfigGroupId(Long pmGroupConfigsId) {

+        return pmConfigRepository.getByPmGroupConfig_Id(pmGroupConfigsId);

+    }

+

+    @Override

+    public void addPmGroupConfig(PmConfig pmConfig) {

+        add(pmConfig,pmConfigRepository);

+    }

+

+    @Override

+    public void addPmGroupConfig(PmGroupConfig pmGroupConfig) {

+        add(pmGroupConfig,pmGroupConfigRepository);

+    }

+

+    @Override

+    public void removePmConfig(Long pmConfigId) {

+        remove(pmConfigId,pmConfigRepository,PmConfig.class);

+    }

+

+    @Override

+    public void removeGroupPmConfig(Long pmGroupConfigId) {

+        remove(pmGroupConfigId,pmGroupConfigRepository,PmGroupConfig.class);

+    }

+

+

+    @Override

+    public PmConfigs addOrUpdate(PmConfigs value) {

+        return add(value,pmConfigsRepository);

+    }

+

+    @Override

+    public void removeById(Long key) {

+        remove(key,pmConfigsRepository,PmConfigs.class);

+    }

+

+    @Override

+    public PmConfigs getById(Long key) {

+        return get(key,pmConfigsRepository);

+    }

+

+    @Override

+    public List<PmConfigs> getAll() {

+        return getAll(pmConfigsRepository);

+    }

+}

diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
new file mode 100644
index 0000000..e295655
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
@@ -0,0 +1,71 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+

+

+package org.onap.osam.core;

+

+import org.onap.osam.model.dao.Subscriber;

+import org.onap.osam.model.repository.SubscriberRepository;

+import org.onap.osam.api.service.SubscriberService;

+import org.springframework.beans.factory.annotation.Autowired;

+import org.springframework.stereotype.Service;

+

+import java.util.List;

+

+/**

+ * Created by cemturker on 18.09.2018.

+ */

+@Service

+public class SubscriberServiceImpl extends AbstractBaseServiceImpl implements SubscriberService {

+

+    private SubscriberRepository subscriberRepository;

+

+    @Autowired

+    public SubscriberServiceImpl(SubscriberRepository subscriberRepository) {

+        this.subscriberRepository = subscriberRepository;

+    }

+

+    @Override

+    public Subscriber addOrUpdate(Subscriber subscriber) {

+        //TODO Add Check the devices.....

+        return add(subscriber, subscriberRepository);

+    }

+

+    @Override

+    public void removeById(Long id) {

+        remove(id, subscriberRepository, Subscriber.class);

+    }

+

+    @Override

+    public Subscriber getById(Long id) {

+        return get(id, subscriberRepository);

+    }

+

+    @Override

+    public List<Subscriber> getAll() {

+        return getAll(subscriberRepository);

+    }

+

+    @Override

+    public Subscriber getBySubscriberIdentifier(String userIdentifier) {

+        return subscriberRepository.findByUserIdentifier(userIdentifier);

+    }

+}

diff --git a/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java b/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
new file mode 100644
index 0000000..3b974a5
--- /dev/null
+++ b/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
@@ -0,0 +1,440 @@
+/*-

+ * ============LICENSE_START=======================================================

+ * OSAM Core

+ * ================================================================================

+ * Copyright (C) 2018 Netsia

+ * ================================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * ============LICENSE_END=========================================================

+ */

+

+package org.onap.osam.core;

+

+import junitparams.JUnitParamsRunner;

+import junitparams.Parameters;

+import org.junit.Before;

+import org.junit.Test;

+import org.junit.runner.RunWith;

+import org.mockito.ArgumentCaptor;

+import org.mockito.Captor;

+import org.mockito.InjectMocks;

+import org.mockito.Mock;

+import org.mockito.MockitoAnnotations;

+import org.onap.osam.api.service.AccessPodService;

+import org.onap.osam.api.service.DeviceService;

+import org.onap.osam.common.exception.AbstractOLTException;

+import org.onap.osam.common.exception.InvalidOperationException;

+import org.onap.osam.common.exception.NotFoundException;

+import org.onap.osam.common.exception.ServerException;

+import org.onap.osam.external.grpc.AbstractOLTClient;

+import org.onap.osam.model.dao.*;

+import org.onap.osam.model.repository.ChassisRepository;

+import org.onap.osam.model.repository.OLTPortRepository;

+import org.onap.osam.model.repository.OLTSlotRepository;

+import org.onap.osam.model.repository.ONTDeviceRepository;

+

+import java.util.ArrayList;

+import java.util.HashSet;

+import java.util.List;

+import java.util.Optional;

+import java.util.Set;

+

+import static org.assertj.core.api.Assertions.assertThat;

+import static org.assertj.core.api.Assertions.assertThatThrownBy;

+import static org.mockito.ArgumentMatchers.any;

+import static org.mockito.Mockito.*;

+

+/**

+ * Created by Zafer Kaban on 26.11.2018.

+ */

+

+@RunWith(JUnitParamsRunner.class)

+public class DeviceServiceImplTest {

+

+    private static String TEST_PNF_ID = "TEST_PNF_ID";

+    private static String TEST_CLLI   = "TEST_CLLI";

+    private static String TEST_SERIAL = "SERIAL_NUMBER";

+

+    @Mock

+    private ChassisRepository chassisRepository;

+    @Mock

+    private OLTPortRepository oltPortRepository;

+    @Mock

+    private OLTSlotRepository oltSlotRepository;

+    @Mock

+    private ONTDeviceRepository ontDeviceRepository;

+

+    @Mock

+    private AbstractOLTClient abstractOLTClient;

+

+    @Mock

+    private AccessPodService accessPodService;

+

+    @Captor

+    private ArgumentCaptor<ONTDevice> ontDeviceCaptor;

+

+    @Captor

+    private ArgumentCaptor<OLTPort> portCaptor;

+

+

+    private Chassis chassis;

+

+    private AccessPod accessPod;

+

+    private OLTSlot oltSlot;

+

+    private OLTPort oltPort;

+

+    private ONTDevice ontDevice;

+

+    @InjectMocks

+    private DeviceServiceImpl deviceService;

+

+    @Before

+    public void initMocks() {

+        MockitoAnnotations.initMocks(this);

+        accessPod = new AccessPod();

+        accessPod.setPnfId(TEST_PNF_ID);

+        chassis = new Chassis();

+        chassis.setClli(TEST_CLLI);

+        chassis.setAccessPod(accessPod);

+        chassis.setId(1L);

+        oltSlot = new OLTSlot();

+        oltSlot.setId(1L);

+        oltSlot.setNumber(1);

+        oltPort = new OLTPort();

+        oltPort.setId(1L);

+        oltPort.setPortNumber(1);

+        ontDevice = new ONTDevice();

+        ontDevice.setId(1L);

+        ontDevice.setOLTPort(oltPort);

+        oltPort.setOltSlot(oltSlot);

+        oltSlot.setChassis(chassis);

+

+        when(chassisRepository.findByClli(TEST_CLLI)).thenReturn(Optional.ofNullable(chassis));

+        when(chassisRepository.findById(1L)).thenReturn(Optional.ofNullable(chassis));

+    }

+

+    @Test

+    public void whenAddChassis_sunnyFlow(){

+

+        // TEST Sunshine scenario

+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenReturn(accessPod);

+        when(chassisRepository.save(chassis)).thenReturn(chassis);

+

+        Chassis chassisResult = deviceService.addChassis(chassis);

+        assertThat(chassisResult).isSameAs(chassis);

+    }

+

+

+    @Test

+    public void whenAddChassisPnfNotFound_shouldThrowException() {

+        // TEST when PNF registration does not exist so that Access POD does not exist in OSAM DB

+

+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenThrow(NotFoundException.class);

+        assertThatThrownBy(() -> deviceService.addChassis(chassis)).isInstanceOf(NotFoundException.class);

+        //verify we save nothing to DB

+        verifyZeroInteractions(chassisRepository);

+    }

+

+    @Test

+    public void whenAddChassisAbstractOltReturnsNull_shouldThrowException() {

+        // TEST grpc failure case

+

+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenReturn(accessPod);

+        doThrow(AbstractOLTException.class).when(abstractOLTClient).createChassis(chassis);

+        assertThatThrownBy(() -> deviceService.addChassis(chassis)).isInstanceOf(AbstractOLTException.class);

+        //verify we save nothing to DB

+        verifyZeroInteractions(chassisRepository);

+    }

+

+

+    @Test

+    public void whenDeleteChassisById_sunnyFlow() {

+        deviceService.deleteChassis(1L);

+        verify(chassisRepository, times(1)).deleteById(1L);

+    }

+

+    @Test

+    public void whenDeleteChassisByClli_sunnyFlow () {

+        deviceService.deleteChassisByClli(TEST_CLLI);

+        //Test chassis has clli TEST_CLLI and id 1L, thus the verify

+        verify(chassisRepository, times(1)).deleteById(1L);

+    }

+

+

+

+    @Test

+    public void whenGetChassisById_sunnyFlow(){

+        Chassis testChassis = deviceService.getChassisById(1L);

+        assertThat(testChassis).isSameAs(chassis);

+    }

+

+    @Test

+    public void whenGetChassisByNotExistingId_throwNotFoundException(){

+        assertThatThrownBy(() -> deviceService.getChassisById(100L)).isInstanceOf(NotFoundException.class);

+    }

+

+    @Test

+    public void whenGetChassisByTestClli_sunnyFlow(){

+        Chassis testChassis = deviceService.getChassisByClli(TEST_CLLI);

+        assertThat(testChassis).isSameAs(chassis);

+    }

+

+    @Test

+    public void whenGetChassisByNotExistingClli_throwNotFoundException(){

+        assertThatThrownBy(() -> deviceService.getChassisByClli("SOME_FAKE_CLLI")).isInstanceOf(NotFoundException.class);

+    }

+

+    @Test

+    public void whenCountChassis_sunnyFlow(){

+        when(chassisRepository.count()).thenReturn(1L);

+        long count = deviceService.getChassisCount();

+        assertThat(count).isEqualTo(1L);

+    }

+

+    @Test

+    public void whenGetByPnfId_sunnyFlow(){

+        when(chassisRepository.findByAccessPodPnfId(TEST_PNF_ID)).thenReturn(Optional.of(new ArrayList<Chassis>()));

+        ArrayList<Chassis> chassisResult = (ArrayList<Chassis>) deviceService.getByPnfId(TEST_PNF_ID);

+        assertThat(chassisResult).isNotNull();

+    }

+

+

+    @Test

+    public void whenGetByPnfIdNotExisting_shouldThrowException(){

+        assertThatThrownBy(() -> deviceService.getByPnfId("SOME_FAKE_PNFID")).isInstanceOf(NotFoundException.class);

+    }

+

+

+    @Test

+    public void whenGetAllChassis_sunnyFlow() {

+        when(chassisRepository.findAll()).thenReturn(new ArrayList<Chassis>());

+        ArrayList<Chassis> chassisResult = (ArrayList<Chassis>) deviceService.getAllChassis();

+        assertThat(chassisResult).isNotNull();

+    }

+

+

+    @Test

+    public void whenAddOLTSlot_sunnyFlow() {

+

+        Set<OLTSlot> oltSlots = new HashSet<OLTSlot>();

+        chassis.setOltSlots(oltSlots);

+        when(oltSlotRepository.save(oltSlot)).thenReturn(oltSlot);

+        when(abstractOLTClient.createOLTChassis(oltSlot)).thenReturn(TEST_CLLI);

+

+        OLTSlot oltResult = deviceService.addOLTSlot(oltSlot, chassis);

+

+        //verify creation of 16 ports

+        verify(oltPortRepository, times(16)).save(portCaptor.capture());

+        final List<OLTPort> allOltPortsValues = portCaptor.getAllValues();

+        allOltPortsValues.forEach(x -> {

+            assertThat(x.getOltSlot()).isSameAs(oltSlot);

+            assertThat(x.getAdminState()).isEqualTo(AdminState.ENABLED);

+            assertThat(x.getPortAuthState()).isEqualTo(ActivityState.ACTIVE);

+        });

+

+        //verify added to chassis

+        assertThat(chassis.getOltSlots()).hasSize(1);

+

+        //verify oltSlot logic

+        assertThat(oltResult).isSameAs(oltSlot);

+        assertThat(oltResult.getAdminState()).isEqualTo(AdminState.ENABLED);

+        assertThat(oltResult.getOperationalState()).isEqualTo(ActivityState.ACTIVE);

+        assertThat(oltResult.getPortAuthState()).isEqualTo(ActivityState.ACTIVE);

+

+    }

+

+    public void whenAddOLTSlotTooManySlotsOnChassis_shouldThrowException() {

+        //already add 16 slots, cannot add another one

+        Set<OLTSlot> oltSlots = new HashSet<OLTSlot>();

+        for (int i = 0; i < 16; i++) {

+            oltSlots.add(new OLTSlot());

+        }

+        chassis.setOltSlots(oltSlots);

+        assertThatThrownBy(()-> deviceService.addOLTSlot(oltSlot, chassis)).isInstanceOf(InvalidOperationException.class);

+        //verify no DB interactions

+        verifyZeroInteractions(oltSlotRepository, oltPortRepository, chassisRepository);

+    }

+

+    public void whenAddOLTSlotAbstractOLTReturnsNull_shouldThrowException() {

+        when(abstractOLTClient.createOLTChassis(oltSlot)).thenReturn(null);

+        assertThatThrownBy(()-> deviceService.addOLTSlot(oltSlot, chassis)).isInstanceOf(ServerException.class);

+        //verify no DB interactions

+        verifyZeroInteractions(oltSlotRepository, oltPortRepository, chassisRepository);

+    }

+

+    @Test

+    public void whenDeleteOLTSlot_repositoryMethodCalledOnce() {

+        deviceService.deleteOLTSlot(1L);

+        verify(oltSlotRepository, times(1)).deleteById(1L);

+    }

+

+

+    @Test

+    public void whenGetOLTSlotById_sunnyFlow(){

+        when(oltSlotRepository.findById(1L)).thenReturn(Optional.of(oltSlot));

+        OLTSlot oltActualSlot = deviceService.getOLTSlotById(1L);

+        assertThat(oltActualSlot).isSameAs(oltSlot);

+    }

+

+    @Test

+    public void whenGetOLTSlotByIdNotExisting_shouldThrowException(){

+        assertThatThrownBy(()-> deviceService.getOLTSlotById(100L)).isInstanceOf(NotFoundException.class);

+    }

+

+    @Test

+    public void whenGetOLTSlotBySerialId_sunnyFlow() {

+        when(oltSlotRepository.findBySerialNumber(TEST_SERIAL)).thenReturn(Optional.of(oltSlot));

+        OLTSlot oltActualSlot = deviceService.getOLTSlotBySerialNumber(TEST_SERIAL);

+        assertThat(oltActualSlot).isSameAs(oltSlot);

+    }

+

+    @Test

+    public void whenGetOLTSlotBySerialIdNotExisting_shouldThrowException(){

+        assertThatThrownBy(()-> deviceService.getOLTSlotBySerialNumber("SOME_FAKE_SERIAL")).isInstanceOf(NotFoundException.class);

+    }

+

+    @Test

+    public void whenGetAllOLTSlot_sunnyFlow() {

+        final ArrayList<OLTSlot> slotArrayList = new ArrayList<>();

+        when(oltSlotRepository.findAll()).thenReturn(slotArrayList);

+        ArrayList<OLTSlot> oltSlots = (ArrayList<OLTSlot>) deviceService.getAllOLTSlots();

+        assertThat(oltSlots).isEqualTo(slotArrayList);

+    }

+

+    @Test

+    public void whenDeleteOLTPort_sunnyFlow() {

+        deviceService.deleteOLTPort(1L);

+        verify(oltPortRepository, times(1)).deleteById(1L);

+    }

+

+    @Test

+    public void whenGetOLTPort_sunnyFlow() {

+        when(oltPortRepository.findById(1L)).thenReturn(Optional.of(oltPort));

+        final OLTPort actualPort = deviceService.getOLTPortById(1L);

+        assertThat(actualPort).isSameAs(oltPort);

+    }

+

+    @Test

+    public void whenGetOLTPortByIdNotExisting_shouldThrowException(){

+        assertThatThrownBy(()-> deviceService.getOLTPortById(100L)).isInstanceOf(NotFoundException.class);

+    }

+

+    @Test

+    @Parameters(method = "provTypeToTestForOnt")

+    public void whenProvisionONTDevice_sunnyFlow(DeviceService.OntProvisioningType provType) {

+

+

+        //setting up ontDevice

+        ontDevice.setSerialNumber("SOME_SERIAL_NUMBER");

+        ontDevice.setNumber(23);

+        ontDevice.setCTag(111);

+        ontDevice.setSTag(222);

+        ontDevice.setCircuitId("CIRCUIT_ID");

+        ontDevice.setNasPortId("NAS_PORT_ID");

+        ontDevice.setAdminState(AdminState.ENABLED);

+        ontDevice.setOperationalState(ActivityState.ACTIVE);

+        ontDevice.setPortAuthState(ActivityState.ACTIVE);

+

+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(oltPort));

+        when(abstractOLTClient.provisionONT(ontDevice)).thenReturn(true);

+        when(abstractOLTClient.preProvisionOnt(ontDevice)).thenReturn(true);

+        when(abstractOLTClient.provisionOntFull(ontDevice)).thenReturn(true);

+

+        //This is because in order to be inserted to hashset of oltSlots at the next command of tested function,

+        //the ONTDevice has to have ID

+        when(ontDeviceRepository.save(any())).thenReturn(ontDevice);

+

+       deviceService.provisionONTDevice(ontDevice, provType);

+

+       //checking that the copy to persisted object was as expected

+        verify(ontDeviceRepository, times(1)).save(ontDeviceCaptor.capture());

+        final ONTDevice capturedONTDevice = ontDeviceCaptor.getValue();

+

+        //TODO Pavel fix after discussion with Netsia regarding the returned object.

+        //Currently the assert will fail because internal object has no ID.

+        //I didn't want to use isEqualUsingSpecificFields, to catch set operations we might miss in the future

+        //assertThat(capturedONTDevice).isEqualToComparingFieldByField(ontDevice);

+

+        verify(oltPortRepository, times(1)).save(oltPort);

+    }

+

+    private Object[] provTypeToTestForOnt() {

+        return new Object[] {

+                new Object[] { DeviceService.OntProvisioningType.PROVISION },

+                new Object[] { DeviceService.OntProvisioningType.PREPROVISION },

+                new Object[] { DeviceService.OntProvisioningType.FULL }

+        };

+    }

+

+    @Test

+    @Parameters(method = "provTypeToTestForOnt")

+    public void whenAddONTDeviceNoPortFound_shouldThrowException(DeviceService.OntProvisioningType provType) {

+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(null));

+        assertThatThrownBy(()-> deviceService.provisionONTDevice(ontDevice, provType)).isInstanceOf(NotFoundException.class);

+

+    }

+

+    @Test

+    @Parameters(method = "provTypeToTestForOnt")

+    public void whenAddONTDeviceAbstractOLTError_shouldThrowException(DeviceService.OntProvisioningType provType) {

+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(oltPort));

+        when(abstractOLTClient.provisionONT(ontDevice)).thenReturn(false);

+        when(abstractOLTClient.preProvisionOnt(ontDevice)).thenReturn(false);

+        when(abstractOLTClient.provisionOntFull(ontDevice)).thenReturn(false);

+        assertThatThrownBy(()-> deviceService.provisionONTDevice(ontDevice, provType)).isInstanceOf(ServerException.class);

+

+    }

+

+    @Test

+    public void whenDeleteONTDevice_sunnyFlow() {

+        deviceService.deleteONTDevice(1L);

+        verify(ontDeviceRepository, times(1)).deleteById(1L);

+    }

+

+    @Test

+    public void whenGetONTDeviceById_sunnyFlow() {

+        when(ontDeviceRepository.findById(1L)).thenReturn(Optional.of(ontDevice));

+        ONTDevice actualOntDevice = deviceService.getONTDeviceById(1L);

+        assertThat(actualOntDevice).isSameAs(ontDevice);

+    }

+

+    @Test

+    public void whenGetONTDeviceNoId_shouldThrowException() {

+        assertThatThrownBy(()-> deviceService.getONTDeviceById(100L)).isInstanceOf(NotFoundException.class);

+

+    }

+

+    @Test

+    public void whenGetONTDeviceBySerialNumber_sunnyFlow() {

+        when(ontDeviceRepository.findBySerialNumber(TEST_SERIAL)).thenReturn(Optional.of(ontDevice));

+        ONTDevice actualOntDevice = deviceService.getONTDeviceBySerialNumber(TEST_SERIAL);

+        assertThat(actualOntDevice).isSameAs(ontDevice);

+    }

+

+    @Test

+    public void whenGetONTDeviceNoSerialNumber_shouldThrowException() {

+        assertThatThrownBy(()-> deviceService.getONTDeviceBySerialNumber(TEST_SERIAL)).isInstanceOf(NotFoundException.class);

+

+    }

+

+    @Test

+    public void whenGetAllONTDevices_sunnyFlow() {

+        final ArrayList<ONTDevice> devices = new ArrayList<>();

+        devices.add(ontDevice);

+        when(ontDeviceRepository.findAll()).thenReturn(devices);

+        ArrayList<ONTDevice> ontDevices = (ArrayList<ONTDevice>) deviceService.getAllONTDevices();

+        assertThat(ontDevices).isEqualTo(devices);

+    }

+}