This is part 2 of my two part blog post on
Job System Easter Eggs (hidden features). The two features being covered are:
- New Job progress tracking UI
- Import/Export of job definitions
In the previous post, I talked about the new UI while in this post I will cover import and export for job definitions.
2. Import/Export of job definitions
The ability to export and import job definitions across EM environments has been a popular enhancement request for quite some time. There are 3 primary drivers:
- Test to Production: Moving active and library job definitions from test site to production
- Migration: Move job definitions across EM versions. This is often used as an alternative to upgrade.
- As Failsafe: For that extra protection, in addition to repository backups. This can be useful for selective restoration of job definition.
In the first iteration, we are exposing these functions as emcli verbs. Since these emcli verbs are not formally supported in the release, no documentation is included in the EMCLI Reference Guide. So to learn more about them,
we will have to look at emcli help. The two verbs are called
export_jobs, and import_jobs.
>> ./emcli help | grep _jobs

Some salient points about the import & export verbs are.
Export:
- Rich filter criteria to form the list of jobs to export
- Active and Library jobs can be exported
- Preview mode, to view results before exporting them
- Job definitions are exported as zip files for ease of transfer
- Contextual information like targets, credentials, access settings, etc is exported, but not imported. In future, we may be able to support import for this information as well.
- System jobs and nested jobs are not exported
Import:
- Special Preview mode to view contents of the exported file, and to determine possible conflicts during import
- Rich filter criteria to selectively import job definitions from the exported file
- Job definitions are imported to the library ONLY. This is true even if an active job was exported
- Two failure modes – skip on error, and rollback on error
- Import only works on same or higher version of EM12c. The patch set number matters.
Export Job Definitions
Let’s walk through an example.
1. We start with export_jobs. The help for this verb will show you all the available options. Most of the filters are self explanatory, so i will skip the explanation. The most important option of all is the -preview flag. This when used in conjunction with other filters, will show results without exporting the job definitions.
>> ./emcli help export_jobs
emcli export_jobs
[-name=”job name1;job name2;…”]
[-type=”job type1;job type2;…”]
[-targets=”tname1:ttype1;tname2:ttype2;…”]
[-owner=”owner1;owner2;…”]
[-preview]
-export_file=<Zip filename that will be created>”
-libraryjobs
2. Now lets play with this verb. If we invoke the verb with just the -preview flag, it will list all job definitions that can be exported both that are active, and from the library. Note: system jobs and nested jobs are skipped from this output.
>> ./emcli export_jobs -preview

Not all job types are exportable. To determine the list of job types supported via the import and export verbs, use the get_job_types verb.
>> ./emcli get_job_types
Currently, there are over 50 job types supported, and this list will continue to grow with every release.
3. From the list above, I am primarily interested in jobs that are created by the user AFULAY. So I apply the -owner filter.
>> ./emcli export_jobs -owner=AFULAY -preview

In this output i see 2 jobs, ‘Library Job’ which is a simple OS command job stored in the job library, while the ‘Test Job’ is an active OS command job scheduled against a bunch of targets.
Note: if multiple options are specified, like -name and -owner, then these are ANDed together.
4. Since i am the lazy kind, i would rather export every thing and then later decide what i wish to import. So here it goes. The -export_file option takes the location and file name for the export file. Note the actual output file is an xml that contains job metadata, but the export file is always archived and stored in a zip format. At this time, I am sure most would instinctively unzip the file and start perusing through its contents, but doing so would be analogous to removing the warranty void sticker of your new TV or Blue Ray player. Basically, attempts to manually modify the contents of the exported zip file is highly discouraged.
>> ./emcli export_jobs -export_file=/tmp/afulay_alljobs.zip

Note how the status column reports success or failure for each job being exported. With the file exported, we now move on to the import verb.
Import Job Definitions
In the previous section, we exported a file with all job definitions in it. Now lets say we share this file with bunch of other admins and ask them to import whatever job definitions that make sense or are relevant to their environment.
1. To understand the capabilities of the import verb, we take a look at the help content.
>> ./emcli help import_jobs
emcli import_jobs
[-name=”job name1;job name2;…”]
[-type=”job type1;job type2;…”]
[-targets=”tname1:ttype1;tname2:ttype2;…”]
[-owner=”owner1;owner2;…”]
[-preview]
[-force]
[-stoponerror]
-import_file=<Zip filename that contains job definitions>”
Most of the options are quite similar to export_jobs barring a few. The -force flag allows the admin to update an existing job definition. Typically, you will run into these situations when a conflicting job is found in the new environment, and you want to either update its definition with the new version in the import file or overwrite the localized changes. The -stoponerror flag, when specified, will stop the import process on first encountered failure, and then rollback all jobs imported in the session. We will likely change this label to rollbackonerror to correctly represent its behavior. The default behavior is to skip failed jobs and continue importing others.
2. Before our admins import job definitions, they first need to view the contents of the exported file. This again can be done using the -preview option.
>> ./emcli import_jobs -preview -import_file=/tmp/afulay_alljobs.zip

The -preview option in the import verb is very special. It not only just lists the contents of the exported file, but also connects to the new EM environment and looks for potential conflicts during import. So this is a deep validation test. As seen in the above screenshot, there are two sections in the output, first is just a listing of all job definitions from the import file, while the second is a list of all conflicts. Note: for demo sake, i am exporting and importing to the same EM site, and hence every job shows up as a conflict. To address this issue, i will eventually delete the ‘Library Job’ from my job library, and import it from the import file.
Disclaimer:
In the interest of full disclosure, i should mention that there are few known bugs for the import verb, hence the rationale for not releasing these verbs formally with EM12c R4. Some bugs i ran into when writing this blog were:
- you cannot export an active job, delete it, and import it back to the same EM environment, this currently is only possible with library jobs. This is an obscure case though.
- The -force flag is a little flaky, so sometimes it wouldn’t force import even if you want it to
- The -owner flag does not work on the import file, it instead will throw an exception
That said, when the job does get imported, it does so properly, so there is never any risk of metadata corruption. |
3. If i try to import the ‘Library Job’, the verb will fail and give me an error message.
>> ./emcli import_jobs -name=’LIBRARY JOB’ -import_file=/tmp/afulay_alljobs.zip

The Status column reports Error, while the Notes column gives the reason as ‘job already exists’.
4. Now lets delete the library job and try to import it.
>> ./emcli delete_library_job -name=’LIBRARY JOB’
>> ./emcli import_jobs -name=’LIBRARY JOB’ -import_file=/tmp/afulay_alljobs.zip

Success!!We were able to delete the library job, and import it back from the import file.
In summary, there two very useful enhancements made in EM12c R4. Unfortunately, due to time constraints and our inability to meet the set quality standards, we decided to ship these features in disabled state. This ensures that production sites and users are not impacted, while still giving the few brave souls the opportunity to test these features. In my assessment, i have found the new UI to be fairly robust as i have been using this exclusively for a while. On the other hand, there are few known bugs with the import and export emcli verbs, so use these with caution.