All Downloads are FREE. Search and download functionalities are using the official Maven repository.

hudson.cli.UpdateJobCommand Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 *
 * Copyright (c) 2004-2010, Oracle Corporation.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *
 *
 *
 *
 *******************************************************************************/ 

package hudson.cli;

import hudson.model.Hudson;
import hudson.Extension;
import hudson.XmlFile;
import static hudson.cli.CreateJobCommand.isGoodName;
import hudson.model.Item;
import hudson.model.Items;
import hudson.model.Job;
import hudson.model.TopLevelItem;
import hudson.util.IOUtils;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import org.eclipse.hudson.security.team.Team;
import org.eclipse.hudson.security.team.TeamManager;
import org.eclipse.hudson.security.team.TeamManager.TeamNotFoundException;
import org.kohsuke.args4j.Argument;

/**
 * Updates or creates a job by reading stdin as a configuration XML file.
 *
 * @author Henrik Lynggaard Hansen
 */
@Extension
public class UpdateJobCommand extends CLICommand {

    @Override
    public String getShortDescription() {
        return "Updates and potentionally creates a job by reading stdin as a configuration XML file.";
    }
    // ?? name needs to be unqualified for create or qualified for update
    @Argument(metaVar = "NAME", usage = "Name of the job to update. Provide team qualified name if Team Management is enabled. Ex: team1.job1.", required = true)
    public String name;
    @Argument(metaVar = "CREATE", usage = "Create the job if needed, true|false", index = 1, required = true)
    public Boolean create;
    @Argument(metaVar = "TEAM", usage = "Team to create the job in (optional)", index = 2, required = false)
    public String team;

    protected int run() throws Exception {
        Team targetTeam = validateTeam(team, create, stderr);
        Hudson h = Hudson.getInstance();
        TeamManager teamManager = h.getTeamManager();
        
        if (team != null && targetTeam == null) {
            return -1;
        }

        String qualifiedJobName = !create ? name :
                (targetTeam == null
                    ? getNewJobName(name)
                    : teamManager.getRawTeamQualifiedJobName(targetTeam, name));
        TopLevelItem item = h.getItem(qualifiedJobName);

        if (item == null && !create) {
            stderr.println("Job '" + qualifiedJobName + "' does not exist and create is set to false");
            return -1;
        } else if (item != null && create) {
            stderr.println("Job '" + qualifiedJobName + "' already exists and create is set to true");
            return -1;
        }

        if (item == null) {
            name = name.trim();
            if (!isGoodName(name, stderr)) {
                return -1;
            }
            h.checkPermission(Item.CREATE);
            h.createProjectFromXML(name, team, stdin);
        } else {
            XmlFile oldConfigXml = null;
            Object oldItem = null;
            try {
                item.checkPermission(Job.CONFIGURE);
                File rootDirOfJob = teamManager.getRootFolderForJob(item.getName());
                // if the new config.xml is bad, need to restore the previous one
                oldConfigXml = Items.getConfigFile(rootDirOfJob);
                oldItem = oldConfigXml.read();
                // place it as config.xml
                File configXml = oldConfigXml.getFile();
                IOUtils.copy(stdin, configXml);

                h.reloadProjectFromDisk(configXml.getParentFile());
            } catch (IOException e) {
                if (oldConfigXml != null && oldItem != null) {
                    oldConfigXml.write(oldItem);
                }
                throw e;
            }
        }
        return 0;
    }
    
    /**
     * If team management enabled, return qualified job name;
     * otherwise, just the name.
     * @param name job name specified
     * @return job name that will be created
     */
    public static String getNewJobName(String name) {
        TeamManager teamManager = Hudson.getInstance().getTeamManager();
        if (teamManager.isTeamManagementEnabled()) {
            return teamManager.getRawTeamQualifiedJobName(name);
        }
        return name;
    }
    
    /**
     * Validate team exists and user can access it.
     * 
     * @param team team name
     * @param create true if create new job
     * @param stderr
     * @return 
     */
    public static Team validateTeam(String team, boolean create, PrintStream stderr) {
        Hudson h = Hudson.getInstance();
        TeamManager teamManager = h.getTeamManager();
        Team targetTeam = null;
        if (team != null) {
            if (!create) {
                stderr.println("team may only be used for create - for update use fully qualified name");
            } else if (!teamManager.isTeamManagementEnabled()) {
                stderr.println("team may not be specified unless team management is enabled");
            } else {
                try {
                    // check team exists first for better error message
                    targetTeam = teamManager.findTeam(team);
                    if (!teamManager.isCurrentUserHasAccessToTeam(team)) {
                        stderr.println("Current user does not have access to team "+team);
                        targetTeam = null;
                    }
                } catch (TeamNotFoundException e) {
                    stderr.println("Team "+team+" does not exist");
                }
            }
        }
        return targetTeam;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy