First Commit of Voltha-Go-Controller from Radisys

Change-Id: I8e2e908e7ab09a4fe3d86849da18b6d69dcf4ab0
diff --git a/internal/pkg/application/timer.go b/internal/pkg/application/timer.go
new file mode 100644
index 0000000..1a80cb5
--- /dev/null
+++ b/internal/pkg/application/timer.go
@@ -0,0 +1,70 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+* 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 application
+
+import (
+	"time"
+)
+
+//TimerType - type of timer used
+type TimerType string
+
+const (
+	tickTimer        TimerType = "TickTimer"
+	pendingPoolTimer TimerType = "PendingPoolTimer"
+)
+
+var timerMap = map[TimerType]bool{
+	tickTimer:        false,
+	pendingPoolTimer: false,
+}
+
+var timerChannels = make(map[TimerType](chan bool))
+
+// TimerCfg structure
+type TimerCfg struct {
+	tick time.Duration
+}
+
+// Start to start timer
+func (va *VoltApplication) Start(cfg TimerCfg, timerType TimerType) {
+	if timerMap[timerType] {
+		logger.Warn(ctx, "Duplicate Timer!!! Timer already running")
+		return
+	}
+	timerMap[timerType] = true
+	timerChannels[timerType] = make(chan bool)
+	for {
+		select {
+		case <-time.After(cfg.tick):
+			switch timerType {
+			case tickTimer:
+				va.Tick()
+			case pendingPoolTimer:
+				va.removeExpiredGroups()
+			}
+		case <- timerChannels[timerType]:
+			return
+		}
+	}
+}
+
+// StopTimer to stop timers
+func StopTimer() {
+	for _, ch := range timerChannels {
+		ch <- true
+	}
+}