On Wed, Mar 19, 2014 at 10:55 PM, Adam Murdoch
<adam.murd...@gradleware.com>wrote:

>
> Your changes look really good to me. I added some comments on the commit,
> but I think they are all things we can address in later commits. I'd say
> let's merge this and go from there.
>

I created a pull request (https://github.com/gradle/gradle/pull/256) and
will address your comments.


>
>
> Some notes:
> - As suggested I didn't implement a test for publishing to a repo with
> multiple artifact/ivy patterns.
> - I decided not to implement a test for generic error handling when
> "server throws an exception" - I couldn't come up with a way to simulate
> such situation using current SFTPServer fixture
>
>
> It becomes important for caching, as we want to remember 'not found'
> differently to 'it blew up'.
>
> I suspect you can get an internal failure by throwing an exception out of
> the VirtualFileSystemView.
>

Ok, I will change SFTPServer to use a VirtualFileSystemView from a field so
that a different instance can be provided on a per test basis.


>
> and I've learned that when IOExceptions are thrown from a resource
> accessor, uploader or lister then gradle provides decent error messages
> about what it was doing when a failure occurred. Also, when an unexpected
> response is coming back from the server SSHD's sftp client puts status code
> in the exception message it throws so it is possible to learn what exactly
> has happened. Maybe not the easiest tasks as it involves looking at the
> client code or sftp specs to learn what that given error code means but
> it's possible
> - I didn't do anything special for permission errors. It would involve
> quite a lot of changes to SSHD's sftp client and I didn't think that this
> is of such significance to actually put the effort in
> - I moved transport instantiation from DefaultIvyRepository to
> RepositoryTransport factory. It felt a bit premature is it's still not used
> by the maven part of things but I did what the design document said
> - I did not implement getResourceSha1() in SftpResourceAccessor - the
> contract says that it is allowed to return null and none of the test that
> were required exercise that method so it didn't feel right to implement it
> at this point in time
> - I had to create IvySftpModule even though it only delegtes to a backing
> repository and return it from IvySftpRepository.module() to
> get IvySftpRepository to compile
> - I simplified SFTPServer after VirtualFileSystemView was added in a
> recent version of SSHD. I needed to update dependency on SSHD as the
> SftpClient was only introduced recently.
>
> Cheers,
> Marcin
>
>
> On Sun, Mar 16, 2014 at 8:04 PM, Adam Murdoch <adam.murd...@gradleware.com
> > wrote:
>
>>
>> On 16 Mar 2014, at 12:38 am, Marcin Erdmann <marcin.erdm...@proxerd.pl>
>> wrote:
>>
>> I have another question. One of test cases in the spec is Publish via
>> 'sftp' to ivy repository with multiple ivyPattern and artifactPattern
>> configured - what do we want to verify here?
>>
>>
>> I wouldn't bother. Provided that we have test coverage that publishing
>> with a single pattern works for every transport, then the multiple pattern
>> case can be covered with a single transport.
>>
>> I've noticed that when publishing to such a repository the first ivy
>> pattern and artifact pattern are used. Should the test case assert that
>> this happens?
>>
>>
>> On Fri, Mar 14, 2014 at 8:22 PM, Marcin Erdmann <
>> marcin.erdm...@proxerd.pl> wrote:
>>
>>>
>>>
>>>
>>> On Fri, Mar 14, 2014 at 7:56 PM, Adam Murdoch <
>>> adam.murd...@gradleware.com> wrote:
>>>
>>>>
>>>> Yet, there is plenty to be done on error handling and making sure all
>>>> resources are being released even in error scenarios - so the boring but
>>>> important parts.
>>>>
>>>> I have one question about error handling. There are three types of
>>>> failures listed in the spec: invalid credentials, cannot connect to the
>>>> server and everything else (called server exception). I think that we
>>>> probably want to extract all permission related errors (when both resolving
>>>> and uploading) as a separate error type so that the error message provides
>>>> user an idea that the error is permission related as it feels that it might
>>>> be a common error. What do you think?
>>>>
>>>>
>>>> The key is to make the error message informative at this stage, which
>>>> we don't necessarily need a new type for. If we formalise 'not authorised'
>>>> problems in the resource APIs then we would also need to update the file
>>>> and http backed resource implementations to. So, I'd leave this as a later
>>>> refactoring.
>>>>
>>>
>>> What I meant here by a new type is not a new exception class but to
>>> differentiate permission errors from generic errors when it comes to what
>>> message is being shown when such an error occurs. At the moment I'm
>>> throwing a new runtime exception of type SftpException with a message
>>> saying what has happened (invalid credentials, connection error) and where
>>> (host and port part of the url). I was asking if we should check if we have
>>> permissions to perform a given operation (file download or upload,
>>> directory creation, etc) and if not throw a SftpException with a message
>>> saying that permission was denied to do it.
>>>
>>>
>>>>
>>>>
>>>> Also, DefaultExternalResourceRepository requires an implementation of
>>>> an ExternalResourceLister yet it is currently not exercised by any test -
>>>> to be honest I haven't looked into how it's used and what kind of tests
>>>> would be needed for it so any pointers would be appreciated. Do we want to
>>>> add some tests to the initial story for that?
>>>>
>>>>
>>>> It's used whenever there's a dynamic version in a dependency
>>>> declaration. So, if you've got one of these in one of the tests somewhere,
>>>> then we're good.
>>>>
>>>
>>> I don't have a test like that yet so I will add some. Thanks for
>>> pointing me in the right direction.
>>>
>>>
>>>>
>>>>
>>>>
>>>> On Thu, Mar 6, 2014 at 3:56 AM, Adam Murdoch <
>>>> adam.murd...@gradleware.com> wrote:
>>>>
>>>>>
>>>>> On 6 Mar 2014, at 7:33 am, Marcin Erdmann <marcin.erdm...@proxerd.pl>
>>>>> wrote:
>>>>>
>>>>> I finally got my head around the contract of ExternalResourceAccessor
>>>>> and after doing some reverse engineering of HttpResourceAccessor and
>>>>> Ivy's SFTPResolver as well as skimming SFTP protocol specs the following
>>>>> are my findings and questions:
>>>>>
>>>>> Error handling is far from perfect in both clients - they only return
>>>>> a generic error when you try to get file metadata for a file that doesn't
>>>>> exist but there seems to be a specific substatus for such situation 
>>>>> called SSH_FX_NO_SUCH_FILE.
>>>>> I can see that this substatus is returned by SSHD's implementation of SFTP
>>>>> server when accessing files that don't exist even though the spec(
>>>>> http://tools.ietf.org/id/draft-ietf-secsh-filexfer-00.txt)cryptically 
>>>>> describes it as "is
>>>>> returned when a reference is made to a file which should exist but
>>>>> doesn't" - this should but doesn't part baffles me a bit. Anyway I will
>>>>> assume that this substatus is returned whenever trying to stat a
>>>>> non-existing file.
>>>>>
>>>>> I'm going to use SSHD's client as it seems to be better maintained and
>>>>> I like it more. I will be also able to easily change it's behavior when it
>>>>> comes to handling the aforementioned SSH_FX_NO_SUCH_FILE substatus.
>>>>>
>>>>> We will probably want to throw a specific contextual exception when
>>>>> credentials are incorrect, right?
>>>>>
>>>>>
>>>>> At this stage, I think it's sufficient that the error message gives
>>>>> the user some idea that the credentials are incorrect. Eventually, it 
>>>>> would
>>>>> be nice to tell the difference, if possible.
>>>>>
>>>>>
>>>>> It feels like we want to have separate ssh sessions for getting
>>>>> metadata and getting the file - the fact that you request an 
>>>>> ExternalResource
>>>>> doesn't mean that you will ever read it and thus close it, but you need to
>>>>> open a ssh session to get the metadata. So the idea here is to open a
>>>>> session, get metadata to see if the resource exists and close the session
>>>>> possibly passing the metadata to the created ExternalResource if the
>>>>> resource exists. Then, if resource contents are requested open a new
>>>>> session and close it when close() is called on the ExternalResource. Are 
>>>>> we
>>>>> ok with such approach?
>>>>>
>>>>>
>>>>> Yes, for now. I think at some point we will rework
>>>>> the ExternalResourceAccessor interface so that it can better deal with the
>>>>> fact that for some transports (file, sftp), the meta-data for a resource
>>>>> and the content for a resource have to be fetched as separate operations.
>>>>> The interface at the moment assumes that it's cheap-ish to get the
>>>>> meta-data at the same time the content is requested.
>>>>>
>>>>> This way, the caller can decide whether it needs the meta-data or not,
>>>>> and invoke the appropriate operations - get meta-data, get content or get
>>>>> meta-data and content (if supported).
>>>>>
>>>>>
>>>>>   --
>>>>> Adam Murdoch
>>>>> Gradle Co-founder
>>>>> http://www.gradle.org
>>>>> VP of Engineering, Gradleware Inc. - Gradle Training,
>>>>> Support, Consulting
>>>>> http://www.gradleware.com
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Adam Murdoch
>>>> Gradle Co-founder
>>>> http://www.gradle.org
>>>> VP of Engineering, Gradleware Inc. - Gradle Training,
>>>> Support, Consulting
>>>> http://www.gradleware.com
>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>> --
>> Adam Murdoch
>> Gradle Co-founder
>> http://www.gradle.org
>> VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
>> http://www.gradleware.com
>>
>>
>>
>>
>
>
> --
> Adam Murdoch
> Gradle Co-founder
> http://www.gradle.org
> VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
> http://www.gradleware.com
>
>
>
>

Reply via email to