Skip to content

Commit

Permalink
Merge pull request #28 from Mmduh-483/config-periodic-interval
Browse files Browse the repository at this point in the history
Add config field for periodic update interval
  • Loading branch information
adrianchiris authored Nov 24, 2020
2 parents e71dd54 + 5aa3f43 commit f32fb45
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 17 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ The plugin has several configuration fields, this section explains each field us

```json
{
"periodicUpdateInterval": 300,
"configList": [{
"resourceName": "hca_shared_devices_a",
"rdmaHcaMax": 1000,
Expand All @@ -97,6 +98,11 @@ The plugin has several configuration fields, this section explains each field us
}
```

`periodicUpdateInterval` is the time interval in seconds to update the resources according to host devices in case of changes.
Notes:
- if `periodicUpdateInterval` is 0 then periodic update for host devices will be disabled.
- if `periodicUpdateInterval` is not set then default periodic update interval of 60 seconds will be used.

`"configList"` should contain a list of config objects. Each config object may consist of following fields:


Expand Down
6 changes: 1 addition & 5 deletions cmd/k8s-rdma-shared-dp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"log"
"os"
"syscall"
"time"

"github.com/Mellanox/k8s-rdma-shared-dev-plugin/pkg/resources"
)
Expand All @@ -17,9 +16,6 @@ var (
date = "unknown date"
)

// Periodic Update interval
const periodicUpdateInterval = 60 * time.Second

