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> > >>>>>>>> > >>>>>>> > >>>>> > >>>> > >> > >