@Override
  public void onDeployClicked() {
    Promise<Project> projectPromise;
    view.showLoader(true);
    switch (view.getMode()) {
      case CREATE_NEW_PROJECT:
        String osProjectName = view.getOpenShiftProjectName();
        String osProjectDisplayName = view.getOpenShiftProjectDisplayName();
        String osProjectDescription = view.getOpenShiftProjectDescription();
        // create new project
        ProjectRequest request =
            newDto(ProjectRequest.class)
                .withApiVersion(API_VERSION)
                .withDisplayName(osProjectDisplayName)
                .withDescription(osProjectDescription)
                .withMetadata(newDto(ObjectMeta.class).withName(osProjectName));
        projectPromise = osService.createProject(request);
        break;
      case SELECT_EXISTING_PROJECT:
      default:
        Project osSelectedProject = view.getOpenShiftSelectedProject();
        projectPromise = Promises.resolve(osSelectedProject);
    }

    projectPromise
        .then(
            new Operation<Project>() {
              @Override
              public void apply(final Project project) throws OperationException {
                final Map<String, String> labels = new HashMap<>();
                labels.put("generatedby", "Che");
                labels.put("application", osAppName);

                for (KeyValue label : view.getLabels()) {
                  labels.put(label.getKey(), label.getValue());
                }

                final DockerImageMetadata imageMetadata =
                    osActiveStreamTag.getImage().getDockerImageMetadata();
                Object exposedPorts =
                    (imageMetadata.getConfig() != null)
                        ? imageMetadata.getConfig().getExposedPorts()
                        : imageMetadata.getContainerConfig().getExposedPorts();
                List<ContainerPort> ports = parsePorts(exposedPorts);

                String namespace = project.getMetadata().getName();
                List<Promise<?>> promises = new ArrayList<>();
                promises.add(osService.createImageStream(generateImageStream(namespace, labels)));
                promises.add(osService.createBuildConfig(generateBuildConfig(namespace, labels)));
                promises.add(
                    osService.createDeploymentConfig(generateDeploymentConfig(namespace, labels)));
                promises.add(osService.createRoute(generateRoute(namespace, labels)));

                if (!ports.isEmpty()) {
                  promises.add(
                      osService.createService(
                          generateService(namespace, getFirstPort(ports), labels)));
                }

                Promises.all(promises.toArray(new Promise[promises.size()]))
                    .then(
                        new Operation<JsArrayMixed>() {
                          @Override
                          public void apply(JsArrayMixed arg) throws OperationException {
                            view.showLoader(false);
                            view.hide();
                            notificationManager.notify(
                                locale.deployProjectSuccess(
                                    appContext.getCurrentProject().getRootProject().getName()),
                                SUCCESS,
                                true);
                            setupMixin(project);
                          }
                        })
                    .catchError(
                        new Operation<PromiseError>() {
                          @Override
                          public void apply(PromiseError arg) throws OperationException {
                            handleError(arg);
                          }
                        });
              }
            })
        .catchError(
            new Operation<PromiseError>() {
              @Override
              public void apply(PromiseError arg) throws OperationException {
                handleError(arg);
              }
            });
  }