Added aptly patch create pipeline

Related: PROD-17118

Change-Id: Ic6cb3082c92e682179f00f25dd923a64f4afb675
diff --git a/create-aptly-patch.groovy b/create-aptly-patch.groovy
new file mode 100644
index 0000000..cf076eb
--- /dev/null
+++ b/create-aptly-patch.groovy
@@ -0,0 +1,83 @@
+/**
+ *
+ * Create Aptly patch
+ *
+ * Expected parameters:
+ * REPO_LIST - YAML with structure of repositories.
+ *           Example: mcp-updates-2018.1-xenial:
+ *                      url: http://apt.mirantis.com/xenial
+ *                      keyurl: http://apt.mirantis.com/public.gpg
+ *                      distribution: nightly
+ *                      component: salt
+ *                      packages: all
+ *                    mcp-updates-2017.12-xenial:
+ *                      url: http://apt.mirantis.com/xenial
+ *                      distribution: "2017.12"
+ *                      component: salt
+ *                      insecure: true
+ *                      packages:
+ *                        - salt-formula-salt
+ *                        - salt-formula-nginx
+ * UPLOAD_URL - URL of an WebDAV used to upload the image after creating.
+ * PATCH_NAME - Name of file which will be uploaded to UPLOAD_URL.
+ *
+ */
+
+common = new com.mirantis.mk.Common()
+img = null
+timeout(time: 12, unit: 'HOURS') {
+    node(){
+        try {
+            def reposYaml = readYaml text:"${REPO_LIST}"
+            def repos = reposYaml.values()
+            def insecure = ""
+            img = docker.image("ubuntu:xenial")
+            img.pull()
+
+            img.inside("-u root:root --hostname=apt-mirror --ulimit nofile=4096:8192") {
+                stage("Create patch"){
+                    sh("apt-get update;apt-get install -y curl")
+                    sh("mkdir -p ${PATCH_NAME}")
+                    for(i = 0; i < reposYaml.size(); i++){
+                        repo = repos[i]
+                        repoName = reposYaml.keySet()[i]
+
+                        sh("mkdir -p ${PATCH_NAME}/${repoName}")
+                        sh("echo 'deb ${repo.url} ${repo.distribution} ${repo.component}' > /etc/apt/sources.list")
+                        if(repo.keyurl != null){
+                            sh("curl -L ${repo.keyurl} | apt-key add -")
+                        }else if(repo.insecure == true){
+                            insecure = "--allow-unauthenticated"
+                        }
+                        sh("apt-get clean")
+                        sh("apt-get ${insecure} update")
+                        if(repo.packages == "all"){
+                            sh("cd ${PATCH_NAME}/${repoName};curl -s -H 'User-Agent: Debian APT-HTTP/1.3' ${repo.url}/dists/${repo.distribution}/${repo.component}/binary-amd64/Packages | grep Package: | uniq | sed 's/^\\(Package: \\)*//' | grep -E '*' | xargs -n 1 apt-get -y ${insecure} download")
+                        }else{
+                            for(pkg in repo.packages){
+                                sh("cd ${PATCH_NAME}/${repoName};apt-get -y ${insecure} download ${pkg}")
+                            }
+                        }
+                    }
+                }
+                stage("Upload patch"){
+                    sh("tar -czvf ${PATCH_NAME}.tar.gz -C ${PATCH_NAME} .")
+                    sh("curl ${SCRIPT_URL} --output aptly-add-packages.sh")
+                    sh("cat aptly-add-packages.sh ${PATCH_NAME}.tar.gz > ${PATCH_NAME}.sh")
+                    sh("curl -f -T ${PATCH_NAME}.sh ${UPLOAD_URL}")
+                    sh("rm -rf ./*")
+                }
+            }
+        } catch (Throwable e) {
+            // If there was an error or exception thrown, the build failed
+            currentBuild.result = "FAILURE"
+            throw e
+        }finally{
+            stage("Cleanup"){
+                img.inside("-u root:root --hostname=apt-mirror --ulimit nofile=4096:8192") {
+                    sh("rm -rf ./*")
+                }
+            }
+        }
+    }
+}
\ No newline at end of file