Using the Location parameter to create a security group in a Network might do the trick, and perhaps we find the way to document or model it so it is easy to write portable code. We just need to think a bit more about it and explore all the implications and possible alternatives.
Here are some additional thoughts to take into account if we go that path: If we use the location parameter we should also think about its relationship with the collection returned by the ComputeService.listAvailableLocations method [1]. It returns the list of locations that can be used to spawn nodes, but I see it as a general method of the locations made available to be managed by the Compute abstraction. * Should we return a location with Network scope for each existing network? * Should we keep that method as-is and ask users to build a proper network-scoped Location object themselves? * How should we refine the semantics of that method so it is crystal clear to users how to use it and what to expect? I. [1] https://github.com/jclouds/jclouds/blob/master/compute/src/main/java/org/jclouds/compute/ComputeService.java#L108-L118 P.S. Thanks to you Svet for bringing this discussion to the list! On 19 June 2017 at 10:24, Geoff Macartney <geoff.macart...@cloudsoftcorp.com> wrote: > Ok Svet; > > It would certainly be a shame to have to write > > if (provider.equals("GCE")) { > createSecurityGroupOneWay(); > } else { > createSecurityGroupAnotherWay(); > } > > I guess I agree it's probably better, when the provider doesn't support a > concept, to avoid having an implementation that's "nearly but not quite", > otherwise you'd end up with lots of code like the above. > > G > > On Sun, 18 Jun 2017 at 15:23 Svetoslav Neykov < > svetoslav.ney...@cloudsoftcorp.com> wrote: > >> > if that entity does not exist in GCE and >> > users won't be able to use the extension as in other clouds, is there >> > a real use case for it that justifies its implementation? >> >> >> My personal drive for the implementation is to reuse existing code >> managing the ingress access to (freshly spun up) nodes managed by jclouds. >> So it would work nicely for my case :). >> >> What still irks me about the proposal is the different scope of the >> location required to create the security group. It essentially means the >> implementation: >> * is incompatible with existing code out in the wild - it will break it >> when "securityGroupExtension.isPresent()" returns true, but the >> "createSecurityGroup" subsequently fails due to incorrect location argument >> * requires special casing in the code to pass the correct location scope >> - doing template.getLocation() will not do it for GCE which is what I use >> to pass as an argument to "createSecurityGroup" >> >> I took some time to think this through, that's why the delay in response, >> but don't see a nice solution to ^^^. That's why I'm backing off from the >> proposal. Still think it's been a useful discussion to have. Appreciate the >> involvement Ignasi and Geoff. >> >> >> Svet. >> >> >> >> >> >> >> > On 16.06.2017 г., at 10:01, Ignasi Barrera <n...@apache.org> wrote: >> > >> > I agree it is a grey area where we can only do our best. >> > >> > I'd say it is ok to skip egress rules and to only consider the rules >> > created by jclouds, that is something we could assume given the fact >> > that the concept of security groups does not exist in GCE, which >> > brings me to the question: if that entity does not exist in GCE and >> > users won't be able to use the extension as in other clouds, is there >> > a real use case for it that justifies its implementation? >> > >> > If the answer is yes, then let's move forward with your PoC. But I'd >> > like to make sure that we have identified all conflicting points (I >> > think we do). We can assume we're not going to support existing >> > resources not related to jclouds, but as Geoff mentioned too I think >> > we should try to support onboarding existing resources that were >> > created with previous versions of jclouds with the current >> > "inboundPorts" implementation. >> > >> > On 15 June 2017 at 15:59, Svetoslav Neykov >> > <svetoslav.ney...@cloudsoftcorp.com> wrote: >> >> The onboarding experience takes a best effort approach and never >> represents the cloud state exactly. It's a gray area of compromises. >> >> For example GCE supports ingress/egress; allow/deny rules. Of those >> only ingress+allow rules can be represented using IpPermission. What do we >> do about the rest? Just ignore, like we do for other clouds? Where do we >> draw the line and say that it doesn't fit the abstraction so it's not >> presented to the user? Taking this to the extreme we could decide that the >> only rules that fit the abstraction are those created by jclouds. >> >> >> >> It would be fairly easy to come up with a solution which transforms the >> firewall rules into a SecurityGroup (read SGs). What I'm worried about is >> updating onboarded SGs. It could result in some unexpected changes. >> >> >> >> Re the security group created for inboundPorts (or anything managed by >> jclouds) - it's something we expect and know what it looks like, how it's >> used, so should be straightforward to accommodate in the design. It's the >> unknown that's scary :). >> >> >> >> If we decide to represent existing firewall rules, here's how it could >> work: >> >> * skip egress; deny rules >> >> * rules having a list of target tags >> >> - create a security group per tag per network >> >> - share a rule between security groups - one per tag per network >> >> - deleting an IpPermission is removing the tag from the firewall >> rule (and deleting it if last one) >> >> - adding a rule is straightforward - create a permission with the >> same destination tag as the security group ID >> >> - adding a SG to a node is adding the ID for the SG to the tags of >> the node >> >> * rules having an "All instances in the network" target >> >> - group into a single SG (per network) >> >> - consider it a network SG and deny requests to attach it to a node >> >> >> >> I still think the "surprise factor" with the GCE implementation will be >> the requirement to pass a network scope location to the >> "createSecurityGroup" call. It's something that's different from the other >> implementations and means it can't "just work" with existing users. If we >> agree on a solution here, then I'm sure we'll make everything else work. >> >> >> >> Svet. >> >> >> >> >> >> >> >> >> >>> On 15.06.2017 г., at 13:26, Geoff Macartney < >> geoff.macart...@cloudsoftcorp.com> wrote: >> >>> >> >>> hi Ignasi, >> >>> >> >>> that's an interesting issue. Re. your last paragraph, that could >> certainly >> >>> be a good approach, but it still won't address the question of >> onboarding >> >>> existing infrastructure, right? i.e. where there are rules that >> weren't >> >>> written according to those conventions - or of upgrading to the new >> jclouds >> >>> version (with GCE security groups) to continue to manage infrastructure >> >>> that _was_ created and provisioned by jclouds. >> >>> >> >>> I'll certainly need to have a think about it. As you say we could >> refine >> >>> and be explicit about how the proposal would work - perhaps come up >> with a >> >>> use-case that illustrates the scenarios, then we could more easily see >> if >> >>> there are gaps to fill. >> >>> >> >>> Geoff >> >>> >> >>> On Thu, 15 Jun 2017 at 11:14 Ignasi Barrera <n...@apache.org> wrote: >> >>> >> >>>> I understand the motivation behind ignoring existing stuff, but I have >> >>>> some concerns. >> >>>> >> >>>> Onboarding existing cloud infrastructure is a valid use case for >> >>>> jclouds users, and that can already be done (limited by the bounds of >> >>>> the Compute abstraction) with the current jclouds implementation. It >> >>>> is fair to expect that if the SecurityGroupExtension is present, and >> >>>> there is a method called "listSecurityGroupsForNode" you should be >> >>>> able to onboard the firewall rules of your existing node. As a user, >> >>>> I'd have these expectations so I don't think we can discard the >> >>>> onboarding use case just because we've found it difficult to map in a >> >>>> consistent way. >> >>>> >> >>>> This said, if we went that path, I think we still need to refine the >> >>>> proposal, or at least be explicit and enumerate all affected points >> >>>> and how we plan to fill the gaps. >> >>>> >> >>>> Say you create a node in jclouds with "options.inboundPorts(22, 80)". >> >>>> With the actual code, the node would be behind a couple firewall >> >>>> rules, but the security group extension won't be able to return any >> >>>> security group for the node. That is inconsistent, as something you >> >>>> created using the abstraction, cannot be retrieved with the same >> >>>> information using the abstraction extension. It will give users the >> >>>> impression that the node has no firewall rules applied. >> >>>> >> >>>> This case could be as simple as creating the firewall rules for the >> >>>> "inboundPorts" following our SG naming and tag convention. I just want >> >>>> to illustrate that the problem is not exclusive of the resources >> >>>> created "outside" jclouds. >> >>>> >> >>>> On 15 June 2017 at 11:09, Svetoslav Neykov >> >>>> <svetoslav.ney...@cloudsoftcorp.com> wrote: >> >>>>>> Svet you don't mention GCE "tags" or the question of subnets in the >> >>>> above: >> >>>>> >> >>>>> That's right, tags are an important part of the convention and I >> didn't >> >>>> expand on that. Your description nicely captures the idea. >> >>>>> I believe the security groups will work across subnets in a single >> vpc >> >>>> network. >> >>>>> >> >>>>> Svet. >> >>>>> >> >>>>> >> >>>>>> On 15.06.2017 г., at 11:57, Geoff Macartney < >> >>>> geoff.macart...@cloudsoftcorp.com> wrote: >> >>>>>> >> >>>>>> I like the sound of this proposal, I think it's certainly worth >> >>>>>> investigating. >> >>>>>> >> >>>>>> Ignasi those are good questions you've asked. Here's my thoughts: >> >>>>>> >> >>>>>> We can regard 'security groups' on GCE as a jclouds "overlay", and >> be >> >>>>>> explicit about that in documentation. What I mean here is that we >> don't >> >>>>>> need to do a "reverse mapping" of existing stuff back into jclouds >> >>>>>> concepts. So if there are existing firewall rules they simply don't >> >>>> show up >> >>>>>> in the results of 'listSecurityGroups()", >> >>>> "listSecurityGroupsInLocation()" >> >>>>>> or "listSecurityGroupsForNode()". That is, not all rules >> participate >> >>>> in >> >>>>>> "security groups" from the jclouds point of view, only ones that >> jclouds >> >>>>>> added for security group purposes. >> >>>>>> >> >>>>>> Svet you don't mention GCE "tags" or the question of subnets in the >> >>>> above: >> >>>>>> >> >>>>>> 1. What do you think about the idea of using tags to identify >> security >> >>>>>> groups - each security group would correspond to a tag. These tags >> would >> >>>>>> correspond to groupIds in the IPPermission object, i.e. you could >> >>>> create an >> >>>>>> IPPermission using a groupId [1] which would relate to a tag in the >> GCE >> >>>>>> platform. Then any nodes with that tag (= in that security group) >> would >> >>>> be >> >>>>>> permitted access. >> >>>>>> 2. Are there any restrictions/implications relating to subnets in >> your >> >>>>>> proposal, e.g. would you need to use them to achieve what you want, >> or >> >>>> can >> >>>>>> it work irrespective of any subnets on the network? >> >>>>>> >> >>>>>> Geoff >> >>>>>> >> >>>>>> [1] >> >>>>>> >> >>>> >> https://jclouds.apache.org/reference/javadoc/1.9.x/org/jclouds/net/domain/IpPermission.Builder.html#groupId(java.lang.String) >> >>>>>> >> >>>>>> >> >>>>>> On Thu, 15 Jun 2017 at 09:18 Ignasi Barrera <n...@apache.org> >> wrote: >> >>>>>> >> >>>>>>> Thanks for starting this discussion Svet! >> >>>>>>> >> >>>>>>> It would be great to come up with a solution we are happy with. >> >>>>>>> >> >>>>>>> The main issue I see here is that the primary entity of the >> extension, >> >>>>>>> the SecurityGroup, does not have a mapping in GCE (which was one of >> >>>>>>> the reasons we decided to remove the old implementation). >> >>>>>>> >> >>>>>>> I am OK applying conventions to implement the extension somehow, >> but >> >>>>>>> conventions are tricky when it comes to deal with existing stuff in >> >>>>>>> the provider. With this proposal, what are your plans to implement >> the >> >>>>>>> "listSecurityGroups()" and "listSecurityGroupsInLocation(Location >> >>>>>>> location)" methods? There is also a method to list the security >> groups >> >>>>>>> from a node. Given that the ComputeService is able to "listNodes" >> that >> >>>>>>> weren't created by jclouds, in case of a returned Node that already >> >>>>>>> has firewall rules assigned but that don't fit in our naming >> >>>>>>> conventions, how would the "listSecurityGroupsForNode(String id)" >> >>>>>>> behave? >> >>>>>>> >> >>>>>>> I. >> >>>>>>> >> >>>>>>> On 15 June 2017 at 09:03, Svetoslav Neykov >> >>>>>>> <svetoslav.ney...@cloudsoftcorp.com> wrote: >> >>>>>>>> I'd like to try implement the SecurityGroupExtension interface for >> >>>> GCE. >> >>>>>>> Looking at the documentation it seems that the combination of >> firewall >> >>>>>>> rules and node tags is flexible enough to allow us implement the >> >>>>>>> functionality. >> >>>>>>>> It's been tried before but the implementation's been removed (see >> >>>> [1]). >> >>>>>>> It's main drawback was that for each security group the code >> creates a >> >>>> new >> >>>>>>> network. >> >>>>>>>> Currently the biggest mismatch between the jclouds abstraction >> and the >> >>>>>>> GCE functionality is that firewall rules must be attached to a >> network. >> >>>>>>>> Here's my suggested approach: >> >>>>>>>> IpPermission roughly corresponds to a firewall rule >> >>>>>>>> SecurityGroup is just a collection of firewall rules (there's no >> cloud >> >>>>>>> resource that corresponds to it). The firewall rules of a security >> >>>> group >> >>>>>>> share the same prefix - jclouds-sg-<sg name>-<permission suffix>. >> They >> >>>> all >> >>>>>>> belong to the same network. >> >>>>>>>> They key bit: createSecurityGroup accepts a Location with a scope >> of >> >>>>>>> Network, returning a custom implementation of SecurityGroup which >> >>>> keeps a >> >>>>>>> reference to the network, so all IpPermission objects added >> >>>> subsequently >> >>>>>>> will be on it. >> >>>>>>>> While the suggested approach fits into the SecurityGroupExtension >> >>>>>>> interface it's different enough from the other implementations >> that it >> >>>>>>> might not be worth the trouble of implementing and supporting >> (even be >> >>>>>>> harmful as users might be surprised by the different behaviour). >> >>>>>>>> Would be interested in hearing other opinions on the approach. >> I've >> >>>>>>> created a Jira to track the effort at [2]. >> >>>>>>>> >> >>>>>>>> Svet. >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> [1] >> >>>>>>> >> >>>> >> https://github.com/jclouds/jclouds/commit/2ba48dc9f66416b5d8515bd6a07b27a213d89a7c >> >>>>>>> < >> >>>>>>> >> >>>> >> https://github.com/jclouds/jclouds/commit/2ba48dc9f66416b5d8515bd6a07b27a213d89a7c >> >>>>>>>> >> >>>>>>>> [2] https://issues.apache.org/jira/browse/JCLOUDS-1309 < >> >>>>>>> https://issues.apache.org/jira/browse/JCLOUDS-1309> >> >>>>>>>> >> >>>>>>> >> >>>>> >> >>>> >> >> >> >>