Skip to content

Commit

Permalink
nvsandboxutils: Add implementation for the APIs
Browse files Browse the repository at this point in the history
This change adds manual wrappers around the generated bindings to make
them into more user-friendly APIs for the caller. Some helper functions
are also added.
The APIs that are currently present in the library and implemented here
are:
nvSandboxUtilsInit
nvSandboxUtilsShutdown
nvSandboxUtilsGetDriverVersion
nvSandboxUtilsGetGpuResource
nvSandboxUtilsGetFileContent

Signed-off-by: Evan Lezar <[email protected]>
Signed-off-by: Huy Nguyen <[email protected]>
Signed-off-by: Sananya Majumder <[email protected]>
  • Loading branch information
sananya12 committed Aug 6, 2024
1 parent 5e96e93 commit 7a9071c
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 0 deletions.
38 changes: 38 additions & 0 deletions internal/nvsandboxutils/cgo_helpers_static.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
# Copyright 2024 NVIDIA CORPORATION
#
# 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 nvsandboxutils

var cgoAllocsUnknown = new(struct{})

func clen(n []byte) int {
for i := 0; i < len(n); i++ {
if n[i] == 0 {
return i
}
}
return len(n)
}

// Creates an int8 array of fixed input length to store the Go string.
// TODO: Add error check if input string has a length greater than INPUT_LENGTH
func convertStringToFixedArray(str string) [INPUT_LENGTH]int8 {
var output [INPUT_LENGTH]int8
for i, s := range str {
output[i] = int8(s)
}
return output
}
74 changes: 74 additions & 0 deletions internal/nvsandboxutils/gpu-resources.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/**
# Copyright 2024 NVIDIA CORPORATION
#
# 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 nvsandboxutils

import (
"strings"
)

import "C"

type GpuResource struct {
Version uint32
}

// type GpuFileInfo_v1 struct {
// Next *GpuFileInfo_v1
// FileType uint32
// FileSubType uint32
// Module uint32
// Flags uint32
// FilePath *int8
// }
type GpuFileInfo struct {
Path string
Type FileType
SubType FileSystemSubType
Module FileModule
Flags FileFlag
}

func (l *library) GetGpuResource(uuid string) ([]GpuFileInfo, Ret) {
deviceType := NV_GPU_INPUT_GPU_UUID
if strings.HasPrefix(uuid, "MIG-") {
deviceType = NV_GPU_INPUT_MIG_UUID
}

request := GpuRes{
Version: 1,
InputType: uint32(deviceType),
Input: convertStringToFixedArray(uuid),
}

ret := nvSandboxUtilsGetGpuResource(&request)
if ret != SUCCESS {
return nil, ret
}

var fileInfos []GpuFileInfo
for fileInfo := request.Files; fileInfo != nil; fileInfo = fileInfo.Next {
fi := GpuFileInfo{
Path: C.GoString((*C.char)(fileInfo.FilePath)),
Type: FileType(fileInfo.FileType),
SubType: FileSystemSubType(fileInfo.FileSubType),
Module: FileModule(fileInfo.Module),
Flags: FileFlag(fileInfo.Flags),
}
fileInfos = append(fileInfos, fi)
}
return fileInfos, SUCCESS
}
64 changes: 64 additions & 0 deletions internal/nvsandboxutils/impl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/**
# Copyright 2024 NVIDIA CORPORATION
#
# 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 nvsandboxutils

import "C"

func (l *library) Init(path string) Ret {
if err := l.load(); err != nil {
return ERROR_LIBRARY_LOAD
}

input := InitInput{
Version: 1,
Type: uint32(NV_ROOTFS_PATH),
Value: convertStringToFixedArray(path),
}

return nvSandboxUtilsInit(&input)
}

func (l *library) Shutdown() Ret {
ret := nvSandboxUtilsShutdown()
if ret != SUCCESS {
return ret
}

err := l.close()
if err != nil {
return ERROR_UNKNOWN
}

return ret
}

// TODO: Is this length specified in the header file?
const VERSION_LENGTH = 100

func (l *library) GetDriverVersion() (string, Ret) {
Version := make([]byte, VERSION_LENGTH)
ret := nvSandboxUtilsGetDriverVersion(&Version[0], VERSION_LENGTH)
return string(Version[:clen(Version)]), ret
}

func (l *library) GetFileContent(path string) (string, Ret) {
Content := make([]byte, MAX_FILE_PATH)
FilePath := []byte(path + string(byte(0)))
Size := uint32(MAX_FILE_PATH)
ret := nvSandboxUtilsGetFileContent(&FilePath[0], &Content[0], &Size)
return string(Content[:clen(Content)]), ret
}

0 comments on commit 7a9071c

Please sign in to comment.