mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
* Add templates
* Move API structs to codersdk
* Back to green tests!
* It all works, but now with tea! 🧋
* It works!
* Add cancellation to provisionerd
* Tests pass!
* Add deletion of workspaces and projects
* Fix agent lock
* Add clog
* Fix linting errors
* Remove unused CLI tests
* Rename daemon to start
* Fix leaking command
* Fix promptui test
* Update agent connection frequency
* Skip login tests on Windows
* Increase tunnel connect timeout
* Fix templater
* Lower test requirements
* Fix embed
* Disable promptui tests for Windows
* Fix write newline
* Fix PTY write newline
* Fix CloseReader
* Fix compilation on Windows
* Fix linting error
* Remove bubbletea
* Cleanup readwriter
* Use embedded templates instead of serving over API
* Move templates to examples
* Improve workspace create flow
* Fix Windows build
* Fix tests
* Fix linting errors
* Fix untar with extracting max size
* Fix newline char
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
package provisionersdk
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/coder/coder/provisionersdk/proto"
|
|
)
|
|
|
|
// ResourceAddresses returns an index-matching slice of unique addresses
|
|
// to access resources.
|
|
func ResourceAddresses(resources []*proto.Resource) ([]string, error) {
|
|
resourcesByHost := map[string]*proto.Resource{}
|
|
for _, resource := range resources {
|
|
otherByName, exists := resourcesByHost[resource.Name]
|
|
if !exists {
|
|
resourcesByHost[resource.Name] = resource
|
|
continue
|
|
}
|
|
// If we have conflicting names, to reduce confusion we prepend the types.
|
|
delete(resourcesByHost, otherByName.Name)
|
|
otherAddress := fmt.Sprintf("%s.%s", otherByName.Type, otherByName.Name)
|
|
resourcesByHost[otherAddress] = otherByName
|
|
address := fmt.Sprintf("%s.%s", resource.Type, resource.Name)
|
|
_, exists = resourcesByHost[address]
|
|
if !exists {
|
|
resourcesByHost[address] = resource
|
|
continue
|
|
}
|
|
return nil, xerrors.Errorf("found resource with conflicting address %q", otherAddress)
|
|
}
|
|
|
|
addresses := make([]string, 0, len(resources))
|
|
for _, resource := range resources {
|
|
found := false
|
|
for host, other := range resourcesByHost {
|
|
if resource != other {
|
|
continue
|
|
}
|
|
found = true
|
|
addresses = append(addresses, host)
|
|
}
|
|
if !found {
|
|
panic(fmt.Sprintf("dev error: resource %s.%s wasn't given an address", resource.Type, resource.Name))
|
|
}
|
|
}
|
|
return addresses, nil
|
|
}
|