mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
CNI plugins may set DNS configuration, but this isn't threaded through to the task configuration so that we can write it to the `/etc/resolv.conf` file as needed. Add the `AllocNetworkStatus` to the alloc hook resources so they're accessible from the taskrunner. Any DNS entries provided by the user will override these values. Fixes: https://github.com/hashicorp/nomad/issues/11102
90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package structs
|
|
|
|
import (
|
|
"sync"
|
|
|
|
consulapi "github.com/hashicorp/consul/api"
|
|
"github.com/hashicorp/nomad/client/pluginmanager/csimanager"
|
|
"github.com/hashicorp/nomad/helper"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
)
|
|
|
|
// AllocHookResources contains data that is provided by AllocRunner Hooks for
|
|
// consumption by TaskRunners. This should be instantiated once in the
|
|
// AllocRunner and then only accessed via getters and setters that hold the
|
|
// lock.
|
|
type AllocHookResources struct {
|
|
csiMounts map[string]*csimanager.MountInfo
|
|
consulTokens map[string]map[string]*consulapi.ACLToken // Consul cluster -> service identity -> token
|
|
networkStatus *structs.AllocNetworkStatus
|
|
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
func NewAllocHookResources() *AllocHookResources {
|
|
return &AllocHookResources{
|
|
csiMounts: map[string]*csimanager.MountInfo{},
|
|
consulTokens: map[string]map[string]*consulapi.ACLToken{},
|
|
}
|
|
}
|
|
|
|
// GetCSIMounts returns a copy of the CSI mount info previously written by the
|
|
// CSI allocrunner hook
|
|
func (a *AllocHookResources) GetCSIMounts() map[string]*csimanager.MountInfo {
|
|
a.mu.RLock()
|
|
defer a.mu.RUnlock()
|
|
|
|
return helper.DeepCopyMap(a.csiMounts)
|
|
}
|
|
|
|
// SetCSIMounts stores the CSI mount info for later use by the volume taskrunner
|
|
// hook
|
|
func (a *AllocHookResources) SetCSIMounts(m map[string]*csimanager.MountInfo) {
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
a.csiMounts = m
|
|
}
|
|
|
|
// GetConsulTokens returns all the Consul tokens previously written by the
|
|
// consul allocrunner hook
|
|
func (a *AllocHookResources) GetConsulTokens() map[string]map[string]*consulapi.ACLToken {
|
|
a.mu.RLock()
|
|
defer a.mu.RUnlock()
|
|
|
|
return a.consulTokens
|
|
}
|
|
|
|
// SetConsulTokens merges a given map of Consul cluster names to task
|
|
// identities to Consul tokens with previously written data. This method is
|
|
// called by the allocrunner consul hook.
|
|
func (a *AllocHookResources) SetConsulTokens(m map[string]map[string]*consulapi.ACLToken) {
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
for k, v := range m {
|
|
a.consulTokens[k] = v
|
|
}
|
|
}
|
|
|
|
// GetAllocNetworkStatus returns a copy of the AllocNetworkStatus previously
|
|
// written the group's network_hook
|
|
func (a *AllocHookResources) GetAllocNetworkStatus() *structs.AllocNetworkStatus {
|
|
a.mu.RLock()
|
|
defer a.mu.RUnlock()
|
|
|
|
return a.networkStatus.Copy()
|
|
}
|
|
|
|
// SetAllocNetworkStatus stores the AllocNetworkStatus for later use by the
|
|
// taskrunner's buildTaskConfig() method
|
|
func (a *AllocHookResources) SetAllocNetworkStatus(ans *structs.AllocNetworkStatus) {
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
a.networkStatus = ans
|
|
}
|