CreateMapSDDraft (arcpy.mapping)

Резюме

Конвертирует файлы документа карты (.mxd) в файлы черновика определения сервиса (.sddraft).

Обсуждение

CreateMapSDDraft – это первый шаг для автоматизации публикации документа карты на ГИС-сервере с помощью ArcPy. Результатом работы CreateMapSDDraft является файл проекта определения сервиса (.sddraft). Проект определения сервиса – это комбинация документа карты, информации о сервере и набора свойств сервиса.

Информация о сервере содержит подключение к серверу или тип сервера, на который выполняется публикация, тип публикуемого сервиса, метаданные для сервиса (информация об элементе) и ссылки на данные (копируются данные на сервер или нет).

Свойства сервиса содержат сведения о том, поддерживает ли сервис кэширование и, если это так, параметры кэша. Также в них включены дополнительные функции сервиса, такие как функции доступа к объекту или OGC, а также соответствующий набор свойств для выбранной функции. Этот метод изначально использует набор свойств сервиса по умолчанию. Пользователи могут редактировать эти свойства с помощью стандартных XML-редакторов сторонних производителей. Кроме того, пользователи могут автоматизировать изменение этих свойств с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. См. примеры изменения SDDraft ниже.

ПримечаниеПримечание:

Проект определения сервиса не содержит данные. Проект сервиса сам по себе не может использоваться для публикации сервиса.

Как и функция AnalyzeForSD, CreateSDDraft также возвращает словарь Python с ошибками и другими потенциальными проблемами, которые необходимо устранить до создания файла определения сервиса. Дополнительные сведения о типах ошибок, предупреждений и информационных сообщений, а также о доступе к ним см. в разделе AnalyzeForSD.

Проект определения сервиса можно создать без информации о подключении к серверу. В этом случае параметр connection_file_path можно опустить, однако следует предоставить параметр server_type. Подключение к серверу можно задать позже, когда черновик определения сервиса уже опубликован с помощью инструмента Передать определение сервиса (Upload Service Definition).

Черновик определения сервиса затем может быть конвертирован в полностью готовый файл определения сервиса (.sd) с помощью инструмента Промежуточный сервис (Stage Service). Во время подготовки компилируется вся информация, необходимая для успешной публикации ГИС-ресурса. Если данные не зарегистрированы на сервере, они будут добавлены после подготовки проекта определения сервиса. Наконец, файл определения сервиса можно загрузить и опубликовать как ГИС-сервис на заданном сервере ГИС с помощью инструмента Передать определение сервиса (Upload Service Definition). На этом шаге файл определения сервиса копируется на сервер, извлекается необходимая информация и публикуется ГИС-ресурс. Дополнительные сведения см. в обзоре группы инструментов Публикация (Publishing).

После того как .sddraft создан и загружен на сервер, инструменты в группе Кэширование можно использовать для создания схемы разбиения на листы для сервисов, которые не имеют кэширования. Например, можно использовать инструмент Построить кэш картографического сервера (Create Map Server Cache). Кроме того, инструменты в группе инструментов Кэширование (Caching) можно применять для изменения свойств кэширования и схемы листов для сервисов с включенным кэшированием. Например, инструмент Управление масштабами кэша картографического сервера (Manage Map Server Cache Scales) может использоваться для добавления или удаления масштабов из кэша. В примере ModifySDDraft 7 ниже приведена демонстрация этого. Схему листов также можно изменить, редактируя файл .sddraft с помощью сторонних XML-библиотек, таких как стандартная библиотека Python xml.dom.minidom. Однако, из-за сложной структуры XML-схемы разбиения на листы, при возможности рекомендуется использовать группу инструментов Кэширование (Caching).

ПримечаниеПримечание:

Также, ArcGIS for Server Administrator API позволяет создавать скрипты для наиболее часто использующихся операций с сервером. Например, остановка и запуск сервисов, редактирование свойств сервисов, таких как максимальное число экземпляров, назначение и отмена пользовательских прав для сервисов и т.д.

Также вы можете создать файлы черновиков определений картографических сервисов и сервисов изображений. См. следующие связанные функции:

Синтаксис

CreateMapSDDraft (map_document, out_sddraft, service_name, {server_type}, {connection_file_path}, {copy_data_to_server}, {folder_name}, {summary}, {tags})
ПараметрОбъяснениеТип данных
map_document

A variable that references a MapDocument object.

MapDocument
out_sddraft

A string that represents the path and file name for the output Service Definition Draft (.sddraft) file.

String
service_name

