| package schema |
| |
| import ( |
| "fmt" |
| ) |
| |
| // DataSourceResourceShim takes a Resource instance describing a data source |
| // (with a Read implementation and a Schema, at least) and returns a new |
| // Resource instance with additional Create and Delete implementations that |
| // allow the data source to be used as a resource. |
| // |
| // This is a backward-compatibility layer for data sources that were formerly |
| // read-only resources before the data source concept was added. It should not |
| // be used for any *new* data sources. |
| // |
| // The Read function for the data source *must* call d.SetId with a non-empty |
| // id in order for this shim to function as expected. |
| // |
| // The provided Resource instance, and its schema, will be modified in-place |
| // to make it suitable for use as a full resource. |
| func DataSourceResourceShim(name string, dataSource *Resource) *Resource { |
| // Recursively, in-place adjust the schema so that it has ForceNew |
| // on any user-settable resource. |
| dataSourceResourceShimAdjustSchema(dataSource.Schema) |
| |
| dataSource.Create = CreateFunc(dataSource.Read) |
| dataSource.Delete = func(d *ResourceData, meta interface{}) error { |
| d.SetId("") |
| return nil |
| } |
| dataSource.Update = nil // should already be nil, but let's make sure |
| |
| // FIXME: Link to some further docs either on the website or in the |
| // changelog, once such a thing exists. |
| dataSource.DeprecationMessage = fmt.Sprintf( |
| "using %s as a resource is deprecated; consider using the data source instead", |
| name, |
| ) |
| |
| return dataSource |
| } |
| |
| func dataSourceResourceShimAdjustSchema(schema map[string]*Schema) { |
| for _, s := range schema { |
| // If the attribute is configurable then it must be ForceNew, |
| // since we have no Update implementation. |
| if s.Required || s.Optional { |
| s.ForceNew = true |
| } |
| |
| // If the attribute is a nested resource, we need to recursively |
| // apply these same adjustments to it. |
| if s.Elem != nil { |
| if r, ok := s.Elem.(*Resource); ok { |
| dataSourceResourceShimAdjustSchema(r.Schema) |
| } |
| } |
| } |
| } |