@@ -34,6 +34,66 @@ func (e SchemaNotAvailable) Error() string {
3434 return fmt .Sprintf ("embedded schema not available for %s" , e .Addr )
3535}
3636
37+ type BundledProvider struct {
38+ Addr tfaddr.Provider
39+ Version * version.Version
40+ }
41+
42+ // ListBundledProviders returns a list of all bundled providers to the binary on the `data` folder.
43+ func ListBundledProviders (filesystem fs.ReadDirFS ) ([]BundledProvider , error ) {
44+ var providers []BundledProvider
45+
46+ // We only bundle the latest version of each provider, so we expect exactly one
47+ // version directory per provider. If there are more than one, that's an error
48+ // If there are zero, then that provider is not bundled and we skip it.
49+ hostname := tfaddr .DefaultProviderRegistryHost
50+ namespacePath := path .Join ("data" , hostname .String ())
51+ namespaces , err := fs .ReadDir (filesystem , namespacePath )
52+ if err != nil {
53+ return nil , err
54+ }
55+
56+ for _ , namespace := range namespaces {
57+ if ! namespace .IsDir () {
58+ continue
59+ }
60+
61+ typePath := path .Join (namespacePath , namespace .Name ())
62+ types , err := fs .ReadDir (filesystem , typePath )
63+ if err != nil {
64+ return nil , err
65+ }
66+
67+ for _ , providerType := range types {
68+ if ! providerType .IsDir () {
69+ continue
70+ }
71+
72+ versionPath := path .Join (typePath , providerType .Name ())
73+ entries , err := fs .ReadDir (filesystem , versionPath )
74+ if err != nil {
75+ return nil , err
76+ }
77+
78+ if len (entries ) != 1 {
79+ return nil , fmt .Errorf ("%s/%s: expected one version, found %d" , namespace .Name (), providerType .Name (), len (entries ))
80+ }
81+
82+ v , err := version .NewVersion (entries [0 ].Name ())
83+ if err != nil {
84+ return nil , err
85+ }
86+
87+ providers = append (providers , BundledProvider {
88+ Addr : tfaddr .NewProvider (hostname , namespace .Name (), providerType .Name ()),
89+ Version : v ,
90+ })
91+ }
92+ }
93+
94+ return providers , nil
95+ }
96+
3797func FindProviderSchemaFile (filesystem fs.ReadDirFS , pAddr tfaddr.Provider ) (* ProviderSchema , error ) {
3898 providerPath := path .Join ("data" , pAddr .Hostname .String (), pAddr .Namespace , pAddr .Type )
3999
0 commit comments