def test_deletion_of_layers(self):
        """Test that layer can be deleted
        """
        
        # Create workspace
        self.api.create_workspace(geoserver_username, geoserver_userpass, geoserver_url, test_workspace_name)        
        
        # setup layer, file, sld and style names
        layername = 'shakemap_padang_20090930'
        raster_file = 'data/%s.asc' % layername
        expected_output_sld_file = '%s.sld' % layername 
        stylename = layername 
        
        # Form layer handle
        lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                    geoserver_userpass, 
                                                    geoserver_url, 
                                                    '',   # Empty layer means derive from filename
                                                    test_workspace_name)
                
        # Upload coverage
        res = self.api.upload_geoserver_layer(raster_file, lh)
        assert res.startswith('SUCCESS'), res        

        # Check that layer is there
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('rest/layers/%s.html' % layername) > 0:
                found = True
        
        msg = 'Did not find layer %s in geoserver %s' % (layername, geoserver_url)
        assert found, msg        

        # Form fully qualified handle for layer deletions
        lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                    geoserver_userpass, 
                                                    geoserver_url, 
                                                    layername,
                                                    test_workspace_name)
        
        # Delete layer
        self.api.delete_layer(lh)        
        
        # Check that it is gone        
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('rest/layers/%s.html' % layername) > 0:
                found = True
        
        msg = 'Layer %s was not deleted from geoserver %s' % (layername, geoserver_url)
        assert not found, msg        
    def test_upload_vector(self):
        """Test that vector data can be uploaded
        """
        
        #FIXME:  and a new style should be created
        
        # Try using the shape filename
        layername = 'bridge_S68_WestJava'
        vector_file = 'data/%s.shp' % layername

        
        # Upload to test workspace
        lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                    geoserver_userpass, 
                                                    geoserver_url, 
                                                    '',
                                                    test_workspace_name)
        self.api.upload_geoserver_layer(vector_file, lh) 
        
        # Check that layer is there
        layername = os.path.basename(os.path.splitext(vector_file)[0])
        
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('rest/layers/%s.html' % layername) > 0:
                found = True


        msg = 'Layer %s was not found in %s' % (layername, geoserver_url)        
        assert found, msg
    def test_create_workspace(self):            
        """Test that new workspace can be created
        """
        
        geoserver_url = 'http://localhost:8080/geoserver'
        username = '******'
        userpass = '******'
        
        # Create workspace
        
        # FIXME(Ole): XMLRPC complains: cannot marshal None unless allow_none is enabled
        # FIXME(Ole): However, no variable is None here. Does my head in.
        for var in [username, userpass, geoserver_url, test_workspace_name]:
            assert var is not None
        
        self.api.create_workspace(username, userpass, geoserver_url, test_workspace_name)
        
        # Check that workspace is there
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/workspaces'), 
                            username=username, 
                            password=userpass)
        for line in page:
            if line.find('rest/workspaces/%s.html' % test_workspace_name) > 0:
                found = True

        msg = 'Workspace %s was not found in %s' % (test_workspace_name, geoserver_url)        
        assert found, msg
    def test_upload_coverage(self):
        """Test that a coverage can be uploaded and a new style is created
        """
        
        # Create workspace
        self.api.create_workspace(geoserver_username, geoserver_userpass, geoserver_url, test_workspace_name)        
        
        # setup layer, file, sld and style names
        layername = 'shakemap_padang_20090930'
        raster_file = 'data/%s.asc' % layername
        expected_output_sld_file = '%s.sld' % layername 
        stylename = layername 
        
        # Form layer handle
        lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                    geoserver_userpass, 
                                                    geoserver_url, 
                                                    '',   # Empty layer means derive from filename
                                                    test_workspace_name)
                
        # Upload coverage
        res = self.api.upload_geoserver_layer(raster_file, lh)
        assert res.startswith('SUCCESS'), res        

        # Check that layer is there
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('rest/layers/%s.html' % layername) > 0:
                found = True
        
        msg = 'Did not find layer %s in geoserver %s' % (layername, geoserver_url)
        assert found, msg        
        

        # Test style by grabbing the json
        c = pycurl.Curl()
        url = ((geoserver_url+'/rest/layers/%s') % layername)
        c.setopt(pycurl.URL, url)
        c.setopt(pycurl.HTTPHEADER, ['Accept: text/json'])
        c.setopt(pycurl.USERPWD, '%s:%s' % (geoserver_username, geoserver_userpass))
        c.setopt(pycurl.VERBOSE, 0)
        b = StringIO.StringIO()
        c.setopt(pycurl.WRITEFUNCTION, b.write)
        c.perform()

        try:
            d = json.loads(b.getvalue())
            def_style = d['layer']['defaultStyle']['name']
        except:
            def_style = b.getvalue()
            
        msg =   'Expected: '+stylename
        msg +=   'Got: '+def_style+"\n"
        assert def_style == stylename, msg
    def test_create_workspace(self):            
        """Test that new workspace can be created
        """
        
        # Create workspace
        self.api.create_workspace(geoserver_username, geoserver_userpass, geoserver_url, test_workspace_name)
        
        # Check that workspace is there
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/workspaces'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('rest/workspaces/%s.html' % test_workspace_name) > 0:
                found = True

        msg = 'Workspace %s was not found in %s' % (test_workspace_name, geoserver_url)        
        assert found, msg
    def Xtest_deletion_of_all_layers(self):
        """Test that Geoserver can be cleaned up programatically
        """
        
        
        self.api.delete_all_layers(geoserver_username, 
                                   geoserver_userpass, 
                                   geoserver_url)


        # Check that all layers are gone        
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
        
            first = line.find('<a href="')
            last = line.find('</a>')
            s = line[first:last]
            
            if s.find('rest/layers/') > 0:
                fields = s.split('/')
                
                try:
                    idx = fields.index('layers')
                except:
                    continue
                
                # Extract layer name    
                x = fields[idx+1]
                i = x.find('">')
                if i > -1:
                    layername = x[i+2:]
                else:
                    continue
                    
                if len(layername) > 0: 
                    found = True
        
        msg = 'Layer %s was not deleted from geoserver %s' % (layername, geoserver_url)
        assert not found, msg        
