Index: /.reviewboardrc
===================================================================
--- /.reviewboardrc	(revision 9)
+++ /.reviewboardrc	(working copy)
@@ -1,3 +1,3 @@
-REVIEWBOARD_URL = "https://reviewboard.arraynetworks.net"
+REVIEWBOARD_URL = "https://reviewboard.arraynetworks.net/"
 REPOSITORY = "Ingress_controller"
 REPOSITORY_TYPE = "svn"
Index: /branches/main/array-ingress-controller/apvadapter/annotations/health/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/health/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/health/go.mod	(working copy)
@@ -0,0 +1,27 @@
+module arraynetworks.com/array-ingress-controller/apvadapter/health
+
+go 1.23.6
+
+replace (
+	arraynetworks.com/array-ingress-controller/apvclient => ../../apvclient
+	arraynetworks.com/array-ingress-controller/configstore => ../../../configstore
+	arraynetworks.com/array-ingress-controller/logger => ../../../logger
+)
+
+require (
+	arraynetworks.com/array-ingress-controller/apvclient v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/logger v0.0.0-00010101000000-000000000000
+	gorm.io/gorm v1.25.12
+)
+
+require (
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
Index: /branches/main/array-ingress-controller/apvadapter/annotations/health/go.sum
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/health/go.sum	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/health/go.sum	(working copy)
@@ -0,0 +1,50 @@
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
Index: /branches/main/array-ingress-controller/apvadapter/annotations/health/health.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/health/health.go	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/health/health.go	(working copy)
@@ -0,0 +1,72 @@
+/*
+	Copyright 2025 Array Networks
+*/
+
+package health
+
+import (
+	"encoding/json"
+
+	"arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder"
+	"arraynetworks.com/array-ingress-controller/apvclient"
+	"arraynetworks.com/array-ingress-controller/logger"
+)
+
+var (
+	log logger.Logger
+)
+
+func init() {
+	log = logger.GetLogger()
+}
+
+// HealthCheckConfig represents the health check configuration for a real service
+type HealthCheckConfig struct {
+	RealService string `json:"real_service"`
+	Interval    int    `json:"interval"`
+	Timeout     int    `json:"timeout"`
+	Retries     int    `json:"retries"`
+}
+
+// NewHealthCheckConfig initializes and returns a new HealthCheckConfig struct
+func NewHealthCheckConfig(realService string, interval, timeout, retries int) *HealthCheckConfig {
+	return &HealthCheckConfig{
+		RealService: realService,
+		Interval:    interval,
+		Timeout:     timeout,
+		Retries:     retries,
+	}
+}
+
+// CreateHealthCheck applies the health check settings to the given real service
+func (hc *HealthCheckConfig) CreateHealthCheck() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(hc)
+	if err != nil {
+		log.Errorf("Error marshalling health check JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["HealthCheck"], hc.RealService)
+	return client.Create(annotationUrl, jsonData)
+}
+
+// UpdateHealthCheck updates the existing health check settings
+func (hc *HealthCheckConfig) UpdateHealthCheck() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(hc)
+	if err != nil {
+		log.Errorf("Error marshalling health check JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["HealthCheck"], hc.RealService)
+	return client.Patch(annotationUrl, jsonData)
+}
+
+// DeleteHealthCheck removes the health check settings
+func (hc *HealthCheckConfig) DeleteHealthCheck() error {
+	client := apvclient.GetAPVClient()
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["HealthCheck"], hc.RealService)
+	return client.Delete(annotationUrl)
+}
Index: /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.mod	(working copy)
@@ -0,0 +1,23 @@
+module arraynetworks.com/array-ingress-controller/apvclient/ratelimit
+
+go 1.23.6
+
+replace (
+	arraynetworks.com/array-ingress-controller/apvclient => ../../apvclient
+	arraynetworks.com/array-ingress-controller/configstore => ../../../configstore
+	arraynetworks.com/array-ingress-controller/logger => ../../../logger
+)
+
+require (
+	arraynetworks.com/array-ingress-controller/apvclient v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/logger v0.0.0-00010101000000-000000000000
+)
+
+require (
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
+	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
Index: /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.sum
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.sum	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/go.sum	(working copy)
@@ -0,0 +1,44 @@
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Index: /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/ratelimit.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/ratelimit.go	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/annotations/ratelimit/ratelimit.go	(working copy)
@@ -0,0 +1,116 @@
+/*
+	Copyright 2025 Array Networks
+*/
+
+package ratelimit
+
+import (
+	"encoding/json"
+
+	"arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder"
+	"arraynetworks.com/array-ingress-controller/apvclient"
+	"arraynetworks.com/array-ingress-controller/logger"
+)
+
+const (
+	httpServiceType = "http"
+)
+
+var (
+	log logger.Logger
+)
+
+func init() {
+	log = logger.GetLogger()
+}
+
+//go:generate mockgen -source=ratelimit.go -destination=mocks/mock_ratelimit.go -package=mocks
+
+// RateLimitManager defines the interface for managing rate limit configurations
+type RateLimitManager interface {
+	CreateRateLimit() error
+	UpdateRateLimit() error
+	DeleteRateLimit() error
+}
+
+// RateLimitConfig represents the rate limit configuration for a real service
+type RateLimitConfig struct {
+	RealService     string `json:"real_service"`
+	MaxCPS          int    `json:"max_cps"`
+	SoftBandwidth   int    `json:"soft_bandwidth"`
+	HardBandwidth   int    `json:"hard_bandwidth"`
+	ServerConnReuse bool   `json:"server_conn_reuse,omitempty"`
+	MaxReq          int    `json:"max_req,omitempty"`
+	Timeout         int    `json:"time_out,omitempty"`
+	ServiceType     string `json:"-"`
+}
+
+type DeleteRateLimitRequest struct {
+	RealService string `json:"real_service"`
+}
+
+type RateLimitConfigParams struct {
+	RealService     string
+	ServiceType     string
+	MaxCPS          int
+	SoftBW          int
+	HardBW          int
+	MaxReq          int
+	Timeout         int
+	ServerConnReuse bool
+}
+
+// NewRateLimitConfig initializes and returns a new RateLimitConfig struct
+func NewRateLimitConfig(params RateLimitConfigParams) RateLimitManager {
+	rl := &RateLimitConfig{
+		RealService:     params.RealService,
+		MaxCPS:          params.MaxCPS,
+		SoftBandwidth:   params.SoftBW,
+		HardBandwidth:   params.HardBW,
+		ServiceType:     params.ServiceType,
+		ServerConnReuse: false,
+		MaxReq:          0,
+		Timeout:         0,
+	}
+
+	if params.ServiceType == httpServiceType {
+		rl.ServerConnReuse = params.ServerConnReuse
+		rl.MaxReq = params.MaxReq
+		rl.Timeout = params.Timeout
+	}
+
+	return rl
+}
+
+// CreateRateLimit applies the rate limit settings to the given real service
+func (rl *RateLimitConfig) CreateRateLimit() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(rl)
+	if err != nil {
+		log.Errorf("Error marshalling rate limit JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RateLimit"], rl.RealService)
+	return client.Create(annotationUrl, jsonData)
+}
+
+// UpdateRateLimit updates the existing rate limit settings
+func (rl *RateLimitConfig) UpdateRateLimit() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(rl)
+	if err != nil {
+		log.Errorf("Error marshalling rate limit JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RateLimit"], rl.RealService)
+	return client.Patch(annotationUrl, jsonData)
+}
+
+// DeleteRateLimit removes the rate limit settings
+func (rl *RateLimitConfig) DeleteRateLimit() error {
+	client := apvclient.GetAPVClient()
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RateLimit"], rl.RealService)
+	return client.Delete(annotationUrl)
+}
Index: /branches/main/array-ingress-controller/apvadapter/apvclient/apvclient.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/apvclient/apvclient.go	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/apvclient/apvclient.go	(working copy)
@@ -0,0 +1,27 @@
+/*
+	Copyright 2025 Array Networks
+*/
+
+package apvclient
+
+import (
+	"arraynetworks.com/array-ingress-controller/common/baseclient"
+)
+
+type APVClient struct {
+	*baseclient.BaseClient
+	instType string
+}
+
+var apvInstance *APVClient
+
+func GetAPVClient() *APVClient {
+	if apvInstance == nil || !apvInstance.IsHealthy("health-check-url") {
+		config := baseclient.LoadConfig("APV")
+		apvInstance = &APVClient{
+			BaseClient: baseclient.InitBaseClient("APV", config),
+			instType:   "APV",
+		}
+	}
+	return apvInstance
+}
Index: /branches/main/array-ingress-controller/apvadapter/apvclient/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/apvclient/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/apvclient/go.mod	(working copy)
@@ -0,0 +1,18 @@
+module arraynetworks.com/array-ingress-controller/apvclient
+
+go 1.23.6
+
+replace arraynetworks.com/array-ingress-controller/logger => ../../logger
+
+require (
+	arraynetworks.com/array-ingress-controller/logger v0.0.0-00010101000000-000000000000
+	github.com/go-resty/resty/v2 v2.16.5
+)
+
+require (
+	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
Index: /branches/main/array-ingress-controller/apvadapter/apvclient/go.sum
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/apvclient/go.sum	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/apvclient/go.sum	(working copy)
@@ -0,0 +1,44 @@
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Index: /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/apvurlbuilder.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/apvurlbuilder.go	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/apvurlbuilder.go	(working copy)
@@ -0,0 +1,24 @@
+/*
+	Copyright 2025 Array Networks
+*/
+
+package apvurlbuilder
+
+import (
+	"fmt"
+)
+
+// BaseURL for different annotations
+var BaseURL = map[string]string{
+	"RealService": "loadbalancing/slb/rs/RealService",
+	"RateLimit":   "loadbalancing/slb/rs/",
+	"HealthCheck": "loadbalancing/slb/rs/healthcheck",
+}
+
+// GetAnnotationURL generates a URL with the given base path and service name.
+func GetAnnotationURL(basePath, serviceName string) string {
+	if serviceName != "" {
+		return fmt.Sprintf("%s/%s", basePath, serviceName)
+	}
+	return basePath
+}
Index: /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/apvurlbuilder/go.mod	(working copy)
@@ -0,0 +1,3 @@
+module arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder
+
+go 1.23.6
Index: /branches/main/array-ingress-controller/apvadapter/client.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/client.go	(revision 9)
+++ /branches/main/array-ingress-controller/apvadapter/client.go	(nonexistent)
@@ -1,201 +0,0 @@
-/*
-	Copyright 2025 Array Networks
-
-*/
-
-package apvadapter
-
-import (
-    "crypto/tls"
-    "fmt"
-    "log"
-    "sync"
-
-    "github.com/go-resty/resty/v2"
-	"arraynetworks.com/array-ingress-controller/logger"
-)
-
-// Configuration holds settings for the ServiceClient
-type Configuration struct {
-    Username     string
-    Password     string
-    InsecureSkip bool
-}
-
-// Authenticator defines methods for setting up authentication
-type Authenticator interface {
-    Setup(request *resty.Request)
-}
-
-// BasicAuthenticator implements basic authentication
-type BasicAuthenticator struct {
-    Username string
-    Password string
-}
-
-func (a *BasicAuthenticator) Setup(request *resty.Request) {
-    request.SetBasicAuth(a.Username, a.Password)
-}
-
-// ServiceClient manages HTTP requests to a service
-type ServiceClient struct {
-    Client        *resty.Client
-    Authenticator Authenticator
-}
-
-var (
-    log            logger.Logger
-    clientInstance *ServiceClient
-    once           sync.Once
-    mu             sync.Mutex
-)
-
-func init() {
-    log = logger.GetLogger()
-}
-
-// LoadConfig loads configuration from environment variables
-func LoadConfig() Configuration {
-    insecureSkip, err := strconv.ParseBool(os.Getenv("SERVICE_INSECURE_SKIP"))
-    if err != nil {
-        log.Fatalf("Invalid value for SERVICE_INSECURE_SKIP: %v", err)
-    }
-
-    timeout, err := time.ParseDuration(os.Getenv("SERVICE_TIMEOUT"))
-    if err != nil {
-        log.Fatalf("Invalid value for SERVICE_TIMEOUT: %v", err)
-    }
-
-    return Configuration{
-        Username:     os.Getenv("SERVICE_USERNAME"),
-        Password:     os.Getenv("SERVICE_PASSWORD"),
-        InsecureSkip: insecureSkip,
-	Timeout:      timeout,
-    }
-}
-
-func initServiceClientWithPool(config Configuration) *ServiceClient {
-    client := resty.New()
-
-    // Configure the HTTP client's transport settings
-    client.SetTransport(&http.Transport{
-        TLSClientConfig: &tls.Config{
-            InsecureSkipVerify: config.InsecureSkip,
-        },
-        MaxIdleConns:        100,
-        MaxIdleConnsPerHost: 10,
-        IdleConnTimeout:     90 * time.Second,
-        DialContext: (&net.Dialer{
-            Timeout:   30 * time.Second,
-            KeepAlive: 30 * time.Second,
-        }).DialContext,
-    })
-
-    client.SetTimeout(config.Timeout)
-
-    authenticator := &BasicAuthenticator{
-        Username: config.Username,
-        Password: config.Password,
-    }
-
-    return &ServiceClient{
-        Client:        client,
-        Authenticator: authenticator,
-    }
-}
-
-// IsHealthy checks if the client is healthy
-func (s *ServiceClient) isHealthy() bool {
-    // Implement a simple health check, e.g., a ping request or checking last error state
-    resp, err := s.requestSetup().Get(url)
-    if err != nil || resp.StatusCode() != http.StatusOK {
-        return false
-    }
-    return true
-}
-
-// GetLogger return logger instance
-func GetClient() *ServiceClient {
-    if clientInstance == nil || !clientInstance.isHealthy() {
-        config := LoadConfig()
-        clientInstance = initServiceClientWithPool(config)
-    }
-    return clientInstance
-}
-
-// requestSetup sets up the request with authentication
-func (s *ServiceClient) requestSetup() *resty.Request {
-    request := s.Client.R()
-    s.Authenticator.Setup(request)
-    return request
-}
-
-// Fetch performs a GET request
-func (s *ServiceClient) Fetch(url string) error {
-    resp, err := s.requestSetup().Get(url)
-    if err != nil {
-        log.Printf("Error during GET request: %v", err)
-        return err
-    }
-
-    log.Printf("GET Response Status Code: %d", resp.StatusCode())
-    log.Printf("GET Response Body: %s", resp.String())
-
-    return nil
-}
-
-// Create performs a POST request
-func (s *ServiceClient) Create(url string, payload interface{}) error {
-    log.Printf("Request Payload: %v", payload)
-
-    resp, err := s.requestSetup().
-        SetBody(payload).
-        Post(url)
-    if err != nil {
-        log.Printf("Error during POST request: %v", err)
-        return err
-    }
-
-    log.Printf("POST Response Status Code: %d", resp.StatusCode())
-    log.Printf("POST Response Body: %s", resp.String())
-
-    return nil
-}
-
-// Delete performs a DELETE request with dynamic URL
-func (s *ServiceClient) Delete(urlTemplate string, serviceName string, payload interface{}) error {
-    url := fmt.Sprintf(urlTemplate, serviceName)
-    log.Printf("Dynamic URL: %s", url)
-
-    resp, err := s.requestSetup().
-        SetBody(payload).
-        Delete(url)
-    if err != nil {
-        log.Printf("Error during DELETE request: %v", err)
-        return err
-    }
-
-    log.Printf("DELETE Response Status Code: %d", resp.StatusCode())
-    log.Printf("DELETE Response Body: %s", resp.String())
-
-    return nil
-}
-
-// Patch performs a PATCH request with dynamic URL
-func (s *ServiceClient) Patch(urlTemplate string, serviceName string, payload interface{}) error {
-    url := fmt.Sprintf(urlTemplate, serviceName)
-    log.Printf("Dynamic URL: %s", url)
-
-    resp, err := s.requestSetup().
-        SetBody(payload).
-        Patch(url)
-    if err != nil {
-        log.Printf("Error during PATCH request: %v", err)
-        return err
-    }
-
-    log.Printf("PATCH Response Status Code: %d", resp.StatusCode())
-    log.Printf("PATCH Response Body: %s", resp.String())
-
-    return nil
-}
\ No newline at end of file
Index: /branches/main/array-ingress-controller/apvadapter/cmd.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/cmd.go	(revision 9)
+++ /branches/main/array-ingress-controller/apvadapter/cmd.go	(working copy)
@@ -1,6 +1,5 @@
 /*
 	Copyright 2025 Array Networks
-
 */
 
 package apvadapter
@@ -8,15 +7,13 @@
 import (
 	"time"
 
-	"gorm.io/gorm"
-
 	"arraynetworks.com/array-ingress-controller/configstore"
 	"arraynetworks.com/array-ingress-controller/logger"
 	"arraynetworks.com/array-ingress-controller/apvadapter/realservice"
 )
 
 var (
-	log logger.Logger
+	log      logger.Logger
 )
 
 func init() {
@@ -24,11 +21,15 @@
 }
 
 // fetchServices retrieves services from the DB where status = 'WAITING'
-func fetchServices() []configstore.Service {
-	var services []configstore.Service
-	dbclient := configstore.Get()
-	if err := dbclient.db.Where("status = ?", "WAITING").Find(&services).Error; err != nil {
-		log.Errorf("Error fetching services: %v", err)
+func fetchServices() []configstore.RealService {
+	logger.Info("Fetching realservices...")
+	var services []configstore.RealService
+	dbclient, err := configstore.Get()
+	if dbclient == nil {
+		log.Info("DB Client is NIL")
+	}
+	if err = dbclient.DB.Where("status = ?", "WAITING").Find(&services).Error; err != nil {
+		log.Info("Error fetching services: %v", err)
 		return nil
 	}
 
@@ -36,13 +37,13 @@
 }
 
 // processService processes each service by calling realservice functions
-func processService(svc *configstore.Service) {
-	dbclient := configstore.Get()
+func processService(svc *configstore.RealService) {
+	dbclient, err := configstore.Get()
 	const maxRetries = 5
 	retryCount := 0
 
 	// Update status to INPROGRESS
-	if err := dbclient.db.Model(svc).Update("status", "INPROGRESS").Error; err != nil {
+	if err = dbclient.DB.Model(svc).Update("status", "INPROGRESS").Error; err != nil {
 		log.Errorf("Failed to update status to INPROGRESS for service %s: %v", svc.ServiceName, err)
 		return
 	}
@@ -56,8 +57,6 @@
 		svc.Enable,
 	)
 
-	var err error
-
 	// Retry loop
 	for retryCount < maxRetries {
 		switch svc.CurrentOp {
@@ -69,13 +68,13 @@
 			err = rs.DeleteRealService()
 		default:
 			log.Errorf("Invalid operation %s for service %s", svc.CurrentOp, svc.ServiceName)
-			dbclient.db.Model(svc).Update("status", "FAILED")
+			dbclient.DB.Model(svc).Update("status", "FAILED")
 			return
 		}
 
 		if err == nil {
 			// Success: Mark as COMPLETED and return
-			if err := dbclient.db.Model(svc).Update("status", "COMPLETED").Error; err != nil {
+			if err := dbclient.DB.Model(svc).Update("status", "COMPLETED").Error; err != nil {
 				log.Errorf("Failed to update status to COMPLETED for service %s: %v", svc.ServiceName, err)
 			}
 			return
@@ -88,7 +87,7 @@
 	}
 
 	// If we reach max retries, update status to FAILED
-	if err := dbclient.db.Model(svc).Update("status", "FAILED").Error; err != nil {
+	if err := dbclient.DB.Model(svc).Update("status", "FAILED").Error; err != nil {
 		log.Errorf("Failed to update status to FAILED for service %s: %v", svc.ServiceName, err)
 	} else {
 		log.Errorf("Service %s failed after %d retries, marked as FAILED", svc.ServiceName, maxRetries)
@@ -98,14 +97,18 @@
 // StartReconcile continuously processes services in the queue
 func StartReconcile() {
 	for {
+		log.Info("Reconciling....")
 		svcs := fetchServices()
-		if svcs == nil {
-			time.Sleep(5 * time.Second)
+		if len(svcs) == 0 {
+			log.Info("No RealServices in db to process")
+			time.Sleep(120 * time.Second)
 			continue
 		}
 		for i := range svcs {
+			logger.Infof("Procession %s RealService", &svcs[i])
 			go processService(&svcs[i])
 		}
-		time.Sleep(5 * time.Second)
+
+		time.Sleep(120 * time.Second)
 	}
 }
Index: /branches/main/array-ingress-controller/apvadapter/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/go.mod	(revision 9)
+++ /branches/main/array-ingress-controller/apvadapter/go.mod	(working copy)
@@ -4,6 +4,7 @@
 
 replace (
 	arraynetworks.com/array-ingress-controller/apvadapter/realservice => ./realservice
+	arraynetworks.com/array-ingress-controller/apvclient => ./apvclient
 	arraynetworks.com/array-ingress-controller/configstore => ../configstore
 	arraynetworks.com/array-ingress-controller/logger => ../logger
-)
\ No newline at end of file
+)
Index: /branches/main/array-ingress-controller/apvadapter/realservice/go.mod
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/realservice/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/realservice/go.mod	(working copy)
@@ -0,0 +1,27 @@
+module arraynetworks.com/array-ingress-controller/apvadapter/realservice
+
+go 1.23.6
+
+replace (
+	arraynetworks.com/array-ingress-controller/apvclient => ../apvclient
+	arraynetworks.com/array-ingress-controller/configstore => ../../configstore
+	arraynetworks.com/array-ingress-controller/logger => ../../logger
+)
+
+require (
+	arraynetworks.com/array-ingress-controller/apvclient v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/logger v0.0.0-00010101000000-000000000000
+	gorm.io/gorm v1.25.12
+)
+
+require (
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
Index: /branches/main/array-ingress-controller/apvadapter/realservice/go.sum
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/realservice/go.sum	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/realservice/go.sum	(working copy)
@@ -0,0 +1,50 @@
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
Index: /branches/main/array-ingress-controller/apvadapter/realservice/realservice.go
===================================================================
--- /branches/main/array-ingress-controller/apvadapter/realservice/realservice.go	(nonexistent)
+++ /branches/main/array-ingress-controller/apvadapter/realservice/realservice.go	(working copy)
@@ -0,0 +1,98 @@
+/*
+	Copyright 2025 Array Networks
+*/
+
+package realservice
+
+import (
+	"encoding/json"
+
+	"arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder"
+	"arraynetworks.com/array-ingress-controller/apvclient"
+	"arraynetworks.com/array-ingress-controller/logger"
+)
+
+var (
+	log logger.Logger
+)
+
+func init() {
+	log = logger.GetLogger()
+}
+
+type RealSvc interface {
+	CreateRealService() error
+	UpdateRealService() error
+	DeleteRealService() error
+}
+
+type RealService struct {
+	ServiceName string   `json:"service_name"`
+	IPDomain    IPDomain `json:"ip_domain"`
+	Port        int      `json:"port"`
+	Protocol    string   `json:"protocol"`
+	Enable      bool     `json:"enable"`
+}
+
+type IPDomain struct {
+	IPv4 string `json:"ipv4"`
+}
+
+// NewRealService initializes and returns a RealService instance
+func NewRealService(instanceID, serverIP, protocol string, serverPort int, enable bool) *RealService {
+	return &RealService{
+		ServiceName: instanceID,
+		IPDomain:    IPDomain{serverIP},
+		Port:        serverPort,
+		Protocol:    protocol,
+		Enable:      enable,
+	}
+}
+
+func (rs *RealService) CreateRealService() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(rs)
+	if err != nil {
+		log.Errorf("Error marshalling to JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RealService"], "")
+	_, err = client.Create(annotationUrl, jsonData)
+	if err != nil {
+		log.Errorf("Error creating real service: %v", err)
+		return err
+	}
+
+	return nil
+}
+
+func (rs *RealService) UpdateRealService() error {
+	client := apvclient.GetAPVClient()
+	jsonData, err := json.Marshal(rs)
+	if err != nil {
+		log.Errorf("Error marshalling to JSON: %v", err)
+		return err
+	}
+
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RealService"], rs.ServiceName)
+	_, err = client.Update(annotationUrl, jsonData)
+	if err != nil {
+		log.Errorf("Error updating real service: %v", err)
+		return err
+	}
+
+	return nil
+}
+
+func (rs *RealService) DeleteRealService() error {
+	client := apvclient.GetAPVClient()
+	annotationUrl := apvurlbuilder.GetAnnotationURL(apvurlbuilder.BaseURL["RealService"], rs.ServiceName)
+	_, err := client.Delete(annotationUrl)
+	if err != nil {
+		log.Errorf("Error deleting real service: %v", err)
+		return err
+	}
+
+	return nil
+}
Index: /branches/main/array-ingress-controller/common/baseclient/baseclient.go
===================================================================
--- /branches/main/array-ingress-controller/common/baseclient/baseclient.go	(nonexistent)
+++ /branches/main/array-ingress-controller/common/baseclient/baseclient.go	(working copy)
@@ -0,0 +1,182 @@
+package baseclient
+
+import (
+	"crypto/tls"
+	"fmt"
+	"net"
+	"net/http"
+	"os"
+	"strconv"
+	"sync"
+	"time"
+
+	"arraynetworks.com/array-ingress-controller/logger"
+	"github.com/go-resty/resty/v2"
+)
+
+// Client defines the interface for making HTTP requests.
+type Client interface {
+	Fetch(url string) error
+	Create(url string, payload interface{}) error
+	Delete(url string, payload interface{}) error
+	Patch(url string, payload interface{}) error
+	IsHealthy(url string) bool
+}
+
+// Configuration holds settings for the clients.
+type Configuration struct {
+	Username     string
+	Password     string
+	InsecureSkip bool
+	Timeout      time.Duration
+}
+
+// BaseClient implements Client and manages HTTP requests.
+type BaseClient struct {
+	client        *resty.Client
+	instType      string
+	authenticator Authenticator
+}
+
+type Authenticator struct {
+	Username string
+	Password string
+}
+
+var (
+	log  logger.Logger
+	once sync.Once
+)
+
+func init() {
+	log = logger.GetLogger()
+}
+
+// LoadConfig loads configuration from environment variables.
+func LoadConfig(prefix string) Configuration {
+	insecureSkip, err := strconv.ParseBool(os.Getenv(prefix + "_INSECURE_SKIP"))
+	if err != nil {
+		log.Fatalf("Invalid value for %s_INSECURE_SKIP: %v", prefix, err)
+	}
+	timeout, err := time.ParseDuration(os.Getenv(prefix + "_TIMEOUT"))
+	if err != nil {
+		log.Fatalf("Invalid value for %s_TIMEOUT: %v", prefix, err)
+	}
+	return Configuration{
+		Username:     os.Getenv(prefix + "_USERNAME"),
+		Password:     os.Getenv(prefix + "_PASSWORD"),
+		InsecureSkip: insecureSkip,
+		Timeout:      timeout,
+	}
+}
+
+// InitBaseClient initializes and returns a BaseClient instance.
+func InitBaseClient(instType string, config Configuration) *BaseClient {
+	client := resty.New()
+	client.SetTransport(&http.Transport{
+		TLSClientConfig:     &tls.Config{InsecureSkipVerify: config.InsecureSkip},
+		MaxIdleConns:        100,
+		MaxIdleConnsPerHost: 10,
+		IdleConnTimeout:     90 * time.Second,
+		DialContext:         (&net.Dialer{Timeout: 30 * time.Second, KeepAlive: 30 * time.Second}).DialContext,
+	})
+	client.SetTimeout(config.Timeout)
+
+	return &BaseClient{
+		client:   client,
+		instType: instType,
+		authenticator: Authenticator{
+			Username: config.Username,
+			Password: config.Password,
+		},
+	}
+}
+
+// requestSetup sets up the request with authentication.
+func (b *BaseClient) requestSetup() *resty.Request {
+	return b.client.R().SetBasicAuth(b.authenticator.Username, b.authenticator.Password)
+}
+
+// IsHealthy checks if the client is healthy.
+func (b *BaseClient) IsHealthy(url string) bool {
+	resp, err := b.requestSetup().Get(url)
+	return err == nil && resp.StatusCode() == http.StatusOK
+}
+
+// sendRequest is a generic HTTP request handler.
+func (b *BaseClient) sendRequest(method, url string, body interface{}) (*resty.Response, error) {
+	req := b.requestSetup()
+
+	if body != nil {
+		req.SetBody(body)
+	}
+
+	var resp *resty.Response
+	var err error
+
+	switch method {
+	case http.MethodGet:
+		resp, err = req.Get(url)
+	case http.MethodPost:
+		resp, err = req.Post(url)
+	case http.MethodDelete:
+		resp, err = req.Delete(url)
+	case http.MethodPatch:
+		resp, err = req.Patch(url)
+	default:
+		return nil, fmt.Errorf("unsupported method: %s", method)
+	}
+
+	if err != nil {
+		log.Errorf("%s request failed: %v", method, err)
+		return nil, fmt.Errorf("%s request to %s failed: %v", method, url, err)
+	}
+
+	if resp.StatusCode() >= http.StatusBadRequest {
+		log.Errorf("%s request to %s returned status %d: %s", method, url, resp.StatusCode(), resp.String())
+		return nil, fmt.Errorf("%s request to %s returned status %d: %s", method, url, resp.StatusCode(), resp.String())
+	}
+
+	return resp, nil
+}
+
+// Client methods implementing the interface.
+func (b *BaseClient) Fetch(annotationUrl string) (*resty.Response, error) {
+	url := b.constructUrl(b.instType, annotationUrl)
+	return b.sendRequest(http.MethodGet, url, nil)
+}
+
+func (b *BaseClient) Create(annotationUrl string, body interface{}) (*resty.Response, error) {
+	url := b.constructUrl(b.instType, annotationUrl)
+	return b.sendRequest(http.MethodPost, url, body)
+}
+
+func (b *BaseClient) Delete(annotationUrl string) (*resty.Response, error) {
+	url := b.constructUrl(b.instType, annotationUrl)
+	return b.sendRequest(http.MethodDelete, url, nil)
+}
+
+func (b *BaseClient) Update(annotationUrl string, body interface{}) (*resty.Response, error) {
+	url := b.constructUrl(b.instType, annotationUrl)
+	return b.sendRequest(http.MethodPatch, url, body)
+}
+
+// Dynamically constructs url for API calls based on the instance type fetched from the client
+// Uses Environment variables to set
+func (b *BaseClient) constructUrl(instType, annotationUrl string) string {
+	apvIP := os.Getenv("APV_IP")
+	asfIP := os.Getenv("ASF_IP")
+
+	baseURLs := map[string]string{
+		"APV": fmt.Sprintf("https://%s:9997/rest/apv/%%s", apvIP),
+		"ASF": fmt.Sprintf("https://%s:9997/rest/asf/%%s", asfIP),
+	}
+
+	baseURL, exists := baseURLs[instType]
+	if !exists {
+		log.Errorf("Unknown instance type: %s", instType)
+		return ""
+	}
+
+	return fmt.Sprintf(baseURL, annotationUrl)
+}
Index: /branches/main/array-ingress-controller/common/go.mod
===================================================================
--- /branches/main/array-ingress-controller/common/go.mod	(nonexistent)
+++ /branches/main/array-ingress-controller/common/go.mod	(working copy)
@@ -0,0 +1,5 @@
+module arraynetworks.com/array-ingress-controller/common
+
+go 1.23.6
+
+
Index: /branches/main/array-ingress-controller/go.mod
===================================================================
--- /branches/main/array-ingress-controller/go.mod	(revision 9)
+++ /branches/main/array-ingress-controller/go.mod	(working copy)
@@ -1,53 +1,120 @@
-module arraynetworks.com/array-ingress-controller
+module arraynetworks.com/array-ingress-controller/main
 
 go 1.23.6
 
+replace (
+	arraynetworks.com/array-ingress-controller/apvadapter => ./apvadapter
+	arraynetworks.com/array-ingress-controller/apvadapter/annotations/health => ./apvadapter/annotations/health
+	arraynetworks.com/array-ingress-controller/apvadapter/annotations/ratelimit => ./apvadapter/annotations/ratelimit
+	arraynetworks.com/array-ingress-controller/apvadapter/annotations/whitelisting => ./apvadapter/annotations/whitelisting
+	arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder => ./apvadapter/apvurlbuilder
+	arraynetworks.com/array-ingress-controller/apvadapter/realservice => ./apvadapter/realservice
+	arraynetworks.com/array-ingress-controller/apvclient => ./apvadapter/apvclient
+	arraynetworks.com/array-ingress-controller/common => ./common
+	arraynetworks.com/array-ingress-controller/configstore => ./configstore
+	arraynetworks.com/array-ingress-controller/controller => ./controller
+	arraynetworks.com/array-ingress-controller/controller/openshift => ./controller/openshift-controller
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/handlers => ./controller/openshift-controller/handlers
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/informers => ./controller/openshift-controller/informers
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/utils => ./controller/openshift-controller/utils
+	arraynetworks.com/array-ingress-controller/logger => ./logger
+	arraynetworks.com/array-ingress-controller/task-manager/openshift => ./task-manager/openshift
+	arraynetworks.com/array-ingress-controller/task-manager/task => ./task-manager/task
+	arraynetworks.com/array-ingress-controller/watchtower => ./watchtower
+)
+
 require (
-	github.com/golang/mock v1.6.0
-	github.com/onsi/ginkgo/v2 v2.22.2
-	github.com/onsi/gomega v1.36.2
-	github.com/openshift/api v0.0.0-20250220025300-cfbda0b31000 // indirect
-	go.uber.org/zap v1.27.0
-	gopkg.in/natefinch/lumberjack.v2 v2.2.1
-	gorm.io/driver/sqlite v1.5.7
-	gorm.io/gorm v1.25.12
-	k8s.io/api v0.32.2 // indirect
-	k8s.io/apimachinery v0.32.2 // indirect
-	k8s.io/klog/v2 v2.130.1 // indirect
+	arraynetworks.com/array-ingress-controller/apvadapter v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/controller/openshift v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/logger v0.0.0-00010101000000-000000000000
+	arraynetworks.com/array-ingress-controller/watchtower v0.0.0-00010101000000-000000000000
+	k8s.io/api v0.32.2
+	k8s.io/apimachinery v0.32.2
+	k8s.io/client-go v0.32.2
+	k8s.io/klog/v2 v2.130.1
+	sigs.k8s.io/controller-runtime v0.20.2
 )
 
 require (
+	arraynetworks.com/array-ingress-controller/apvadapter/apvurlbuilder v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/apvadapter/realservice v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/apvclient v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/common v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/configstore v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/handlers v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/informers v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/controller/openshift-controller/utils v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/task-manager/openshift v0.0.0-00010101000000-000000000000 // indirect
+	arraynetworks.com/array-ingress-controller/task-manager/task v0.0.0-00010101000000-000000000000 // indirect
+	filippo.io/edwards25519 v1.1.0 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+	github.com/evanphx/json-patch/v5 v5.9.11 // indirect
+	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
-	github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
+	github.com/go-openapi/jsonpointer v0.21.0 // indirect
+	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/swag v0.23.0 // indirect
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
+	github.com/go-sql-driver/mysql v1.8.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/google/btree v1.1.3 // indirect
+	github.com/google/gnostic-models v0.6.8 // indirect
 	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
+	github.com/google/uuid v1.6.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-sqlite3 v1.14.22 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/openshift/api v0.0.0-20250228110707-635291d6fdf1 // indirect
+	github.com/openshift/client-go v0.0.0-20250131180035-f7ec47e2d87a // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/prometheus/client_golang v1.19.1 // indirect
+	github.com/prometheus/client_model v0.6.1 // indirect
+	github.com/prometheus/common v0.55.0 // indirect
+	github.com/prometheus/procfs v0.15.1 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
-	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
 	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/oauth2 v0.23.0 // indirect
+	golang.org/x/sync v0.10.0 // indirect
 	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/term v0.27.0 // indirect
 	golang.org/x/text v0.21.0 // indirect
-	golang.org/x/tools v0.28.0 // indirect
+	golang.org/x/time v0.7.0 // indirect
+	gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
+	google.golang.org/protobuf v1.35.1 // indirect
+	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
+	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/datatypes v1.2.5 // indirect
+	gorm.io/driver/mysql v1.5.6 // indirect
+	gorm.io/driver/sqlite v1.5.7 // indirect
+	gorm.io/gorm v1.25.12 // indirect
+  k8s.io/apiextensions-apiserver v0.32.1 // indirect
+	k8s.io/api v0.32.2 // indirect
+	k8s.io/apimachinery v0.32.2 // indirect
+	k8s.io/client-go v0.32.2 // indirect
+	k8s.io/klog/v2 v2.130.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
 	sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
 	sigs.k8s.io/yaml v1.4.0 // indirect
 )
-
-require arraynetworks.com/array-ingress-controller/task-manager/task v0.0.0-00010101000000-000000000000
-
-replace (
-	arraynetworks.com/array-ingress-controller/apvadapter => ./apvadapter
-	arraynetworks.com/array-ingress-controller/controller/openshift-controller/ => ./controller/openshift-controller
-	arraynetworks.com/array-ingress-controller/task-manager/task => ./task-manager/task
-)
