-
Notifications
You must be signed in to change notification settings - Fork 142
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP: translate: Stub in a translation framework
Add tooling to translate higher-level configs into the basic OCI config. On IRC, Julz floated a linux.namespaces[].fromContainer as a higher-level version of linux.namespaces[].path for emulating exec [1]. That makes sense to me, and Mrunal is open to something like [2]: $ ocitools generate --template=high-level-config.json --translate=fromContainer --runtime=runc This commit still needs: * The state JSON lookup and path logic from [3]. * A way to convert the interface{} to an rspec.Spec (the current FIXME raises: FATA[0000] translated template has an invalid schema). [1]: http://ircbot.wl.linuxfoundation.org/eavesdrop/%23opencontainers/%23opencontainers.2016-04-27.log.html#t2016-04-27T20:32:09 [2]: http://ircbot.wl.linuxfoundation.org/eavesdrop/%23opencontainers/%23opencontainers.2016-04-28.log.html#t2016-04-28T16:12:48 [3]: opencontainers/runtime-spec#391 Signed-off-by: W. Trevor King <[email protected]>
- Loading branch information
Showing
3 changed files
with
92 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package translate | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
func init() { | ||
Translators["fromContainer"] = FromContainer | ||
} | ||
|
||
func FromContainer(data interface{}) (translated interface{}, err error) { | ||
dataMap, ok := data.(map[string]interface{}) | ||
if !ok { | ||
return nil, fmt.Errorf("data is not a map[string]interface{}: %s", data) | ||
} | ||
|
||
linuxInterface, ok := dataMap["linux"] | ||
if !ok { | ||
return data, nil | ||
} | ||
|
||
linux, ok := linuxInterface.(map[string]interface{}) | ||
if !ok { | ||
return nil, fmt.Errorf("data.linux is not a map[string]interface{}: %s", linuxInterface) | ||
} | ||
|
||
namespacesInterface, ok := linux["namespaces"] | ||
if !ok { | ||
return data, nil | ||
} | ||
|
||
namespaces, ok := namespacesInterface.([]interface{}) | ||
if !ok { | ||
return nil, fmt.Errorf("data.linux.namespaces is not an array: %s", namespacesInterface) | ||
} | ||
|
||
for i, namespaceInterface := range namespaces { | ||
namespace, ok := namespaceInterface.(map[string]interface{}) | ||
if !ok { | ||
return nil, fmt.Errorf("data.linux.namespaces[%d] is not a map[string]interface{}: %s", i, namespaceInterface) | ||
} | ||
fromContainerInterface, ok := namespace["fromContainer"] | ||
if ok { | ||
fromContainer, ok := fromContainerInterface.(string) | ||
if !ok { | ||
return nil, fmt.Errorf("data.linux.namespaces[%d].fromContainer is not a string: %s", i, fromContainerInterface) | ||
} | ||
delete(namespace, "fromContainer") | ||
namespace["path"] = fromContainer | ||
} | ||
} | ||
|
||
return data, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
/* | ||
Package translate handles translation between configuration | ||
specifications. | ||
For example, it allows you to generate OCI-compliant config.json from | ||
a higher-level configuration language. | ||
*/ | ||
package translate | ||
|
||
// Translate maps JSON from one specification to another. | ||
type Translate func(data interface{}) (translated interface{}, err error) | ||
|
||
// Translators is a map from translator names to Translate functions. | ||
var Translators = map[string]Translate{} |