From d23f460ad372e25c9fc63121b2fce0e3be5e1456 Mon Sep 17 00:00:00 2001 From: Kevin Klues Date: Thu, 11 Aug 2022 13:27:57 +0000 Subject: [PATCH] Move the nvinfo package into pkg/nvlib/info Also build an interface around the API so that it can more easily be mocked. Signed-off-by: Kevin Klues --- pkg/{nvinfo => nvlib/info}/info.go | 25 ++++++++++++++----- pkg/nvlib/info/options.go | 39 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) rename pkg/{nvinfo => nvlib/info}/info.go (76%) create mode 100644 pkg/nvlib/info/options.go diff --git a/pkg/nvinfo/info.go b/pkg/nvlib/info/info.go similarity index 76% rename from pkg/nvinfo/info.go rename to pkg/nvlib/info/info.go index e7319bb..a901d54 100644 --- a/pkg/nvinfo/info.go +++ b/pkg/nvlib/info/info.go @@ -14,18 +14,31 @@ # limitations under the License. **/ -package nvinfo +package info import ( "fmt" "os" + "path/filepath" "strings" "github.com/NVIDIA/go-nvml/pkg/dl" ) -// HasNVML returns true if NVML is detected on the system -func HasNVML() (bool, string) { +// Interface provides the API to the info package +type Interface interface { + HasNvml() (bool, string) + IsTegraSystem() (bool, string) +} + +type infolib struct { + root string +} + +var _ Interface = &infolib{} + +// HasNvml returns true if NVML is detected on the system +func (i *infolib) HasNvml() (bool, string) { const ( nvmlLibraryName = "libnvidia-ml.so.1" nvmlLibraryLoadFlags = dl.RTLD_LAZY @@ -40,9 +53,9 @@ func HasNVML() (bool, string) { } // IsTegraSystem returns true if the system is detected as a Tegra-based system -func IsTegraSystem() (bool, string) { - const tegraReleaseFile = "/etc/nv_tegra_release" - const tegraFamilyFile = "/sys/devices/soc0/family" +func (i *infolib) IsTegraSystem() (bool, string) { + tegraReleaseFile := filepath.Join(i.root, "/etc/nv_tegra_release") + tegraFamilyFile := filepath.Join(i.root, "/sys/devices/soc0/family") if info, err := os.Stat(tegraReleaseFile); err == nil && !info.IsDir() { return true, fmt.Sprintf("%v found", tegraReleaseFile) diff --git a/pkg/nvlib/info/options.go b/pkg/nvlib/info/options.go new file mode 100644 index 0000000..314efa6 --- /dev/null +++ b/pkg/nvlib/info/options.go @@ -0,0 +1,39 @@ +/** +# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. +# +# 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 info + +// Option defines a function for passing options to the New() call +type Option func(*infolib) + +// New creates a new instance of the 'info' interface +func New(opts ...Option) Interface { + i := &infolib{} + for _, opt := range opts { + opt(i) + } + if i.root == "" { + i.root = "/" + } + return i +} + +// WithRoot provides a Option to set the root of the 'info' interface +func WithRoot(root string) Option { + return func(i *infolib) { + i.root = root + } +}