A string that represents the name of the service. This is the name people will see and use to identify the service. The name can only contain alphanumeric characters and underscores. No spaces or special characters are allowed. The name cannot be more than 120 characters in length.

String
server_type

A string representing the server type. If a connection_file_path parameter is not supplied, then a server_type must be provided. If a connection_file_path parameter is supplied, then the server_type is taken from the connection file. In this case, you can choose FROM_CONNECTION_FILE or skip the parameter entirely.

  • ARCGIS_SERVERArcGIS for Server server type
  • FROM_CONNECTION_FILEGet the server_type as specified in the connection_file_path parameter
  • SPATIAL_DATA_SERVERSpatial Data Server server type
  • MY_HOSTED_SERVICESMy Hosted Services server type

(Значение по умолчанию — ARCGIS_SERVER)

String
connection_file_path

A string that represents the path and file name to the ArcGIS for Server connection file (.ags).

String
copy_data_to_server

A Boolean that indicates whether the data referenced in the map document will be copied to the server or not. The copy_data_to_server parameter is only used if the server_type is ARCGIS_SERVER and the connection_file_path isn't specified. If the connection_file_path is specified, then the server's registered data stores are used. For example, if the data in the map_document is registered with the server, then copy_data_to_server will always be False. Conversely, if the data in the map_document is not registered with the server, then copy_data_to_server will always be True.

When the server_type is set to SPATIAL_DATA_SERVER, copy_data_to_server will always be False. Spatial Data Server services always use registered data and therefore never copy data to the server.

When the server_type is set to MY_HOSTED_SERVICES, copy_data_to_server will always be True. My Hosted Maps services always copy data to the server.

(Значение по умолчанию — False)

Boolean
folder_name

A string that represents a folder name to which you want to publish the service definition. If the folder does not currently exist, it will be created. The default folder is the server root level.

(Значение по умолчанию — None)

String
summary

A string that represents the Item Description Summary.

By default, the Summary from the ArcMap Map Properties dialog box or Catalog window Item Description dialog box for the map_document will be used. Use this parameter to override the user interface summary, or to provide a summary if one does not exist. The summary provided here will not be persisted in the map document.

(Значение по умолчанию — None)

String
tags

A string that represents the Item Description Tags.

By default, the Tags from the ArcMap Map Properties dialog box or Catalog window Item Description dialog box for the map_document will be used. Use this parameter to override the user interface tags, or to provide tags if they do not exist. The tags provided here will not be persisted in the map document.

(Значение по умолчанию — None)

String
Возвращено значение
Тип данныхОбъяснение
Dictionary

Возвращает словарь информационных сообщений, предупреждений и сообщений об ошибках Python.

Пример кода

CreateMapSDDraft пример 1

Следующий скрипт демонстрирует полный процесс публикации картографических сервисов с использованием модуля arcpy.mapping. Публикацию картографических сервисов можно автоматизировать с помощью функций arcpy.mapping и инструментов геообработки в составе набора инструментов Публикация (Publishing). Сначала необходимо выбрать документ карты, который необходимо опубликовать. Сначала с помощью функции arcpy.mapping CreateMapSDDraft создайте черновик определения сервиса. Помните, что Описание (Description) элемента, Сводка (Summary) и Теги (Tags) во входном документе карты перезаписываются значениями параметров summary и tags. Далее, вам необходимо проанализировать черновик определения сервиса на наличие проблем, способных нарушить его успешную публикацию. После анализа черновика определения сервиса и устранения ошибок можно подготовить определение сервиса. В ходе подготовки в черновике определения сервиса консолидируется вся информация, необходимая для публикации сервиса в полном определении сервиса. Воспользуйтесь инструментом геообработки Сервис подготовки (Stage Service) для подготовки определения сервиса. Наконец, запустите инструмент геообработки Передать определение сервиса (Upload Service Definition) для отправки определения сервиса на сервер и публикации картографического сервиса.

import arcpy

# define local variables
wrkspc = 'C:/Project/'
mapDoc = arcpy.mapping.MapDocument(wrkspc + 'counties.mxd')
con = 'GIS Servers/arcgis on MyServer_6080 (publisher).ags' 
service = 'Counties'
sddraft = wrkspc + service + '.sddraft'
sd = wrkspc + service + '.sd'
summary = 'Population Density by County'
tags = 'county, counties, population, density, census'

# create service definition draft
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER', 
                                          con, True, None, summary, tags)

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # Execute StageService
    arcpy.StageService_server(sddraft, sd)
    # Execute UploadServiceDefinition
    arcpy.UploadServiceDefinition_server(sd, con)
