Add initial support for provisioning and removing services, getting service data

Change-Id: Ie49206d788a202e70a8d64f083c3f85b92ced8fb
diff --git a/internal/core/adapter.go b/internal/core/adapter.go
index 6a59650..5e19753 100644
--- a/internal/core/adapter.go
+++ b/internal/core/adapter.go
@@ -30,13 +30,13 @@
 
 type VolthaYangAdapter struct {
 	volthaNbiClient *clients.VolthaNbiClient
-	oltAppClient    *clients.OltAppClient
+	onosClient      *clients.OnosClient
 }
 
-func NewVolthaYangAdapter(nbiClient *clients.VolthaNbiClient, oltClient *clients.OltAppClient) *VolthaYangAdapter {
+func NewVolthaYangAdapter(nbiClient *clients.VolthaNbiClient, onosClient *clients.OnosClient) *VolthaYangAdapter {
 	return &VolthaYangAdapter{
 		volthaNbiClient: nbiClient,
-		oltAppClient:    oltClient,
+		onosClient:      onosClient,
 	}
 }
 
@@ -58,7 +58,7 @@
 			if err != nil {
 				return nil, fmt.Errorf("get-onu-ports-failed: %v", err)
 			}
-			logger.Debugw(ctx, "get-ports-success", log.Fields{"deviceId": device.Id, "ports": ports})
+			logger.Debugw(ctx, "get-onu-ports-success", log.Fields{"deviceId": device.Id, "ports": ports})
 
 			portsItems, err := translateOnuPorts(device.Id, ports)
 			if err != nil {
@@ -75,3 +75,114 @@
 
 	return items, nil
 }
+
+func (t *VolthaYangAdapter) GetVlans(ctx context.Context) ([]YangItem, error) {
+	services, err := t.onosClient.GetProgrammedSubscribers()
+	if err != nil {
+		return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+	}
+	logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+	//No need for other requests if there are no services
+	if len(services) == 0 {
+		return []YangItem{}, nil
+	}
+
+	ports, err := t.onosClient.GetPorts()
+	if err != nil {
+		return nil, fmt.Errorf("get-onos-ports-failed: %v", err)
+	}
+	logger.Debugw(ctx, "get-onos-ports-success", log.Fields{"ports": ports})
+
+	items, err := translateVlans(services, ports)
+	if err != nil {
+		return nil, fmt.Errorf("cannot-translate-vlans: %v", err)
+	}
+
+	return items, nil
+}
+
+func (t *VolthaYangAdapter) GetBandwidthProfiles(ctx context.Context) ([]YangItem, error) {
+	services, err := t.onosClient.GetProgrammedSubscribers()
+	if err != nil {
+		return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+	}
+	logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+	//No need for other requests if there are no services
+	if len(services) == 0 {
+		return []YangItem{}, nil
+	}
+
+	bwProfilesMap := map[string]bool{}
+	bwProfiles := []clients.BandwidthProfile{}
+
+	for _, service := range services {
+		//Get information on downstream bw profile if new
+		if _, ok := bwProfilesMap[service.TagInfo.DownstreamBandwidthProfile]; !ok {
+			bw, err := t.onosClient.GetBandwidthProfile(service.TagInfo.DownstreamBandwidthProfile)
+			if err != nil {
+				return nil, fmt.Errorf("get-bw-profile-failed: %s %v", service.TagInfo.DownstreamBandwidthProfile, err)
+			}
+			logger.Debugw(ctx, "get-bw-profile-success", log.Fields{"bwProfile": bw})
+
+			bwProfiles = append(bwProfiles, *bw)
+			bwProfilesMap[service.TagInfo.DownstreamBandwidthProfile] = true
+		}
+
+		//Get information on upstream bw profile if new
+		if _, ok := bwProfilesMap[service.TagInfo.UpstreamBandwidthProfile]; !ok {
+			bw, err := t.onosClient.GetBandwidthProfile(service.TagInfo.UpstreamBandwidthProfile)
+			if err != nil {
+				return nil, fmt.Errorf("get-bw-profile-failed: %s %v", service.TagInfo.UpstreamBandwidthProfile, err)
+			}
+			logger.Debugw(ctx, "get-bw-profile-success", log.Fields{"bwProfile": bw})
+
+			bwProfiles = append(bwProfiles, *bw)
+			bwProfilesMap[service.TagInfo.UpstreamBandwidthProfile] = true
+		}
+	}
+
+	items, err := translateBandwidthProfiles(bwProfiles)
+	if err != nil {
+		return nil, fmt.Errorf("cannot-translate-bandwidth-profiles: %v", err)
+	}
+
+	return items, nil
+}
+
+func (t *VolthaYangAdapter) GetServices(ctx context.Context) ([]YangItem, error) {
+	services, err := t.onosClient.GetProgrammedSubscribers()
+	if err != nil {
+		return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+	}
+	logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+	//No need for other requests if there are no services
+	if len(services) == 0 {
+		return []YangItem{}, nil
+	}
+
+	ports, err := t.onosClient.GetPorts()
+	if err != nil {
+		return nil, fmt.Errorf("get-onos-ports-failed: %v", err)
+	}
+	logger.Debugw(ctx, "get-onos-ports-success", log.Fields{"ports": ports})
+
+	items, err := translateServices(services, ports)
+	if err != nil {
+		return nil, fmt.Errorf("cannot-translate-services: %v", err)
+	}
+
+	return items, nil
+}
+
+func (t *VolthaYangAdapter) ProvisionService(portName string, sTag string, cTag string, technologyProfileId string) error {
+	_, err := t.onosClient.ProvisionService(portName, sTag, cTag, technologyProfileId)
+	return err
+}
+
+func (t *VolthaYangAdapter) RemoveService(portName string, sTag string, cTag string, technologyProfileId string) error {
+	_, err := t.onosClient.RemoveService(portName, sTag, cTag, technologyProfileId)
+	return err
+}