Beispiel #7
0
    def __init__(self, geoserver_url, geoserver_username, geoserver_userpass):
        """Instantiate class and verify connection to specified geoserver through the REST API.
        """
        
        # Record login information
        self.geoserver_url = geoserver_url
        self.geoserver_username = geoserver_username
        self.geoserver_userpass = geoserver_userpass
        
        # Verify that Geoserver is running
        found = False
        page = get_web_page(os.path.join(geoserver_url, 'rest'), 
                            username=geoserver_username, 
                            password=geoserver_userpass)
        for line in page:
            if line.find('workspaces') > 0:
                found = True

        msg = 'Could not connect to geoserver at %s' % geoserver_url        
        assert found, msg
    def test_get_raster_data(self):
        """Test that raster data can be retrieved from server and read into Python Raster object.
        """

        for coverage_name, reference_range in [('shakemap_padang_20090930', [3.025794, 8.00983]),
                                               ('population_padang_1', [50., 1835.]),
                                               ('population_padang_2', [50., 1835.]), 
                                               ('fatality_padang_1', [4.08928e-07, 0.5672711486]),
                                               ('fatality_padang_2', [4.08928e-07, 1.07241])]:
    
            # Upload first to make sure data is there
            self.api.create_workspace(geoserver_username, geoserver_userpass, geoserver_url, test_workspace_name)

            lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                        geoserver_userpass, 
                                                        geoserver_url, 
                                                        coverage_name,
                                                        test_workspace_name)

            upload_filename = 'data/%s.asc' % coverage_name
            res = self.api.upload_geoserver_layer(upload_filename, lh)
            assert res.startswith('SUCCESS'), res                
    
            # Get bounding box for the uploaded TIF file
            bounding_box = get_bounding_box('%s.tif' % coverage_name)
    
                            
            # Download using the API and test that the data is the same.
            raster = self.api.get_raster_data(lh,
                                              bounding_box)
                                             
        
            #ref_shape = (254, 250) # FIXME (Ole): This is what it should be
            ref_shape = (253, 249)  # but Geoserver shrinks it by one row and one column?????????
            
            data = raster.get_data(nan=True)
            
            shape = data.shape
            msg = 'Got shape %s, should have been %s' % (shape, ref_shape)        
            assert numpy.allclose(shape, ref_shape), msg
        
            # Now compare the numerical data
            reference_raster = read_coverage(upload_filename)
            ref_data = reference_raster.get_data(nan=True)
        
            # Range
            assert numpy.allclose([numpy.nanmin(ref_data[:]), numpy.nanmax(ref_data[:])], 
                                  reference_range)        
            assert numpy.allclose([numpy.nanmin(data[:]), numpy.nanmax(data[:])], 
                                  reference_range)
                           
            # Sum up (ignoring NaN) and compare
            refsum = numpy.nansum(numpy.abs(ref_data))
            actualsum = numpy.nansum(numpy.abs(data))            
            
            #print 
            #print 'Ref vs act and diff', refsum, actualsum, abs(refsum - actualsum), abs(refsum - actualsum)/refsum
            assert abs(refsum - actualsum)/refsum < 1.0e-2

            
            # Check that raster data can be written back (USING COMPLETE HACK)
            try:
                i += 1
            except:
                i = 0
                
            layername = 'stored_raster_%i' % i    
            output_file = 'data/%s.asc' % layername
            write_coverage_to_ascii(raster.data, output_file, 
                                    xllcorner = bounding_box[0],
                                    yllcorner = bounding_box[1],
                                    cellsize=0.030741064,
                                    nodata_value=-9999,
                                    projection=open('data/%s.prj' % coverage_name).read())
                                                
            # And upload it again
            lh = self.api.create_geoserver_layer_handle(geoserver_username, 
                                                        geoserver_userpass, 
                                                        geoserver_url, 
                                                        '',
                                                        test_workspace_name)

            self.api.upload_geoserver_layer(output_file, lh)
            
            # Check that layer is there
            found = False
            page = get_web_page(os.path.join(geoserver_url, 'rest/layers'), 
                                username=geoserver_username, 
                                password=geoserver_userpass)
            for line in page:
                if line.find('rest/layers/%s.html' % layername) > 0:
                    found = True
                                                                                                          
            assert found