WIP - Suggesting changes (take2)

    This is not yet completed, still working on things. Eventually the plan
    is to provide the following changes

    - restructure repo to be more aligned with https://github.com/golang-standards/project-layout
    - add k8s probes
    - modifications (golang range loops, etc) to follow some golang
    practices

Change-Id: I6922cbc00b5ef17ceab183aba00a7fc59ab46480
diff --git a/internal/pkg/openflow/meter.go b/internal/pkg/openflow/meter.go
new file mode 100644
index 0000000..d4843fa
--- /dev/null
+++ b/internal/pkg/openflow/meter.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2020 the original author or authors.
+
+   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.
+*/
+package openflow
+
+import (
+	"encoding/json"
+	ofp "github.com/donNewtonAlpha/goloxi/of13"
+	"github.com/opencord/voltha-lib-go/v2/pkg/log"
+	"github.com/opencord/voltha-protos/v2/go/openflow_13"
+	"golang.org/x/net/context"
+)
+
+func (ofc *OFClient) handleMeterModRequest(request *ofp.MeterMod) {
+	if logger.V(log.DebugLevel) {
+		js, _ := json.Marshal(request)
+		logger.Debugw("handleMeterModRequest called",
+			log.Fields{
+				"device-id": ofc.DeviceID,
+				"request":   js})
+	}
+
+	meterModUpdate := openflow_13.MeterModUpdate{Id: ofc.DeviceID}
+	meterMod := openflow_13.OfpMeterMod{
+		MeterId: request.MeterId,
+		Flags:   uint32(request.Flags),
+		Command: openflow_13.OfpMeterModCommand(request.Command),
+	}
+	var bands []*openflow_13.OfpMeterBandHeader
+	for _, ofpBand := range request.GetMeters() {
+		var band openflow_13.OfpMeterBandHeader
+		switch ofpBand.GetType() {
+		case ofp.OFPMBTDrop:
+			ofpDrop := ofpBand.(ofp.IMeterBandDrop)
+			band.Type = openflow_13.OfpMeterBandType_OFPMBT_DROP
+			band.Rate = ofpDrop.GetRate()
+			band.BurstSize = ofpDrop.GetBurstSize()
+		case ofp.OFPMBTDSCPRemark:
+			ofpDscpRemark := ofpBand.(ofp.IMeterBandDscpRemark)
+			var dscpRemark openflow_13.OfpMeterBandDscpRemark
+			band.Type = openflow_13.OfpMeterBandType_OFPMBT_DSCP_REMARK
+			band.BurstSize = ofpDscpRemark.GetBurstSize()
+			band.Rate = ofpDscpRemark.GetRate()
+			dscpRemark.PrecLevel = uint32(ofpDscpRemark.GetPrecLevel())
+			/*
+				var meterBandHeaderDscp openflow_13.OfpMeterBandHeader_DscpRemark
+				meterBandHeaderDscp.DscpRemark = &dscpRemark
+				band.Data = &meterBandHeaderDscp
+
+			*/
+		case ofp.OFPMBTExperimenter:
+			ofpExperimenter := ofpBand.(ofp.IMeterBandExperimenter)
+			var experimenter openflow_13.OfpMeterBandExperimenter
+			experimenter.Experimenter = ofpExperimenter.GetExperimenter()
+			band.Type = openflow_13.OfpMeterBandType_OFPMBT_EXPERIMENTER
+			band.BurstSize = ofpExperimenter.GetBurstSize()
+			band.Rate = ofpExperimenter.GetRate()
+			/*
+				var meterBandHeaderExperimenter openflow_13.OfpMeterBandHeader_Experimenter
+				meterBandHeaderExperimenter.Experimenter = &experimenter
+				band.Data = &meterBandHeaderExperimenter
+
+			*/
+		}
+		bands = append(bands, &band)
+	}
+	meterMod.Bands = bands
+	meterModUpdate.MeterMod = &meterMod
+	if logger.V(log.DebugLevel) {
+		meterModJS, _ := json.Marshal(meterModUpdate)
+		logger.Debugw("handleMeterModUpdate sending request",
+			log.Fields{
+				"device-id":         ofc.DeviceID,
+				"meter-mod-request": meterModJS})
+	}
+	if _, err := ofc.VolthaClient.UpdateLogicalDeviceMeterTable(context.Background(), &meterModUpdate); err != nil {
+		logger.Errorw("Error calling UpdateLogicalDeviceMeterTable",
+			log.Fields{
+				"device-id": ofc.DeviceID,
+				"error":     err})
+	}
+}