diff --git a/cmd/fpga_plugin/fpga_plugin.go b/cmd/fpga_plugin/fpga_plugin.go index 523ba9d9..687bd076 100644 --- a/cmd/fpga_plugin/fpga_plugin.go +++ b/cmd/fpga_plugin/fpga_plugin.go @@ -40,6 +40,7 @@ const ( // Device plugin settings. pluginEndpointPrefix = "intel-fpga" resourceNamePrefix = "intel.com/fpga" + annotationName = "com.intel.fpga.mode" ) // deviceManager manages Intel FPGA devices. @@ -47,14 +48,16 @@ type deviceManager struct { srv deviceplugin.Server fpgaID string name string + mode string ch chan map[string]deviceplugin.DeviceInfo devices map[string]deviceplugin.DeviceInfo } -func newDeviceManager(resourceName string, fpgaID string, ch chan map[string]deviceplugin.DeviceInfo) *deviceManager { +func newDeviceManager(resourceName string, fpgaID string, mode string, ch chan map[string]deviceplugin.DeviceInfo) *deviceManager { return &deviceManager{ fpgaID: fpgaID, name: resourceName, + mode: mode, ch: ch, devices: make(map[string]deviceplugin.DeviceInfo), } @@ -86,7 +89,16 @@ func (dm *deviceManager) ListAndWatch(empty *pluginapi.Empty, stream pluginapi.D } func (dm *deviceManager) Allocate(ctx context.Context, rqt *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) { - return deviceplugin.MakeAllocateResponse(rqt, dm.devices) + response, err := deviceplugin.MakeAllocateResponse(rqt, dm.devices) + // Set container annotations when programming is allowed + if dm.mode == devicecache.RegionMode { + for _, containerResponse := range response.GetContainerResponses() { + containerResponse.Annotations = map[string]string{ + annotationName: fmt.Sprintf("%s-%s", resourceNamePrefix, dm.mode), + } + } + } + return response, err } func (dm *deviceManager) PreStartContainer(ctx context.Context, rqt *pluginapi.PreStartContainerRequest) (*pluginapi.PreStartContainerResponse, error) { @@ -101,13 +113,13 @@ func startDeviceManager(dm *deviceManager, pluginPrefix string) { } } -func handleUpdate(dms map[string]*deviceManager, updateInfo devicecache.UpdateInfo, start func(*deviceManager, string)) { +func handleUpdate(dms map[string]*deviceManager, updateInfo devicecache.UpdateInfo, start func(*deviceManager, string), mode string) { glog.V(2).Info("Received dev updates: ", updateInfo) for fpgaID, devices := range updateInfo.Added { devCh := make(chan map[string]deviceplugin.DeviceInfo, 1) resourceName := resourceNamePrefix + "-" + fpgaID pPrefix := pluginEndpointPrefix + "-" + fpgaID - dms[fpgaID] = newDeviceManager(resourceName, fpgaID, devCh) + dms[fpgaID] = newDeviceManager(resourceName, fpgaID, mode, devCh) go start(dms[fpgaID], pPrefix) devCh <- devices } @@ -180,6 +192,6 @@ func main() { dms := make(map[string]*deviceManager) for updateInfo := range updatesCh { - handleUpdate(dms, updateInfo, startDeviceManager) + handleUpdate(dms, updateInfo, startDeviceManager, mode) } } diff --git a/cmd/fpga_plugin/fpga_plugin_test.go b/cmd/fpga_plugin/fpga_plugin_test.go index 9e9e8cd9..fc1120a0 100644 --- a/cmd/fpga_plugin/fpga_plugin_test.go +++ b/cmd/fpga_plugin/fpga_plugin_test.go @@ -114,7 +114,7 @@ func TestListAndWatch(t *testing.T) { for _, tt := range tcases { devCh := make(chan map[string]deviceplugin.DeviceInfo, len(tt.updates)) - testDM := newDeviceManager("intel.com/fpgatest-fpgaID", "fpgaID", devCh) + testDM := newDeviceManager("intel.com/fpgatest-fpgaID", "fpgaID", devicecache.AfMode, devCh) server := &listAndWatchServerStub{ testDM: testDM, @@ -139,7 +139,7 @@ func TestListAndWatch(t *testing.T) { } func TestAllocate(t *testing.T) { - testDM := newDeviceManager("", "", nil) + testDM := newDeviceManager("", "", devicecache.RegionMode, nil) if testDM == nil { t.Fatal("Failed to create a deviceManager") } @@ -164,6 +164,20 @@ func TestAllocate(t *testing.T) { if len(resp.ContainerResponses[0].Devices) != 1 { t.Fatal("Allocated wrong number of devices") } + + if len(resp.ContainerResponses[0].Annotations) != 1 { + t.Fatal("Set wrong number of annotations") + } + + annotation, ok := resp.ContainerResponses[0].Annotations[annotationName] + if ok == false { + t.Fatalf("%s annotation is not set", annotationName) + } + + expectedAnnotationValue := fmt.Sprintf("%s-%s", resourceNamePrefix, devicecache.RegionMode) + if annotation != expectedAnnotationValue { + t.Fatalf("Set wrong %s annotation value %s, should be %s", resourceNamePrefix, annotation, expectedAnnotationValue) + } } func startDeviceManagerStub(dm *deviceManager, pluginPrefix string) { @@ -238,7 +252,7 @@ func TestHandleUpdate(t *testing.T) { if tt.dms == nil { tt.dms = make(map[string]*deviceManager) } - handleUpdate(tt.dms, tt.updateInfo, startDeviceManagerStub) + handleUpdate(tt.dms, tt.updateInfo, startDeviceManagerStub, devicecache.AfMode) if len(tt.dms) != tt.expectedDMs { t.Errorf("Test case '%s': expected %d runnig device managers, but got %d", tt.name, tt.expectedDMs, len(tt.dms))