else: 
    # if the sddraft analysis contained errors, display them
    print analysis['errors']
Пример CreateMapSDDraft 2

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем печатается словарь Python, состоящий из ошибок, предупреждений и информационных сообщений от функции CreateSDDraft. Аналитическая информация в словаре Python позволяет определить потенциальные проблемы с производительностью и ошибки карты, которые необходимо устранить до создания файла определения сервиса (.sd). Этот скрипт также показывает, как создать проект определения сервиса без указания сведений о подключении к серверу.

import arcpy

mapDoc = arcpy.mapping.MapDocument('C:/Project/counties.mxd') 
service = 'Counties'
sddraft = 'C:/Project/' + service + r'.sddraft'
        
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

for key in ('messages', 'warnings', 'errors'):
  print "----" + key.upper() + "---"
  vars = analysis[key]
  for ((message, code), layerlist) in vars.iteritems():
    print "    ", message, " (CODE %i)" % code
    print "       applies to:",
    for layer in layerlist:
        print layer.name,
    print
Пример CreateMapSDDraft 3

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (Map Document)(.mxd) для моих размещенных сервисов (My Hosted Services). Если проект определения сервиса не содержит ошибок анализа, он подготавливается с помощью инструмента геообработки Сервис стадий (Stage Service). Войти на портал (Sign In To Portal) можно использовать для входа на ArcGIS.com перед публикацией в размещенных сервисах с помощью инструмента геообработки Передать определение сервиса (Upload Service Definition).

import arcpy

mapDoc = arcpy.mapping.MapDocument('C:/Project/counties.mxd') 
service = 'Counties'
sddraft = 'C:/Project/{}.sddraft'.format(service)
sd = 'C:/Project/{}.sd'.format(service)

# create service definition draft
analysis = arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'MY_HOSTED_SERVICES')

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # create service definition
    arcpy.StageService_server(sddraft, sd)
    # if required, sign in to My Hosted Services
    arcpy.SignInToPortal_server('username', 'password', 'http://www.arcgis.com/')
    # publish to My Hosted Services
    arcpy.UploadServiceDefinition_server(sd, 'My Hosted Services')
else: 
    # if the sddraft analysis contained errors, display them
    print analysis['errors']
Пример изменения SDDraft 1

Следующий скрипт изменяет элемент Item Information Description, используя стандартную библиотеку Python xml.dom.minidom. Затем измененный проект определения сервиса (.sddraft) сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
# the new description
newDesc = 'US Counties Map'
xml = r"C:\Project\Counties.sddraft"
doc = DOM.parse(xml)
# find the Item Information Description element 
descriptions = doc.getElementsByTagName('Description')
for desc in descriptions:
    if desc.parentNode.tagName == 'ItemInfo':
        # modify the Description
        if desc.hasChildNodes():
            desc.firstChild.data = newDesc
        else:
            txt = doc.createTextNode(newDesc)
            desc.appendChild(txt)
# output to a new sddraft
outXml = r"C:\Project\Output\CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze the new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 2

Следующий скрипт изменяет элемент Staging Settings TextAntialiasingMode, используя стандартную библиотеку Python xml.dom.minidom. Затем измененный проект определения сервиса (.sddraft) сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
# the new TextAntiAliasingMode value
newTextAntialiasingMode = 'Normal'
xml = r"C:\Project\Counties.sddraft"
doc = DOM.parse(xml)
keys = doc.getElementsByTagName('Key')
for key in keys:
    if key.hasChildNodes():
        if key.firstChild.data == 'textAntialiasingMode':
	    # modify the TextAntiAliasingMode value
	    key.nextSibling.firstChild.data = newTextAntialiasingMode
			
# output to a new sddraft
outXml = r"C:\Project\Output\CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()

# analyze the new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 3

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем активируются функции WMSServer и задается значение свойства Title за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Измененный файл .sddraft сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 

# Reference map document for CreateSDDraft function.
mapDoc = arcpy.mapping.MapDocument('C:/project/counties.mxd') 
# Create service and sddraft variables for CreateSDDraft function.
service = 'Counties'
sddraft = 'C:/Project/' + service + r'.sddraft'
  
# Create sddraft.
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# These are the properties we will change in the sddraft xml.
soe = 'WMSServer'
soeProperty = 'title'
soePropertyValue = 'USACounties'