func printVersionString() string {
return fmt.Sprintf("k8s-rdma-shared-dev-plugin version:%s, commit:%s, date:%s", version, commit, date)
}
Expand All @@ -40,7 +36,7 @@ func main() {

log.Println("Starting K8s RDMA Shared Device Plugin version=", version)

rm := resources.NewResourceManager(periodicUpdateInterval)
rm := resources.NewResourceManager()

log.Println("resource manager reading configs")
if err := rm.ReadConfig(); err != nil {
Expand Down
1 change: 1 addition & 0 deletions images/k8s-rdma-shared-dev-plugin-config-map.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ metadata:
data:
config.json: |
{
"periodicUpdateInterval": 300,
"configList": [{
"resourceName": "hca_shared_devices_a",
"rdmaHcaMax": 1000,
Expand Down
37 changes: 29 additions & 8 deletions pkg/resources/resources_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ const (
netClass = 0x02 // Device class - Network controller
maxVendorNameLength = 20
maxProductNameLength = 40

// Default periodic update interval
defaultPeriodicUpdateInterval = 60 * time.Second
)

var (
Expand All @@ -47,21 +50,20 @@ type resourceManager struct {
PeriodicUpdateInterval time.Duration
}

func NewResourceManager(periodicUpdateInterval time.Duration) types.ResourceManager {
func NewResourceManager() types.ResourceManager {
watcherMode := detectPluginWatchMode(activeSockDir)
if watcherMode {
fmt.Println("Using Kubelet Plugin Registry Mode")
} else {
fmt.Println("Using Deprecated Devie Plugin Registry Path")
}
return &resourceManager{
configFile: configFilePath,
resourcePrefix: rdmaHcaResourcePrefix,
socketSuffix: socketSuffix,
watchMode: watcherMode,
netlinkManager: &netlinkManager{},
rds: NewRdmaDeviceSpec(requiredRdmaDevices),
PeriodicUpdateInterval: periodicUpdateInterval,
configFile: configFilePath,
resourcePrefix: rdmaHcaResourcePrefix,
socketSuffix: socketSuffix,
watchMode: watcherMode,
netlinkManager: &netlinkManager{},
rds: NewRdmaDeviceSpec(requiredRdmaDevices),
}
}

Expand All @@ -79,6 +81,21 @@ func (rm *resourceManager) ReadConfig() error {
}

log.Printf("loaded config: %+v \n", config.ConfigList)

// if periodic update is not set then use the default value
if config.PeriodicUpdateInterval == nil {
log.Println("no periodic update interval is set, use default interval 60 seconds")
rm.PeriodicUpdateInterval = defaultPeriodicUpdateInterval
} else {
PeriodicUpdateInterval := *config.PeriodicUpdateInterval
if PeriodicUpdateInterval == 0 {
log.Println("warning: periodic update interval is 0, no periodic update will run")
} else {
log.Printf("periodic update interval: %+d \n", PeriodicUpdateInterval)
}
rm.PeriodicUpdateInterval = time.Duration(PeriodicUpdateInterval) * time.Second
}

for i := range config.ConfigList {
rm.configList = append(rm.configList, &config.ConfigList[i])
}
Expand All @@ -89,6 +106,10 @@ func (rm *resourceManager) ReadConfig() error {
func (rm *resourceManager) ValidateConfigs() error {
resourceName := make(map[string]string)

if rm.PeriodicUpdateInterval < 0 {
return fmt.Errorf("invalid \"periodicUpdateInterval\" configuration \"%d\"", rm.PeriodicUpdateInterval)
}

if len(rm.configList) < 1 {
return fmt.Errorf("no resources configuration found")
}
Expand Down
46 changes: 43 additions & 3 deletions pkg/resources/resources_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ var _ = Describe("ResourcesManger", func() {
activeSockDir = activeSockDirBackUP
}()

obj := NewResourceManager(1 * time.Millisecond)
obj := NewResourceManager()
rm := obj.(*resourceManager)
Expect(rm.watchMode).To(Equal(true))
})
Expand All @@ -58,13 +58,46 @@ var _ = Describe("ResourcesManger", func() {
activeSockDir = activeSockDirBackUP
}()

obj := NewResourceManager(1 * time.Microsecond)
obj := NewResourceManager()
rm := obj.(*resourceManager)
Expect(rm.watchMode).To(Equal(false))
})
})
Context("ReadConfig", func() {
It("Read valid config file", func() {
It("Read valid config file with non default periodic update", func() {
configData := `{"configList": [{
"resourceName": "hca_shared_devices_a",
"rdmaHcaMax": 1000,
"devices": ["ib0", "ib1"]
},
{
"resourceName": "hca_shared_devices_b",
"rdmaHcaMax": 500,
"selectors": {"vendors": ["15b3"],
"deviceIDs": ["1017"],
"ifNames": ["ib2", "ib3"]}
}
],
"periodicUpdateInterval": 30}`
fs := &utils.FakeFilesystem{
Dirs: []string{"tmp"},
Files: map[string][]byte{
"tmp/config.json": []byte(configData),
},
}
defer fs.Use()()

rm := &resourceManager{configFile: fs.RootDir + "/tmp/config.json"}
err := rm.ReadConfig()
Expect(err).ToNot(HaveOccurred())
Expect(len(rm.configList)).To(Equal(2))
Expect(len(rm.configList[0].Devices)).To(Equal(2))
Expect(len(rm.configList[1].Selectors.Vendors)).To(Equal(1))
Expect(len(rm.configList[1].Selectors.DeviceIDs)).To(Equal(1))
Expect(len(rm.configList[1].Selectors.IfNames)).To(Equal(2))
Expect(rm.PeriodicUpdateInterval).To(Equal(30 * time.Second))
})
It("Read valid config file with default periodic update", func() {
configData := `{"configList": [{
"resourceName": "hca_shared_devices_a",
"rdmaHcaMax": 1000,
Expand Down Expand Up @@ -94,6 +127,7 @@ var _ = Describe("ResourcesManger", func() {
Expect(len(rm.configList[1].Selectors.Vendors)).To(Equal(1))
Expect(len(rm.configList[1].Selectors.DeviceIDs)).To(Equal(1))
Expect(len(rm.configList[1].Selectors.IfNames)).To(Equal(2))
Expect(rm.PeriodicUpdateInterval).To(Equal(60 * time.Second))
})
It("non existing config file", func() {

Expand Down Expand Up @@ -245,6 +279,12 @@ var _ = Describe("ResourcesManger", func() {
err := rm.ValidateConfigs()
Expect(err).To(HaveOccurred())
})
It("configuration with invalid \"periodicUpdateInterval\"", func() {
rm := &resourceManager{PeriodicUpdateInterval: -10}
err := rm.ValidateConfigs()
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("invalid \"periodicUpdateInterval\" configuration \"-10\""))
})
})
Context("GetDevices", func() {
It("Get full list of devices", func() {
Expand Down
3 changes: 2 additions & 1 deletion pkg/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ type UserConfig struct {

// UserConfigList config list for servers
type UserConfigList struct {
ConfigList []UserConfig `json:"configList"`
PeriodicUpdateInterval *int `json:"periodicUpdateInterval"`
ConfigList []UserConfig `json:"configList"`
}

// ResourceServer is gRPC server implements K8s device plugin api
Expand Down

0 comments on commit f32fb45

Please sign in to comment.