github.com/ferranbt/nomad@v0.9.3-0.20190607002617-85c449b7667c/plugins/device/util.go (about)

     1  package device
     2  
     3  import (
     4  	"github.com/golang/protobuf/ptypes"
     5  	"github.com/hashicorp/nomad/plugins/device/proto"
     6  	"github.com/hashicorp/nomad/plugins/shared/structs"
     7  )
     8  
     9  // convertProtoDeviceGroups converts between a list of proto and structs DeviceGroup
    10  func convertProtoDeviceGroups(in []*proto.DeviceGroup) []*DeviceGroup {
    11  	if in == nil {
    12  		return nil
    13  	}
    14  
    15  	out := make([]*DeviceGroup, len(in))
    16  	for i, group := range in {
    17  		out[i] = convertProtoDeviceGroup(group)
    18  	}
    19  
    20  	return out
    21  }
    22  
    23  // convertProtoDeviceGroup converts between a proto and structs DeviceGroup
    24  func convertProtoDeviceGroup(in *proto.DeviceGroup) *DeviceGroup {
    25  	if in == nil {
    26  		return nil
    27  	}
    28  
    29  	return &DeviceGroup{
    30  		Vendor:     in.Vendor,
    31  		Type:       in.DeviceType,
    32  		Name:       in.DeviceName,
    33  		Devices:    convertProtoDevices(in.Devices),
    34  		Attributes: structs.ConvertProtoAttributeMap(in.Attributes),
    35  	}
    36  }
    37  
    38  // convertProtoDevices converts between a list of proto and structs Device
    39  func convertProtoDevices(in []*proto.DetectedDevice) []*Device {
    40  	if in == nil {
    41  		return nil
    42  	}
    43  
    44  	out := make([]*Device, len(in))
    45  	for i, d := range in {
    46  		out[i] = convertProtoDevice(d)
    47  	}
    48  
    49  	return out
    50  }
    51  
    52  // convertProtoDevice converts between a proto and structs Device
    53  func convertProtoDevice(in *proto.DetectedDevice) *Device {
    54  	if in == nil {
    55  		return nil
    56  	}
    57  
    58  	return &Device{
    59  		ID:         in.ID,
    60  		Healthy:    in.Healthy,
    61  		HealthDesc: in.HealthDescription,
    62  		HwLocality: convertProtoDeviceLocality(in.HwLocality),
    63  	}
    64  }
    65  
    66  // convertProtoDeviceLocality converts between a proto and structs DeviceLocality
    67  func convertProtoDeviceLocality(in *proto.DeviceLocality) *DeviceLocality {
    68  	if in == nil {
    69  		return nil
    70  	}
    71  
    72  	return &DeviceLocality{
    73  		PciBusID: in.PciBusId,
    74  	}
    75  }
    76  
    77  // convertProtoContainerReservation is used to convert between a proto and struct
    78  // ContainerReservation
    79  func convertProtoContainerReservation(in *proto.ContainerReservation) *ContainerReservation {
    80  	if in == nil {
    81  		return nil
    82  	}
    83  
    84  	return &ContainerReservation{
    85  		Envs:    in.Envs,
    86  		Mounts:  convertProtoMounts(in.Mounts),
    87  		Devices: convertProtoDeviceSpecs(in.Devices),
    88  	}
    89  }
    90  
    91  // convertProtoMount converts between a list of proto and structs Mount
    92  func convertProtoMounts(in []*proto.Mount) []*Mount {
    93  	if in == nil {
    94  		return nil
    95  	}
    96  
    97  	out := make([]*Mount, len(in))
    98  	for i, d := range in {
    99  		out[i] = convertProtoMount(d)
   100  	}
   101  
   102  	return out
   103  }
   104  
   105  // convertProtoMount converts between a proto and structs Mount
   106  func convertProtoMount(in *proto.Mount) *Mount {
   107  	if in == nil {
   108  		return nil
   109  	}
   110  
   111  	return &Mount{
   112  		TaskPath: in.TaskPath,
   113  		HostPath: in.HostPath,
   114  		ReadOnly: in.ReadOnly,
   115  	}
   116  }
   117  
   118  // convertProtoDeviceSpecs converts between a list of proto and structs DeviceSpecs
   119  func convertProtoDeviceSpecs(in []*proto.DeviceSpec) []*DeviceSpec {
   120  	if in == nil {
   121  		return nil
   122  	}
   123  
   124  	out := make([]*DeviceSpec, len(in))
   125  	for i, d := range in {
   126  		out[i] = convertProtoDeviceSpec(d)
   127  	}
   128  
   129  	return out
   130  }
   131  
   132  // convertProtoDeviceSpec converts between a proto and structs DeviceSpec
   133  func convertProtoDeviceSpec(in *proto.DeviceSpec) *DeviceSpec {
   134  	if in == nil {
   135  		return nil
   136  	}
   137  
   138  	return &DeviceSpec{
   139  		TaskPath:    in.TaskPath,
   140  		HostPath:    in.HostPath,
   141  		CgroupPerms: in.Permissions,
   142  	}
   143  }
   144  
   145  // convertStructDeviceGroup converts between a list of struct and proto DeviceGroup
   146  func convertStructDeviceGroups(in []*DeviceGroup) []*proto.DeviceGroup {
   147  	if in == nil {
   148  		return nil
   149  	}
   150  
   151  	out := make([]*proto.DeviceGroup, len(in))
   152  	for i, g := range in {
   153  		out[i] = convertStructDeviceGroup(g)
   154  	}
   155  
   156  	return out
   157  }
   158  
   159  // convertStructDeviceGroup converts between a struct and proto DeviceGroup
   160  func convertStructDeviceGroup(in *DeviceGroup) *proto.DeviceGroup {
   161  	if in == nil {
   162  		return nil
   163  	}
   164  
   165  	return &proto.DeviceGroup{
   166  		Vendor:     in.Vendor,
   167  		DeviceType: in.Type,
   168  		DeviceName: in.Name,
   169  		Devices:    convertStructDevices(in.Devices),
   170  		Attributes: structs.ConvertStructAttributeMap(in.Attributes),
   171  	}
   172  }
   173  
   174  // convertStructDevices converts between a list of struct and proto Device
   175  func convertStructDevices(in []*Device) []*proto.DetectedDevice {
   176  	if in == nil {
   177  		return nil
   178  	}
   179  
   180  	out := make([]*proto.DetectedDevice, len(in))
   181  	for i, d := range in {
   182  		out[i] = convertStructDevice(d)
   183  	}
   184  
   185  	return out
   186  }
   187  
   188  // convertStructDevice converts between a struct and proto Device
   189  func convertStructDevice(in *Device) *proto.DetectedDevice {
   190  	if in == nil {
   191  		return nil
   192  	}
   193  
   194  	return &proto.DetectedDevice{
   195  		ID:                in.ID,
   196  		Healthy:           in.Healthy,
   197  		HealthDescription: in.HealthDesc,
   198  		HwLocality:        convertStructDeviceLocality(in.HwLocality),
   199  	}
   200  }
   201  
   202  // convertStructDeviceLocality converts between a struct and proto DeviceLocality
   203  func convertStructDeviceLocality(in *DeviceLocality) *proto.DeviceLocality {
   204  	if in == nil {
   205  		return nil
   206  	}
   207  
   208  	return &proto.DeviceLocality{
   209  		PciBusId: in.PciBusID,
   210  	}
   211  }
   212  
   213  // convertStructContainerReservation is used to convert between a struct and
   214  // proto ContainerReservation
   215  func convertStructContainerReservation(in *ContainerReservation) *proto.ContainerReservation {
   216  	if in == nil {
   217  		return nil
   218  	}
   219  
   220  	return &proto.ContainerReservation{
   221  		Envs:    in.Envs,
   222  		Mounts:  convertStructMounts(in.Mounts),
   223  		Devices: convertStructDeviceSpecs(in.Devices),
   224  	}
   225  }
   226  
   227  // convertStructMount converts between a list of structs and proto Mount
   228  func convertStructMounts(in []*Mount) []*proto.Mount {
   229  	if in == nil {
   230  		return nil
   231  	}
   232  
   233  	out := make([]*proto.Mount, len(in))
   234  	for i, m := range in {
   235  		out[i] = convertStructMount(m)
   236  	}
   237  
   238  	return out
   239  }
   240  
   241  // convertStructMount converts between a struct and proto Mount
   242  func convertStructMount(in *Mount) *proto.Mount {
   243  	if in == nil {
   244  		return nil
   245  	}
   246  
   247  	return &proto.Mount{
   248  		TaskPath: in.TaskPath,
   249  		HostPath: in.HostPath,
   250  		ReadOnly: in.ReadOnly,
   251  	}
   252  }
   253  
   254  // convertStructDeviceSpecs converts between a list of struct and proto DeviceSpecs
   255  func convertStructDeviceSpecs(in []*DeviceSpec) []*proto.DeviceSpec {
   256  	if in == nil {
   257  		return nil
   258  	}
   259  
   260  	out := make([]*proto.DeviceSpec, len(in))
   261  	for i, d := range in {
   262  		out[i] = convertStructDeviceSpec(d)
   263  	}
   264  
   265  	return out
   266  }
   267  
   268  // convertStructDeviceSpec converts between a struct and proto DeviceSpec
   269  func convertStructDeviceSpec(in *DeviceSpec) *proto.DeviceSpec {
   270  	if in == nil {
   271  		return nil
   272  	}
   273  
   274  	return &proto.DeviceSpec{
   275  		TaskPath:    in.TaskPath,
   276  		HostPath:    in.HostPath,
   277  		Permissions: in.CgroupPerms,
   278  	}
   279  }
   280  
   281  // convertProtoDeviceGroupsStats converts between a list of struct and proto
   282  // DeviceGroupStats
   283  func convertProtoDeviceGroupsStats(in []*proto.DeviceGroupStats) []*DeviceGroupStats {
   284  	if in == nil {
   285  		return nil
   286  	}
   287  
   288  	out := make([]*DeviceGroupStats, len(in))
   289  	for i, m := range in {
   290  		out[i] = convertProtoDeviceGroupStats(m)
   291  	}
   292  
   293  	return out
   294  }
   295  
   296  // convertProtoDeviceGroupStats converts between a proto and struct
   297  // DeviceGroupStats
   298  func convertProtoDeviceGroupStats(in *proto.DeviceGroupStats) *DeviceGroupStats {
   299  	if in == nil {
   300  		return nil
   301  	}
   302  
   303  	out := &DeviceGroupStats{
   304  		Vendor:        in.Vendor,
   305  		Type:          in.Type,
   306  		Name:          in.Name,
   307  		InstanceStats: make(map[string]*DeviceStats, len(in.InstanceStats)),
   308  	}
   309  
   310  	for k, v := range in.InstanceStats {
   311  		out.InstanceStats[k] = convertProtoDeviceStats(v)
   312  	}
   313  
   314  	return out
   315  }
   316  
   317  // convertProtoDeviceStats converts between a proto and struct DeviceStats
   318  func convertProtoDeviceStats(in *proto.DeviceStats) *DeviceStats {
   319  	if in == nil {
   320  		return nil
   321  	}
   322  
   323  	ts, err := ptypes.Timestamp(in.Timestamp)
   324  	if err != nil {
   325  		return nil
   326  	}
   327  
   328  	return &DeviceStats{
   329  		Summary:   structs.ConvertProtoStatValue(in.Summary),
   330  		Stats:     structs.ConvertProtoStatObject(in.Stats),
   331  		Timestamp: ts,
   332  	}
   333  }
   334  
   335  // convertStructDeviceGroupsStats converts between a list of struct and proto
   336  // DeviceGroupStats
   337  func convertStructDeviceGroupsStats(in []*DeviceGroupStats) []*proto.DeviceGroupStats {
   338  	if in == nil {
   339  		return nil
   340  	}
   341  
   342  	out := make([]*proto.DeviceGroupStats, len(in))
   343  	for i, m := range in {
   344  		out[i] = convertStructDeviceGroupStats(m)
   345  	}
   346  
   347  	return out
   348  }
   349  
   350  // convertStructDeviceGroupStats converts between a struct and proto
   351  // DeviceGroupStats
   352  func convertStructDeviceGroupStats(in *DeviceGroupStats) *proto.DeviceGroupStats {
   353  	if in == nil {
   354  		return nil
   355  	}
   356  
   357  	out := &proto.DeviceGroupStats{
   358  		Vendor:        in.Vendor,
   359  		Type:          in.Type,
   360  		Name:          in.Name,
   361  		InstanceStats: make(map[string]*proto.DeviceStats, len(in.InstanceStats)),
   362  	}
   363  
   364  	for k, v := range in.InstanceStats {
   365  		out.InstanceStats[k] = convertStructDeviceStats(v)
   366  	}
   367  
   368  	return out
   369  }
   370  
   371  // convertStructDeviceStats converts between a struct and proto DeviceStats
   372  func convertStructDeviceStats(in *DeviceStats) *proto.DeviceStats {
   373  	if in == nil {
   374  		return nil
   375  	}
   376  
   377  	ts, err := ptypes.TimestampProto(in.Timestamp)
   378  	if err != nil {
   379  		return nil
   380  	}
   381  
   382  	return &proto.DeviceStats{
   383  		Summary:   structs.ConvertStructStatValue(in.Summary),
   384  		Stats:     structs.ConvertStructStatObject(in.Stats),
   385  		Timestamp: ts,
   386  	}
   387  }