# Read the sddraft xml.
doc = DOM.parse(sddraft)
# Find all elements named TypeName. This is where the server object extension (SOE) names are defined.
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    # Get the TypeName whose properties we want to modify.
    if typeName.firstChild.data == soe:
        extention = typeName.parentNode
        for extElement in extention.childNodes:
            # Enabled SOE.
            if extElement.tagName == 'Enabled':
                extElement.firstChild.data = 'true'
            # Modify SOE property. We have to drill down to the relevant property.
            if extElement.tagName == 'Props':
                for propArray in extElement.childNodes:
                    for propSet in propArray.childNodes:
                        for prop in propSet.childNodes:
                            if prop.tagName == "Key":
                                if prop.firstChild.data == soeProperty:
                                    if prop.nextSibling.hasChildNodes():
                                        prop.nextSibling.firstChild.data = soePropertyValue
                                    else:
                                        txt = doc.createTextNode(soePropertyValue)
                                        prop.nextSibling.appendChild(txt)
                                        
# Output to a new sddraft.
outXml = "C:/Project/Output/CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()       

# Analyze the new sddraft for errors.
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 4

Следующий скрипт создает файл проекта определения сервиса (.sddraft) из документа карты (.mxd). Затем отключаются функции KmlServer за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Измененный файл .sddraft сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 

# Reference map document for CreateSDDraft function.
mapDoc = arcpy.mapping.MapDocument('C:/project/counties.mxd')
# Create service and sddraft variables for CreateSDDraft function.
service = 'Counties'
sddraft = 'C:/Project/' + service + r'.sddraft'
 
# Create sddraft.
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# The Server Object Extention (SOE) to disable.
soe = 'KmlServer'

# Read the sddraft xml.
doc = DOM.parse(sddraft)
# Find all elements named TypeName. This is where the server object extension (SOE) names are defined.
typeNames = doc.getElementsByTagName('TypeName')
for typeName in typeNames:
    # Get the TypeName we want to disable.
    if typeName.firstChild.data == soe:
        extension = typeName.parentNode
        for extElement in extension.childNodes:
            # Disabled SOE.
            if extElement.tagName == 'Enabled':
                extElement.firstChild.data = 'false'
                                        
# Output to a new sddraft.
outXml = "C:/Project/Output/CountiesForWeb.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()       

# Analyze the new sddraft for errors.
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 5

Следующий скрипт создает файл проекта определения сервиса (Service Definition Draft)(.sddraft) для параметра server_type сервера пространственных данных (Spatial Data Server) из документа карты (Map Document)(.mxd). Функции сервиса по умолчанию меняются за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Измененный файл .sddraft сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 

# Reference map document for CreateSDDraft function.
mapDoc = arcpy.mapping.MapDocument('C:/project/SDS.mxd')
# Create service and sddraft variables for CreateSDDraft function.
service = 'CountiesSDS'
sddraft = 'C:/Project/{}.sddraft'.format(service)
 
# Create sddraft.
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'SPATIAL_DATA_SERVER')

# Read the sddraft xml.
doc = DOM.parse(sddraft)

# Get all the value tags.
values = doc.getElementsByTagName('Value')
for value in values:
    if value.hasChildNodes():
        # Change the default WebCapabilities from 'Query,Create,Update,Delete,Uploads,Editing' to just 'Query'.
        if value.firstChild.data == 'Query,Create,Update,Delete,Uploads,Editing':
            value.firstChild.data = 'Query'
                      
# Output to a new sddraft.
outXml = "C:/Project/Output/CountiesForSDS.sddraft"     
f = open(outXml, 'w')     
doc.writexml( f )     
f.close()       

# Analyze the new sddraft for errors.
analysis = arcpy.mapping.AnalyzeForSD(outXml)
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print
Пример изменения SDDraft 6

Следующий скрипт создает файл проекта определения сервиса (Service Definition Draft)(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты (Map Document)(.mxd). Затем включается кэширование для сервиса за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Измененный файл .sddraft сохраняется в новом файле. Затем новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD.

import arcpy
import xml.dom.minidom as DOM 
import os

# define local variables
wrkspc = 'C:/Project/'
mapDoc = arcpy.mapping.MapDocument(wrkspc + 'counties.mxd')
con = 'GIS Servers\arcgis on MyServer_6080 (admin).ags' 
service = 'Counties'
sddraft = wrkspc + service + '.sddraft'
sd = os.path.join(wrkspc, "output", service + '.sd')

# create sddraft
if os.path.exists(sddraft): os.remove(sddraft)
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# read sddraft xml
doc = DOM.parse(sddraft)

# turn on caching in the configuration properties
configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
    keyValues = propSet.childNodes
    for keyValue in keyValues:
        if keyValue.tagName == 'Key':
            if keyValue.firstChild.data == "isCached":
                # turn on caching
                keyValue.nextSibling.firstChild.data = "true"
                
# output to a new sddraft
outXml = "C:\Project\Output\CountiesForWeb.sddraft"   
if os.path.exists(outXml): os.remove(outXml)
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)

