def update_store(sync_job, task_metadata, task_status):
    """
    update a store
    """
    if sync_job.get("geoserver_setting", None) is None:
        sync_job["geoserver_setting"] = {}

    res = requests.get(
        get_store_url(sync_job["workspace"], sync_job["name"]), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD)
    )
    if res.status_code == 200:
        http_method = requests.put
        request_url = get_store_url(sync_job["workspace"], sync_job["name"])
    else:
        http_method = requests.post
        request_url = get_stores_url(sync_job["workspace"])

    template = template_env.get_template("wms_store.xml")
    res = http_method(
        request_url,
        auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD),
        headers=update_headers,
        data=template.render(sync_job),
    )

    if res.status_code >= 400:
        raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
def update_layer(sync_job, task_metadata, task_status):
    """
    update a layer
    """
    sync_job["applications"] = sync_job["applications"] or []
    res = requests.get(
        get_layer_url(sync_job["workspace"], sync_job["store"], sync_job["name"]),
        auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD),
    )
    if res.status_code == 200:
        http_method = requests.put
        request_url = get_layer_url(sync_job["workspace"], sync_job["store"], sync_job["name"])
    else:
        http_method = requests.post
        request_url = get_layers_url(sync_job["workspace"], sync_job["store"])

    template = template_env.get_template("wms_layer.xml")
    res = http_method(
        request_url,
        auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD),
        headers=update_headers,
        data=template.render(sync_job),
    )

    if res.status_code >= 400:
        raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
def _update_store(sync_job,
                  task_metadata,
                  task_status,
                  rest_url,
                  username,
                  password,
                  stage=None):
    """
    update a store
    """
    if sync_job.get('geoserver_setting', None) is None:
        sync_job['geoserver_setting'] = {}

    res = requests.get(get_store_url(rest_url, sync_job['workspace'],
                                     sync_job['name']),
                       auth=(username, password))
    if res.status_code == 200:
        http_method = requests.put
        request_url = get_store_url(rest_url, sync_job['workspace'],
                                    sync_job['name'])
    else:
        http_method = requests.post
        request_url = get_stores_url(rest_url, sync_job['workspace'])

    template = settings.template_env.get_template('wms_store.xml')
    res = http_method(request_url,
                      auth=(username, password),
                      headers=update_headers,
                      data=template.render(sync_job))

    if res.status_code >= 400:
        raise Exception("{0}: {1}".format(res.status_code,
                                          get_http_response_exception(res)))
def remove_layer(sync_job,task_metadata,task_status):
    """
    remove a layer
    """
    res = requests.get(get_layer_url(sync_job['workspace'],sync_job['store'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
    if res.status_code == 200:
        #store exist,delete it
        res = requests.delete(get_layer_url(sync_job['workspace'],sync_job['store'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
      
        if res.status_code >= 400:
            raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
def update_group(sync_job,task_metadata,task_status):
    """
    update a layer group
    """
    #update the dependent group first
    sub_task = None
    for group in sync_job.get('dependent_groups',{}):
        sub_task = get_task("update_layer_group",task_name(group))
        if sub_task:
            #dependent task exist,execute it.
            execute_task(*sub_task)
            if sub_task[0]["status"].is_not_succeed:
                #sub task failed, 
                raise Exception("update sub group ({0}) failed.".format(sub_task[0]["name"]))

    #after update all dependent groups, begin to update current group
    res = requests.get(get_group_url(sync_job['workspace'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
    if res.status_code == 200:
        http_method = requests.put
        request_url = get_group_url(sync_job['workspace'],sync_job['name'])
    else:
        http_method = requests.post
        request_url = get_groups_url(sync_job['workspace'])

    template = template_env.get_template('layergroup.xml')
    res = http_method(request_url, auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD), headers=update_headers, data=template.render(sync_job))
    if res.status_code >= 400:
        if http_method == requests.put:
            logger.warning("update group({0}) failed, try to delete and readd it".format(sync_job['name']))
            #update layergroup with different number of layers will cause "Layer group has different number of styles than layers"
            #so delete layergroup first and then readd it.
            res = requests.delete(get_group_url(sync_job['workspace'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
            if res.status_code >= 400:
                raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
            http_method = requests.post
            request_url = get_groups_url(sync_job['workspace'])
            res = http_method(request_url, auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD), headers=update_headers, data=template.render(sync_job))
            if res.status_code >= 400:
                raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
        else:
            raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
def remove_store(sync_job,task_metadata,task_status):
    """
    remove a store
    """
    logger.info("Begin to remove store ({}).".format(sync_job['name']))
    res = requests.get(get_store_url(sync_job['workspace'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
    if res.status_code == 200:
        #store exist,delete it
        res = requests.delete(get_store_url(sync_job['workspace'],sync_job['name']), auth=(GEOSERVER_USERNAME, GEOSERVER_PASSWORD))
      
        if res.status_code >= 400:
            raise Exception("{0}: {1}".format(res.status_code, get_http_response_exception(res)))
def _remove_group(sync_job,
                  task_metadata,
                  task_status,
                  rest_url,
                  username,
                  password,
                  stage=None):
    """
    remove a layer group
    """
    logger.info("Begin to remove layer group ({}).".format(sync_job['name']))
    res = requests.get(get_group_url(rest_url, sync_job['workspace'],
                                     sync_job['name']),
                       auth=(username, password))
    if res.status_code == 200:
        #store exist,delete it
        res = requests.delete(get_group_url(rest_url, sync_job['workspace'],
                                            sync_job['name']),
                              auth=(username, password))

        if res.status_code >= 400:
            raise Exception("{0}: {1}".format(
                res.status_code, get_http_response_exception(res)))
def _remove_layer(sync_job,
                  task_metadata,
                  task_status,
                  rest_url,
                  username,
                  password,
                  stage=None):
    """
    remove a layer
    """
    res = requests.get(get_layer_url(rest_url, sync_job['workspace'],
                                     sync_job['store'], sync_job['name']),
                       auth=(username, password))
    if res.status_code == 200:
        #layer exist,delete it
        res = requests.delete(get_layer_url(rest_url, sync_job['workspace'],
                                            sync_job['store'],
                                            sync_job['name']),
                              auth=(username, password))

        if res.status_code >= 400:
            raise Exception("{0}: {1}".format(
                res.status_code, get_http_response_exception(res)))
def _update_group(sync_job,
                  task_metadata,
                  task_status,
                  rest_url,
                  username,
                  password,
                  stage=None):
    """
    update a layer group
    """
    #update the dependent group first
    sub_task = None
    for group in sync_job.get('dependent_groups', {}):
        sub_task = get_task("update_layer_group", task_name(group))
        if sub_task:
            #dependent task exist,execute it.
            execute_task(*sub_task)
            if sub_task[0]["status"].is_not_succeed:
                #sub task failed,
                raise Exception("update sub group ({0}) failed.".format(
                    sub_task[0]["name"]))

    #after update all dependent groups, begin to update current group
    res = requests.get(get_group_url(rest_url, sync_job['workspace'],
                                     sync_job['name']),
                       auth=(username, password))
    if res.status_code == 200:
        http_method = requests.put
        request_url = get_group_url(rest_url, sync_job['workspace'],
                                    sync_job['name'])
    else:
        http_method = requests.post
        request_url = get_groups_url(rest_url, sync_job['workspace'])

    template = settings.template_env.get_template('layergroup.xml')
    res = http_method(request_url,
                      auth=(username, password),
                      headers=update_headers,
                      data=template.render(sync_job))
    if res.status_code >= 400:
        if http_method == requests.put:
            logger.warning(
                "update group({0}) failed, try to delete and readd it".format(
                    sync_job['name']))
            #update layergroup with different number of layers will cause "Layer group has different number of styles than layers"
            #so delete layergroup first and then readd it.
            res = requests.delete(get_group_url(rest_url,
                                                sync_job['workspace'],
                                                sync_job['name']),
                                  auth=(username, password))
            if res.status_code >= 400:
                raise Exception("{0}: {1}".format(
                    res.status_code, get_http_response_exception(res)))
            http_method = requests.post
            request_url = get_groups_url(rest_url, sync_job['workspace'])
            res = http_method(request_url,
                              auth=(username, password),
                              headers=update_headers,
                              data=template.render(sync_job))
            if res.status_code >= 400:
                raise Exception("{0}: {1}".format(
                    res.status_code, get_http_response_exception(res)))
        else:
            raise Exception("{0}: {1}".format(
                res.status_code, get_http_response_exception(res)))
def _update_layer(sync_job,
                  task_metadata,
                  task_status,
                  rest_url,
                  username,
                  password,
                  stage=None):
    """
    update a layer
    """
    sync_job['applications'] = sync_job.get('applications') or []
    sync_job['keywords'] = sync_job.get('keywords') or []
    if (sync_job.get('override_bbox', False)):
        #sync_job["bbox"] = json.loads(sync_job["bbox"])
        pass

    template = settings.template_env.get_template('wms_layer.xml')
    xmlData = template.render(sync_job).encode("utf-8")

    failover = True
    while True:
        res = requests.get(get_layer_url(rest_url, sync_job['workspace'],
                                         sync_job['store'], sync_job['name']),
                           auth=(username, password))
        if res.status_code == 200:
            http_method = requests.put
            request_url = get_layer_url(rest_url, sync_job['workspace'],
                                        sync_job['store'], sync_job['name'])
        else:
            http_method = requests.post
            request_url = get_layers_url(rest_url, sync_job['workspace'],
                                         sync_job['store'])

        res = http_method(request_url,
                          auth=(username, password),
                          headers=update_headers,
                          data=xmlData)

        if res.status_code >= 400:
            errMsg = get_http_response_exception(res)
            if failover and re_already_exist_in_workspace.search(errMsg):
                failover = False
                #check whether layer exist or not, if exist, delete it.
                res1 = requests.get(get_wmsstores_url(rest_url,
                                                      sync_job['workspace'],
                                                      'json'),
                                    auth=(username, password))
                if res1.status_code == 200:
                    isExist = False
                    for store in res1.json().get("wmsStores",
                                                 {}).get("wmsStore", []):
                        res2 = requests.get(get_layer_url(
                            rest_url, sync_job['workspace'], store["name"],
                            sync_job['name']),
                                            auth=(username, password))
                        if res2.status_code == 200:
                            #layer exist,delete it
                            isExist = True
                            res3 = requests.delete(get_layer_url(
                                rest_url, sync_job['workspace'], store['name'],
                                sync_job['name']),
                                                   auth=(username, password))
                            if res3.status_code >= 400:
                                raise Exception("{0}: {1}".format(
                                    res3.status_code,
                                    get_http_response_exception(res3)))
                            break
                    if isExist:
                        continue
            raise Exception("{0}: {1}".format(
                res.status_code, get_http_response_exception(res)))
        else:
            break