Josef Cacek created JCLOUDS-1014:
------------------------------------

             Summary: Docker: Add possibility to change loginPort
                 Key: JCLOUDS-1014
                 URL: https://issues.apache.org/jira/browse/JCLOUDS-1014
             Project: jclouds
          Issue Type: Improvement
          Components: jclouds-labs
    Affects Versions: 1.9.1
            Reporter: Josef Cacek


The SSH server in Docker container can run on different port than is the 
default one (22). There should be a possibility for users to provide their own 
implementation of the {{ContainerToNodeMetadata.getLoginPort()}} method.

{code:title=From IRC discussion}
<jcacek> nacx, Hi, could you please give an advice how to change port on which 
SSH in a Node is running. I don't see such an option in the TemplateOptions.
<nacx> hi jcacek let me check
<nacx> jcacek, the login port is given by the NodeMetadata: 
https://github.com/jclouds/jclouds/blob/master/compute/src/main/java/org/jclouds/compute/domain/NodeMetadata.java#L99-L102
<nacx> when the compute service creates a node, it should populate the right 
login port when returning it
<nacx> translating this to Docker, right now always port 22 is returned
<nacx> this method should be changed: 
https://github.com/jclouds/jclouds-labs/blob/master/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java#L77-L104
<nacx> in order to properly populate the login port given a Container
<nacx> in fact, I see it is already populated: 
https://github.com/jclouds/jclouds-labs/blob/master/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java#L93
<nacx> I assume this is the piece of code that is causing trouble to you: 
https://github.com/jclouds/jclouds-labs/blob/master/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java#L120-L135
<nacx> it just looks for a port 22 in the container to get the port in the host
<jcacek> nacx, thanks for the details. Yes, it seems as a correct place. I need 
to have the port configurable.
<nacx> perhaps that "port 22 lookup" should be based on the image, or something 
like that
<nacx> which is your use case?
<jcacek> I'm running containers with networkMode=host (i.e. sharing network 
stack with the docker host). So I have to use another SSH port in container 
(e.g. 8822). And then I have to configure it in JClouds :)
<jcacek> nacx - 
https://github.com/kwart/dockerfiles/tree/master/alpine-ext#32-ssh
<jcacek> nacx, docker run -it -e ROOT_PASSWORD=alpine -e SSH_PORT=8822 
--net=host -it kwart/alpine-ext:3.2-ssh
<nacx> show does a docker inspect look like for such a container?, is there any 
network config?
<nacx> s/show/how/
<jcacek> There is no info about the open ports - there's only "NetworkMode": 
"host" attribute in the HostConfig
<jcacek> nacx, So I prefer configuration option in jclouds Docker provider to 
override SSH port for a node.
<jcacek> nacx, it's also necessary in standard bridged network mode. Nobody 
forces the image creators to start SSH on port 22.
<nacx> that's tricky
<nacx> agree
<nacx> the tricky part is that the loginPort mechanism should also work
<nacx> for nodes that haven't been created by the jclouds compute service
<nacx> that's why the contract in jclouds is that the compute service should be 
able to just "list the nodes" and provide the login port for each
<nacx> having a first thought, it could make sense to have pluggable "port 
lookup strategies", using the current method as the default one
<nacx> and allow to define "per-image" strategies
<nacx> if users are using images with particular ssh configuration, we could 
allow them to provide their custom port lookup funcion
<nacx> (for example that looks t the container's env vars)
<nacx> we can extract this method: 
https://github.com/jclouds/jclouds-labs/blob/master/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java#L120-L135
<jcacek> nacx, Yep, nice idea, it should work then.
<nacx> into its own injectable function (Function<Container, Integer>)
<nacx> so users can propvide a custom guice module
<nacx> that binds that to a custom function
<nacx> in case someone needs specific port discovery
<nacx> that custom function could have specific lookup for the known images and 
default to the current one, etc
<nacx> but the idea would be to make that port lookup function injectable
<nacx> the TemplateOptions is not an option here, as this must work even if the 
user only does a listContainers to then ssh into one of them 8even if not 
deployed with jclouds)
<jcacek> nacx Yes, i see it now.
<jcacek> nacx, I'll file a new Feature Request JIRA and paste also this 
discussion into it. OK?
<nacx> ok
<nacx> I'm thinking that perhaps using Guice multibindings
<nacx> there is a clean way to do that
<nacx> so, we could have that default impl
<nacx> and if it does not find a port
<nacx> delegate to a per-image function
<nacx> we can introduce that Map<image id, Function<container, port>
<nacx> in jclouds
<nacx> and let users easily provide their own custom function for each image
<jcacek> nacx, I've never worked with Guice before, so I'm not able to comment 
the options now. But I'll try to dive into it.
<nacx> the idea with my multibinding comments
<nacx> is that we could have in jclouds the current function
<nacx> and then a map of images names -> function (which would be empty)
<nacx> guice multibindings allow to add bindings to existing collections
<nacx> users could create the context providing a custom guice module (in the 
modules list)
<nacx> a simple module with a single method such as:
<nacx> public void configure() {
<nacx>    MapBinder<String, Function> imagefunctions = 
MapBinder.newMapBinder(binder(), String.class, Function.class)
<nacx>    
<nacx>    imagefunctions.addBinding("redis, myRedisLookupFunction);
<nacx>    imagefunctions.addBinding("kwart/alpine-ext", myAlpineLookupFunction);
<nacx> }
<nacx> that would add the custom functions for those images to the jclouds 
image-to-function map
<nacx> so users have a relatively clean and easy way to provide their custom 
lookup functions for each docker image
<nacx> they want to customizer
<nacx> then, any class in jclouds can have injected a: Map<String, Function>
<nacx> and that map will be populated with any key/value configured by the 
users using the mapbinder
<nacx> perhaps this is too guice specific, but I think it could be a clean way 
to address this issue
<jcacek> nacx, OK, thanks for explaining it. 
<nacx> this is pretty straightforward to implement, so if you open a jira issue 
I can take it and do it, providing the alpine example
<nacx> or feel free to go for the PR yourself :) I'll be happy to help
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to