# print dictionary of messages, warnings and errors
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print

del f, doc, mapDoc
Пример изменения SDDraft 7

Следующий скрипт создает файл проекта определения сервиса (Service Definition Draft)(.sddraft) для параметра server_type ARCGIS_SERVER из документа карты (Map Document)(.mxd). Затем включается кэширование для сервиса за счет изменения файла .sddraft с помощью стандартной библиотеки Python xml.dom.minidom. Измененный файл .sddraft сохраняется в новом файле. Новый файл .sddraft анализируется на наличие ошибок с помощью функции AnalyzeForSD. После анализа черновика определения сервиса можно подготовить определение сервиса. Воспользуйтесь инструментом геообработки Сервис подготовки (Stage Service) для подготовки определения сервиса. Запустите инструмент геообработки Передать определение сервиса (Upload Service Definition) для отправки определения сервиса на сервер и публикации картографического сервиса. После публикации сервиса скрипт вызывает инструмент геообработки Управление масштабами кэша картографического сервиса (Manage Map Server Cache Scales), который обновляет уровни масштабов в существующем кэшированном картографическом сервисе или сервисе изображений. Используйте этот инструмент для добавления или удаления масштабов из кэша. Наконец, скрипт вызывает инструмент геообработки Управление листами кэша картографического сервера (Manage Map Server Cache Tiles) для построения листов кэша картографического сервиса.

import arcpy
import xml.dom.minidom as DOM 
import os

# define local variables
wrkspc = 'C:/Project/'
mapDoc = arcpy.mapping.MapDocument(wrkspc + 'counties.mxd')
con = "GIS Servers\\arcgis on MyServer_6080 (admin).ags"
service = 'Counties'
sddraft = wrkspc + service + '.sddraft'
sd = os.path.join(wrkspc, "output", service + '.sd')

# create sddraft
if os.path.exists(sddraft): os.remove(sddraft)
arcpy.mapping.CreateMapSDDraft(mapDoc, sddraft, service, 'ARCGIS_SERVER')

# read sddraft xml
doc = DOM.parse(sddraft)

# turn on caching in the configuration properties
configProps = doc.getElementsByTagName('ConfigurationProperties')[0]
propArray = configProps.firstChild
propSets = propArray.childNodes
for propSet in propSets:
    keyValues = propSet.childNodes
    for keyValue in keyValues:
        if keyValue.tagName == 'Key':
            if keyValue.firstChild.data == "isCached":
                # turn on caching
                keyValue.nextSibling.firstChild.data = "true"
                
# output to a new sddraft
outXml = "C:/Project/Output/CountiesForWeb.sddraft"   
if os.path.exists(outXml): os.remove(outXml)
f = open(outXml, 'w')     
doc.writexml( f )     
f.close() 

# analyze new sddraft for errors
analysis = arcpy.mapping.AnalyzeForSD(outXml)

# print dictionary of messages, warnings and errors
for key in ('messages', 'warnings', 'errors'):
    print "----" + key.upper() + "---"
    vars = analysis[key]
    for ((message, code), layerlist) in vars.iteritems():
        print "    ", message, " (CODE %i)" % code
        print "       applies to:",
        for layer in layerlist:
            print layer.name,
        print

# stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
    # Execute StageService
    if os.path.exists(sd): os.remove(sd)
    arcpy.StageService_server(outXml, sd)
    # Execute UploadServiceDefinition
    print "Uploading Service Definition..."
    arcpy.UploadServiceDefinition_server(sd, con)
    # Print messaging from UploadServiceDefinition
    x = 0
    while x < arcpy.GetMessageCount():
        arcpy.AddReturnMessage(x)
        x = x + 1
else: 
    print "{} contained errors. StageService and UploadServiceDefinition aborted.".format(sddraft)
    exit()
    
print "Updating cache scales..."
scaleValues = "100000000;10000000;5000000;1000000;500000;250000;125000;64000;5250"
arcpy.ManageMapServerCacheScales_server("{}\\{}.MapServer".format(con[:-4], service), scaleValues)

print "Creating tiles..."
arcpy.ManageMapServerCacheTiles_server("{}\\{}.MapServer".format(con[:-4], service), "100000000", 
                                       "Recreate All Tiles", "3")
  
del f, doc, mapDoc
9/11/2013