Search

Clear filter
Announcement
Thomas Dyar · Dec 14, 2021

InterSystems IRIS and IRIS for Health 2021.2 preview is published

Preview releases are now available for the 2021.2 version of InterSystems IRIS, IRIS for Health, and HealthShare Health Connect. As this is a preview release, we are eager to learn from your experiences with this new release ahead of its General Availability release next month. Please share your feedback through the Developer Community so we can build a better product together. InterSystems IRIS Data Platform 2021.2 makes it even easier to develop, deploy and manage augmented applications and business processes that bridge data and application silos. It has many new capabilities including: Enhancements for application and interface developers, including: Embedded Python Interoperability Productions in Python Updates to Visual Studio Code ObjectScript Extension Pack New Business Services and operations added allowing users to set and run SQL query with minimal custom coding Enhancements for Analytics and AI, including: New SQL LOAD command efficiently loads CSV and JDBC source data into tables Enhancements to Adaptive Analytics Enhancements for Cloud and Operations tasks, including: New Cloud Connectors make it simple to access and use cloud services within InterSystems IRIS applications IKO enhancements improve manageability of Kubernetes resources Enhancements for database and system administrators, including: Online Shard Rebalancing automates distribution of data across nodes without interrupting operations Adaptive SQL engine uses fast block sampling and automation to collect advanced table statistics and leverages runtime information for improved query planning Storage needs for InterSystems IRIS are reduced with new stream and journal file compression settings Support for TLS 1.3 and OpenSSL 1.1.1, using system-provided libraries New ^TRACE utility reports detailed process statistics such as cache hits and reads More details on all of these features can be found in the product documentation: InterSystems IRIS 2021.1 documentation and release notes InterSystems IRIS for Health 2021.1 documentation and release notes HealthShare Health Connect 2021.1 documentation and release notes InterSystems IRIS 2021.2 is a Continuous Delivery (CD) release, which now comes with classic installation packages for all supported platforms, as well as container images in OCI (Open Container Initiative) a.k.a. Docker container format. Container images are available for OCI compliant run-time engines for Linux x86-64 and Linux ARM64, as detailed in the Supported Platforms document. Full installation packages for each product are available from the WRC's product download site. Using the "Custom" installation option enables users to pick the options they need, such as InterSystems Studio and IntegratedML, to right-size their installation footprint. Installation packages and preview keys are available from the WRC's preview download site. Container images for the Enterprise Edition, Community Edition and all corresponding components are available from the InterSystems Container Registry using the following commands: docker pull containers.intersystems.com/intersystems/iris:2021.2.0.617.0 docker pull containers.intersystems.com/intersystems/iris-ml:2021.2.0.617.0 docker pull containers.intersystems.com/intersystems/irishealth:2021.2.0.617.0 docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.2.0.617.0 For a full list of the available images, please refer to the ICR documentation. Alternatively, tarball versions of all container images are available via the WRC's preview download site. The build number for this preview release is 2021.2.0.617.0. Interoperability productions with Python and Cloud connectors? YEEEESSSSSSS. However, containers.intersystems.com is giving up bad credentials.... or am I the sole brunt of cruelty here? ``` (base) sween @ dimsecloud-pop-os ~ └─ $ ▶ docker login -u="ron.sweeney@integrationrequired.com" containers.intersystems.com Password: Error response from daemon: Get https://containers.intersystems.com/v2/: unauthorized: BAD_CREDENTIAL ``` I was able to get in, for example: $ docker-ls tags --registry https://containers.intersystems.com intersystems/irishealth ... requesting list . done repository: intersystems/irishealth tags: - 2019.1.1.615.1 - 2020.1.0.217.1 - 2020.1.1.408.0 - 2020.2.0.211.0 - 2020.3.0.221.0 - 2020.4.0.547.0 - 2021.1.0.215.0 - 2021.2.0.617.0 No problem: download from wrc>previews some .tar.gz docker load -i <downloaded> ... off it goes with Docker run or Dockerfile + docker-compose And here it is, containers.intersystems.com gone $ docker pull containers.intersystems.com/intersystems/irishealth-community:2021.2.0.617.0 Error response from daemon: Get "https://containers.intersystems.com/v2/": Service Unavailable Could you push those images to the docker hub, as usual before? It's more stable. Hi Dmitry, Thanks for the heads-up, we are working to bring containers.intersystems.com back online. The docker hub listings will be updated with the 2021.2 preview images in the next day or so, and we will update this announcement when they're available! Kind Regards,Thomas Dyar Good news -- containers.intersystems.com is back online. Please let us know if you encounter any issues! Regards, Thomas Dyar And images with ZPM package manager 0.3.2 are available accordingly: intersystemsdc/iris-community:2021.2.0.617.0-zpm intersystemsdc/iris-ml-community:2021.2.0.617.0-zpm intersystemsdc/iris-community:2021.1.0.215.3-zpm intersystemsdc/irishealth-community:2021.1.0.215.3-zpm intersystemsdc/irishealth-ml-community:2021.1.0.215.3-zpm intersystemsdc/irishealth-community:2021.1.0.215.3-zpm And to launch IRIS do: docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2021.2.0.617.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-ml-community:2021.2.0.617.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/iris-community:2021.2.0.617.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2021.2.0.617.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-ml-community:2021.2.0.617.0-zpm docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community:2021.2.0.617.0-zpm And for terminal do: docker exec -it my-iris iris session IRIS and to start the control panel: http://localhost:9092/csp/sys/UtilHome.csp To stop and destroy container do: docker stop my-iris And the FROM clause in dockerfile can look like: FROM intersystemsdc/iris-community:2021.2.0.617.0-zpm Or to take the latest image: FROM intersystemsdc/iris-community Excellent! That's comfort. Available on Docker Hub too. Will we have an arm64 version? I was trying to install the preview version on Ubuntu 20.04.3 LTS ARM64(in a VM on Mac M1). But irisintall gave the the following error. Installing zlib1g-dev did not solve the problem. Could anyone suggest me what I was missing? ----- Your system type is 'Ubuntu LTS (ARM64)'. zlib1g version 1 is required. ** Installation aborted ** Based on the msg alone , would need: sudo apt install zlib1g Instead of: sudo apt install zlib1g-dev Thanks. But looks like zlib1g is already installed.. $ sudo apt install zlib1g Reading package lists... Done Building dependency tree Reading state information... Done zlib1g is already the newest version (1:1.2.11.dfsg-2ubuntu1.2). 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. I know this is not the proper way to do it, but I worked around this issue by deleting the line for zlib1g in the file, package/requirements_check/requirements.lnxubuntu2004arm64.isc. Looks like the instance is working fine, so I suspect there is something wrong with requirement checking in installation.
Article
Mikhail Khomenko · Nov 25, 2020

InterSystems Kubernetes Operator Deep Dive: Introduction to Kubernetes Operators

IntroductionSeveral resources tell us how to run IRIS in a Kubernetes cluster, such as Deploying an InterSystems IRIS Solution on EKS using GitHub Actions and Deploying InterSystems IRIS solution on GKE Using GitHub Actions. These methods work but they require that you create Kubernetes manifests and Helm charts, which might be rather time-consuming.To simplify IRIS deployment, InterSystems developed an amazing tool called InterSystems Kubernetes Operator (IKO). A number of official resources explain IKO usage in details, such as New Video: Intersystems IRIS Kubernetes Operator and InterSystems Kubernetes Operator.Kubernetes documentation says that operators replace a human operator who knows how to deal with complex systems in Kubernetes. They provide system settings in the form of custom resources. An operator includes a custom controller that reads these settings and performs steps the settings define to correctly set up and maintain your application. The custom controller is a simple pod deployed in Kubernetes. So, generally speaking, all you need to do to make an operator work is deploy a controller pod and define its settings in custom resources.You can find high-level explanation of operators in How to explain Kubernetes Operators in plain English. Also, a free O’Reilly ebook is available for download.In this article, we’ll have a closer look at what operators are and what makes them tick. We’ll also write our own operator. Prerequisites and Setup To follow along, you’ll need to install the following tools: kind $ kind --version kind version 0.9.0 golang $ go version go version go1.13.3 linux/amd64 kubebuilder $ kubebuilder version Version: version.Version{KubeBuilderVersion:"2.3.1"… kubectl $ kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.11"... operator-sdk $ operator-sdk version operator-sdk version: "v1.2.0"… Custom Resources API resources is an important concept in Kubernetes. These resources enable you to interact with Kubernetes via HTTP endpoints that can be grouped and versioned. The standard API can be extended with custom resources, which require that you provide a Custom Resource Definition (CRD). Have a look at the Extend the Kubernetes API with CustomResourceDefinitions page for detailed info.Here is an example of a CRD: $ cat crd.yaml apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: irises.example.com spec: group: example.com version: v1alpha1 scope: Namespaced names: plural: irises singular: iris kind: Iris shortNames: - ir validation: openAPIV3Schema: required: ["spec"] properties: spec: required: ["replicas"] properties: replicas: type: "integer" minimum: 0 In the above example, we define the API GVK (Group/Version/Kind) resource as example.com/v1alpha1/Iris, with replicas as the only required field.Now let’s define a custom resource based on our CRD: $ cat crd-object.yaml apiVersion: example.com/v1alpha1 kind: Iris metadata: name: iris spec: test: 42 replicas: 1 In our custom resource, we can define any fields in addition to replicas, which is required by the CRD.After we deploy the above two files, our custom resource should become visible to standard kubectl.Let’s launch Kubernetes locally using kind, and then run the following kubectl commands: $ kind create cluster $ kubectl apply -f crd.yaml $ kubectl get crd irises.example.com NAME CREATED AT irises.example.com 2020-11-14T11:48:56Z $ kubectl apply -f crd-object.yaml $ kubectl get iris NAME AGE iris 84s Although we’ve set a replica amount for our IRIS, nothing actually happens at the moment. It’s expected. We need to deploy a controller - the entity that can read our custom resource and perform some settings-based actions.For now, let’s clean up what we’ve created: $ kubectl delete -f crd-object.yaml $ kubectl delete -f crd.yaml Controller A controller can be written in any language. We’ll use Golang as Kubernetes’ “native” language. We could write a controller’s logic from scratch but the good folks from Google and RedHat gave us a leg up. They have created two projects that can generate the operator code that will only require minimum changes – kubebuilder and operator-sdk. These two are compared at the kubebuilder vs operator-sdk page, as well as here: What is the difference between kubebuilder and operator-sdk #1758. Kubebuilder It is convenient to start our acquaintance with Kubebuilder at the Kubebuilder book page. The Tutorial: Zero to Operator in 90 minutes video from the Kubebuilder maintainer might help as well. Sample implementations of the Kubebuilder project can be found in the sample-controller-kubebuilder and in kubebuilder-sample-controller repositories. Let’s scaffold a new operator project: $ mkdir iris $ cd iris $ go mod init iris # Creates a new module, name it iris $ kubebuilder init --domain myardyas.club # An arbitrary domain, used below as a suffix in the API group Scaffolding includes many files and manifests. The main.go file, for instance, is the entrypoint of code. It imports the controller-runtime library, instantiates and runs a special manager that keeps track of the controller run. Nothing to change in any of these files. Let’s create the CRD: $ kubebuilder create api --group test --version v1alpha1 --kind Iris Create Resource [y/n] y Create Controller [y/n] y … Again, a lot of files are generated. These are described in detail at the Adding a new API page. For example, you can see that a file for kind Iris is added in api/v1alpha1/iris_types.go. In our first sample CRD, we defined the required replicas field. Let’s create an identical field here, this time in the IrisSpec structure. We’ll also add the DeploymentName field. The replicas’ count should be also visible in the Status section, so we need to make the following changes: $ vim api/v1alpha1/iris_types.go … type IrisSpec struct { // +kubebuilder:validation:MaxLength=64 DeploymentName string `json:"deploymentName"` // +kubebuilder:validation:Minimum=0 Replicas *int32 `json:"replicas"` } … type IrisStatus struct { ReadyReplicas int32 `json:"readyReplicas"` } … After editing the API, we’ll move to editing the controller boilerplate. All the logic should be defined in the Reconcile method (this example is mostly taken from mykind_controller.go). We also add a couple of auxiliary methods and rewrite the SetupWithManager method. $ vim controllers/iris_controller.go … import ( ... // Leave the existing imports and add these packages apps "k8s.io/api/apps/v1" core "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/record" ) // Add the Recorder field to enable Kubernetes events type IrisReconciler struct { client.Client Log logr.Logger Scheme *runtime.Scheme Recorder record.EventRecorder } … // +kubebuilder:rbac:groups=test.myardyas.club,resources=iris,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=test.myardyas.club,resources=iris/status,verbs=get;update;patch // +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;delete // +kubebuilder:rbac:groups="",resources=events,verbs=create;patch func (r *IrisReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() log := r.Log.WithValues("iris", req.NamespacedName) // Fetch Iris objects by name log.Info("fetching Iris resource") iris := testv1alpha1.Iris{} if err := r.Get(ctx, req.NamespacedName, &iris); err != nil { log.Error(err, "unable to fetch Iris resource") return ctrl.Result{}, client.IgnoreNotFound(err) } if err := r.cleanupOwnedResources(ctx, log, &iris); err != nil { log.Error(err, "failed to clean up old Deployment resources for Iris") return ctrl.Result{}, err } log = log.WithValues("deployment_name", iris.Spec.DeploymentName) log.Info("checking if an existing Deployment exists for this resource") deployment := apps.Deployment{} err := r.Get(ctx, client.ObjectKey{Namespace: iris.Namespace, Name: iris.Spec.DeploymentName}, &deployment) if apierrors.IsNotFound(err) { log.Info("could not find existing Deployment for Iris, creating one...") deployment = *buildDeployment(iris) if err := r.Client.Create(ctx, &deployment); err != nil { log.Error(err, "failed to create Deployment resource") return ctrl.Result{}, err } r.Recorder.Eventf(&iris, core.EventTypeNormal, "Created", "Created deployment %q", deployment.Name) log.Info("created Deployment resource for Iris") return ctrl.Result{}, nil } if err != nil { log.Error(err, "failed to get Deployment for Iris resource") return ctrl.Result{}, err } log.Info("existing Deployment resource already exists for Iris, checking replica count") expectedReplicas := int32(1) if iris.Spec.Replicas != nil { expectedReplicas = *iris.Spec.Replicas } if *deployment.Spec.Replicas != expectedReplicas { log.Info("updating replica count", "old_count", *deployment.Spec.Replicas, "new_count", expectedReplicas) deployment.Spec.Replicas = &expectedReplicas if err := r.Client.Update(ctx, &deployment); err != nil { log.Error(err, "failed to Deployment update replica count") return ctrl.Result{}, err } r.Recorder.Eventf(&iris, core.EventTypeNormal, "Scaled", "Scaled deployment %q to %d replicas", deployment.Name, expectedReplicas) return ctrl.Result{}, nil } log.Info("replica count up to date", "replica_count", *deployment.Spec.Replicas) log.Info("updating Iris resource status") iris.Status.ReadyReplicas = deployment.Status.ReadyReplicas if r.Client.Status().Update(ctx, &iris); err != nil { log.Error(err, "failed to update Iris status") return ctrl.Result{}, err } log.Info("resource status synced") return ctrl.Result{}, nil } // Delete the deployment resources that no longer match the iris.spec.deploymentName field func (r *IrisReconciler) cleanupOwnedResources(ctx context.Context, log logr.Logger, iris *testv1alpha1.Iris) error { log.Info("looking for existing Deployments for Iris resource") var deployments apps.DeploymentList if err := r.List(ctx, &deployments, client.InNamespace(iris.Namespace), client.MatchingField(deploymentOwnerKey, iris.Name)); err != nil { return err } deleted := 0 for _, depl := range deployments.Items { if depl.Name == iris.Spec.DeploymentName { // Leave Deployment if its name matches the one in the Iris resource continue } if err := r.Client.Delete(ctx, &depl); err != nil { log.Error(err, "failed to delete Deployment resource") return err } r.Recorder.Eventf(iris, core.EventTypeNormal, "Deleted", "Deleted deployment %q", depl.Name) deleted++ } log.Info("finished cleaning up old Deployment resources", "number_deleted", deleted) return nil } func buildDeployment(iris testv1alpha1.Iris) *apps.Deployment { deployment := apps.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: iris.Spec.DeploymentName, Namespace: iris.Namespace, OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(&iris, testv1alpha1.GroupVersion.WithKind("Iris"))}, }, Spec: apps.DeploymentSpec{ Replicas: iris.Spec.Replicas, Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{ "iris/deployment-name": iris.Spec.DeploymentName, }, }, Template: core.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ "iris/deployment-name": iris.Spec.DeploymentName, }, }, Spec: core.PodSpec{ Containers: []core.Container{ { Name: "iris", Image: "store/intersystems/iris-community:2020.4.0.524.0", }, }, }, }, }, } return &deployment } var ( deploymentOwnerKey = ".metadata.controller" ) // Specifies how the controller is built to watch a CR and other resources // that are owned and managed by that controller func (r *IrisReconciler) SetupWithManager(mgr ctrl.Manager) error { if err := mgr.GetFieldIndexer().IndexField(&apps.Deployment{}, deploymentOwnerKey, func(rawObj runtime.Object) []string { // grab the Deployment object, extract the owner... depl := rawObj.(*apps.Deployment) owner := metav1.GetControllerOf(depl) if owner == nil { return nil } // ...make sure it's an Iris... if owner.APIVersion != testv1alpha1.GroupVersion.String() || owner.Kind != "Iris" { return nil } // ...and if so, return it return []string{owner.Name} }); err != nil { return err } return ctrl.NewControllerManagedBy(mgr). For(&testv1alpha1.Iris{}). Owns(&apps.Deployment{}). Complete(r) } To make the events logging work, we need to add yet another line to the main.go file: if err = (&controllers.IrisReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("Iris"), Scheme: mgr.GetScheme(), Recorder: mgr.GetEventRecorderFor("iris-controller"), }).SetupWithManager(mgr); err != nil { Now everything is ready to set up an operator.Let’s install the CRD first using the Makefile target install: $ cat Makefile … # Install CRDs into a cluster install: manifests kustomize build config/crd | kubectl apply -f - ... $ make install You can have a look at the resulting CRD YAML file in the config/crd/bases/ directory. Now check CRD existence in the cluster: $ kubectl get crd NAME CREATED AT iris.test.myardyas.club 2020-11-17T11:02:02Z Let’s run our controller in another terminal, locally (not in Kubernetes) – just to see if it actually works: $ make run ... 2020-11-17T13:02:35.649+0200 INFO controller-runtime.metrics metrics server is starting to listen {"addr": ":8080"} 2020-11-17T13:02:35.650+0200 INFO setup starting manager 2020-11-17T13:02:35.651+0200 INFO controller-runtime.manager starting metrics server {"path": "/metrics"} 2020-11-17T13:02:35.752+0200 INFO controller-runtime.controller Starting EventSource {"controller": "iris", "source": "kind source: /, Kind="} 2020-11-17T13:02:35.852+0200 INFO controller-runtime.controller Starting EventSource {"controller": "iris", "source": "kind source: /, Kind="} 2020-11-17T13:02:35.853+0200 INFO controller-runtime.controller Starting Controller {"controller": "iris"} 2020-11-17T13:02:35.853+0200 INFO controller-runtime.controller Starting workers {"controller": "iris", "worker count": 1} … Now that we have the CRD and the controller installed, all we need to do is create an instance of our custom resource. A template can be found in the config/samples/example.com_v1alpha1_iris.yaml file. In this file, we need to make changes similar to those in the crd-object.yaml: $ cat config/samples/test_v1alpha1_iris.yaml apiVersion: test.myardyas.club/v1alpha1 kind: Iris metadata: name: iris spec: deploymentName: iris replicas: 1 $ kubectl apply -f config/samples/test_v1alpha1_iris.yaml After a brief delay caused by the need to pull an IRIS image, you should see the running IRIS pod: $ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE iris 1/1 1 1 119s $ kubectl get pod NAME READY STATUS RESTARTS AGE iris-6b78cbb67-vk2gq 1/1 Running 0 2m42s $ kubectl logs -f -l iris/deployment-name=iris You can open the IRIS portal using the kubectl port-forward command: $ kubectl port-forward deploy/iris 52773 Go to http://localhost:52773/csp/sys/UtilHome.csp in your browser. What if we change the replicas’ count in CRD? Let’s make and apply this change: $ vi config/samples/test_v1alpha1_iris.yaml … replicas: 2 $ kubectl apply -f config/samples/test_v1alpha1_iris.yaml You should now see another Iris pod appear. $ kubectl get events … 54s Normal Scaled iris/iris Scaled deployment "iris" to 2 replicas 54s Normal ScalingReplicaSet deployment/iris Scaled up replica set iris-6b78cbb67 to 2 Log messages in the terminal where the controller in running report successful reconciliation: 2020-11-17T13:09:04.102+0200 INFO controllers.Iris replica count up to date {"iris": "default/iris", "deployment_name": "iris", "replica_count": 2} 2020-11-17T13:09:04.102+0200 INFO controllers.Iris updating Iris resource status {"iris": "default/iris", "deployment_name": "iris"} 2020-11-17T13:09:04.104+0200 INFO controllers.Iris resource status synced {"iris": "default/iris", "deployment_name": "iris"} 2020-11-17T13:09:04.104+0200 DEBUG controller-runtime.controller Successfully Reconciled {"controller": "iris", "request": "default/iris"} Okay, our controllers seem to be working. Now we’re ready to deploy that controller inside Kubernetes as a pod. For that, we need to create the controller docker container and push it to the registry. This can be any registry that works with Kubernetes – DockerHub, ECR, GCR, and so on. We’ll use the local (kind) Kubernetes, so let’s deploy the controller to the local registry using the kind-with-registry.sh script available from the Local Registry page. We can simply remove the current cluster and recreate it: $ kind delete cluster $ ./kind_with_registry.sh $ make install $ docker build . -t localhost:5000/iris-operator:v0.1 # Dockerfile is autogenerated by kubebuilder $ docker push localhost:5000/iris-operator:v0.1 $ make deploy IMG=localhost:5000/iris-operator:v0.1 The controller will be deployed into the IRIS-system namespace. Alternatively, you can scan all pods to find a namespace like kubectl get pod -A): $ kubectl -n iris-system get po NAME READY STATUS RESTARTS AGE iris-controller-manager-bf9fd5855-kbklt 2/2 Running 0 54s Let’s check the logs: $ kubectl -n iris-system logs -f -l control-plane=controller-manager -c manager You can experiment with changing replicas’ count in the CRD and observe how these changes are reflected in the IRIS instances count. Operator-SDK Another handy tool to generate the operator code is Operator SDK. To get the initial idea of this tool, have a look at this tutorial. You should install operator-sdk first.For our simple use case, the process will look similar to the one we’ve worked on with kubebuilder (you can delete/create the kind cluster with the Docker registry before continuing). Run in another directory: $ mkdir iris $ cd iris $ go mod init iris $ operator-sdk init --domain=myardyas.club $ operator-sdk create api --group=test --version=v1alpha1 --kind=Iris # Answer two ‘yes’ Now change the IrisSpec and IrisStatus structures in the same file – api/v1alpha1/iris_types.go.We’ll use the same iris_controller.go file as we did in kubebuilder. Don’t forget to add the Recorder field in the main.go file.Because kubebuilder and operator-sdk use different versions of the Golang packages, you should add a context in the SetupWithManager function in controllers/iris_controller.go: ctx := context.Background() if err := mgr.GetFieldIndexer().IndexField(ctx, &apps.Deployment{}, deploymentOwnerKey, func(rawObj runtime.Object) []string { Then, install the CRD and the operator (make sure that the kind cluster is running): $ make install $ docker build . -t localhost:5000/iris-operator:v0.2 $ docker push localhost:5000/iris-operator:v0.2 $ make deploy IMG=localhost:5000/iris-operator:v0.2 You should now see the CRD, operator pod, and IRIS pod(s) similar to the ones we’ve seen when we worked with kubebuilder. Conclusion Although a controller includes a lot of code, you’ve seen that changing the IRIS replicas is just a matter of changing a line in a custom resource. All the complexity is hidden in the controller implementation. We’ve looked at how a simple operator can be created using handy scaffolding tools. Our operator cared only about IRIS replicas. Now imagine that we actually need to have the IRIS data persisted on disk – this would require StatefulSet and Persistent Volumes. Also, we would need a Service and, perhaps, Ingress for external access. We should be able to set the IRIS version and system password, Mirroring and/or ECP, and so on. You can imagine the amount of work InterSystems had to do to simplify IRIS deployment by hiding all the IRIS-specific logic inside operator code. In the next article, we’re going to look at IRIS Operator (IKO) in more detail and investigate its possibilities in more complex scenarios. Great intro to K8s CRDs @Mikhail.Khomenko ! Thank you @Luca.Ravazzolo -)
Announcement
Anastasia Dyubaylo · Feb 2, 2021

InterSystems Multi-Model Contest: Give Us Your Feedback!

Hey developers, As you know, the InterSystems Multi-Model contest has already ended. And now we want to get feedback from those developers who were unable to participate. Please answer some questions to help us improve our contests! 👉🏼 Quick survey: InterSystems Multi-Model Contest Survey Or please share your thoughts in the comments to this post!
Article
Evgeny Shvarov · Jan 24, 2021

Deploying InterSystems IRIS Data Using ZPM Package Manager

Hi developers! Often we need to deploy some data along with code pieces of the application. And for InterSystems IRIS developers the question could sound: "How can I deploy the data I have in globals?" Here I want to suggest to you one of the approaches - deploying global data using the ZPM package manager. Exporting Globals Data Suppose you have the IRIS database server where you have the global which you want to deploy. The ZPM package manager can deploy files so you need to export the global into a file and build the package with this file. ZPM can deploy globals in XML format, so we need to export a global in an XML file first. E.g. if the global you need to export has the name "DataD" the following command in the IRIS terminal will export the global DataD in XML file: d $System.OBJ.Export("DataD.GBL","/irisrun/repo/data/DataD.xml") How the Resource Looks Like To build the package with a global we should introduce certain resource element in module XML like: <Resource Name="DataD.GBL"/> See the example in documentation. Notice this resource element will look for the DataD.XML file, not DataD.GBL as you could expect. And ZPM will look for the DataD.XML file in the /gbl folder inside the folder listed in <SourceRoot> element. Example Here is a sample repository iris-dataset-countries which contains a package that deploys global with the data on different countries. Here is the module XML: <?xml version="1.0" encoding="UTF-8"?> <Export generator="Cache" version="25"> <Document name="dataset-countries.ZPM"> <Module> <Name>dataset-countries</Name> <Description>Module imports the data of Country passengers in dc.data.Tinanic class</Description> <Version>1.0.0</Version> <Packaging>module</Packaging> <SourcesRoot>src</SourcesRoot> <Resource Name="dc.data.Country.CLS"/> <Resource Name="dc.data.CountryD.GBL"/> </Module> </Document> </Export> And we could see the resource: <Resource Name="dc.data.CountryD.GBL"/> Which is located in /src/gbl/dc.data.CountryD.XML file in the repository: So when ZPM loads the module into IRIS it imports the global according to the module.xml. You can test install the global (and the class for it to make queries) with: USER>zpm "install dataset-countries" Or you are welcome to play with global packaging with the Countries or Titanic datasets.
Announcement
Anastasia Dyubaylo · May 9, 2020

The 3rd Programming Contest: InterSystems IRIS Native API

Hi Developers! We are pleased to announce the next competition in creating open-source solutions using InterSystems IRIS Data Platform! Please welcome the third InterSystems IRIS Online Programming Contest for Developers! And the topic for this contest is InterSystems IRIS Native API. The contest will last three weeks: May 18 – June 7, 2020. Prizes 1. Experts Nomination - winners will be determined by a specially selected jury: 🥇 1st place - $2,000 🥈 2nd place - $1,000 🥉 3rd place - $500 2. Community Nomination - an application that will receive the most votes in total: 🥇 1st place - $1,000 🥈 2nd place - $500 If several participants score the same amount of votes they all are considered as winners and the money prize is shared among the winners. Also, we will provide winners with high-level badges on Global Masters. Who can participate? Any Developer Community member from any country can participate in a contest, except for InterSystems employees. Create an account! Contest Period May 18-31, 2020: Two weeks to upload your applications to Open Exchange (also during this period, you can edit your projects). June 1-7, 2020: One week to vote. All winners will be announced on June 8th, 2020. The Topic ➡️ InterSystems IRIS Native API ⬅️ We will choose the best applications that meet the IRIS NATIVE API requirement. Your application could be a library, package, tool, or any solution which uses any of InterSystems IRIS Native API: .NET, Java, Python, Node.js. Learn more here. The application should work either on InterSystems IRIS Community Edition or on InterSystems IRIS for Health Community Edition. The application should be Open Source and published on GitHub. And you'll have technology bonuses if you introduce special technology implementations in your application. Technology bonuses 1. Docker container - 1 expert point The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. When cloned or downloaded the application should be runnable with: $ docker-compose up -d Sample ApplicationsNative API Contest Template – demonstrates all 4 NativeAPIs setup and work. The template satisfies the "Docker container" technology bonus. Also, check the related video. Helpful Resources 1. How to submit an application to a contest: Publish an application on Open Exchange and Submit an application for the contest 2. Getting started with InterSystems IRIS Native API: Java, .NET, Python and Node.js 3. Documentation on Native API: Python, Java, .NET, Node.js 3. Videos: InterSystems IRIS and Node.js and Globals Quickstart 4. Online courses for Native API Judgment Please find the Judgment and Voting Rules for the Contest here. So! Ready. Set. Code. Stay tuned, the post will be updated! ❗️ Please check out the Official Contest Terms here.❗️ Idea for contestants. Julyter Notebooks kernel for InterSystems ObjectScript. Recently I developed bidirectional integration for Jupyter Notebooks. It allows you to create intelligent Business Processes with Python activities. Here's the code (it uses Native API for Python and there's less than a 1000 sloc in the whole integration). Here's some screenshots: However, as you see currently only BPLs with Python are supported. The idea for the app is simple - to do the reverse - add the ability for Julyter Notebooks to execute InterSystems ObjectScript code. Why? It's a great tool for quick prototyping and demos! How? Using Native API develop a wrapper kernel for InterSystems ObjectScript. Essentially all you need to do is to execute arbitrary string of code and return result. Check WebTerminal source code (by @Nikita.Savchenko7047) to see how a similar application works. Docs: Wrapper Kernel docs List of Kernel Implementations More docs (all possible approaches) Nice idea! Thanks, Ed! Made an update on technology bonus and sample application: Technology bonuses 1. Docker container - 1 expert point The application gets a 'Docker container' bonus if it uses InterSystems IRIS running in a docker container. When cloned or downloaded the application should be runnable with: $ docker-compose up -d Sample ApplicationsNative API Contest Template - demonstrates all 4 NativeAPIs setup and work. The template satisfies the "Docker container" technology bonus. A video that describes how to use the IRIS Native API contest template. Made by @Robert.Kuszewski Hi Developers! Only 3 days left before the start of the 3rd InterSystems Online Programming Contest! You will have 2 weeks (May 18-31) to upload your solutions to the Open Exchange (also during this period, you can edit your projects) and one week to compete for the main prizes. So join our competition and win! 💪 Hi Community! The registration period has already begun! Follow our Contest Board and stay tuned. Waiting for your cool projects! Hey Developers, The first application is already in the Contest Board! @Robert Cemper and his project WebSocket Client JS with IRIS Native API as Docker Micro Server. And who's next? 😉 Hi Developers! Upload your applications to the Open Exchange and we'll see them on the Contest Board! Let everyone know about your cool app! 💪 Hey Developers! Our Contest Board is waiting for your apps! 🔥 How to apply for the Programming Contest Log in to Open Exchange, open your applications section. Open the application which you want to apply for the contest and click Apply for Contest. Make sure the status is 'Published'. The application will go for the review and if it fits the topic of the contest the application will be listed on the Contest Board. Participate in the contest as a team! Possible? - Yes! We don't have "forming teams" UI at the moment, but you are welcome to form a team by yourself, .e.g. using use Direct Messages on the Developer Community or chatting in Discord channel, make the project and submit it under anyone name from a team! Developers! You have 9 days to submit your application for the InterSystems IRIS Online contest! Don't hesitate to submit if you didn't finish it - you'll be able to fix the bugs and make improvements during the voting week too! Hey developers! The second week of registration has gone! It's time to submit your cool apps on our Contest Board! 🤩 Also during this period, you can edit your projects. Stay tuned! Hi Developers! Enjoy watching the recording of the Kick-Off Webinar for InterSystems IRIS Native API Online Programming Contest: This video describes the Native API Contest Template that demonstrates all 4 NativeAPIs setup and work. This template will help you to get started with the contest. Stay tuned! ✌🏼 Hey Developers, One more application is already in the game: iris-python-covid19 project by @Renato.Banzai! And who's next? 👀 Developers! Don't hesitate to submit your app to the Contest Board! Only5 days left! 🔥 Hey guys, You're very welcome to join the InterSystems Developers Discord Channel to discuss all topics and questions related to the IRIS Programming Contests. There are lively discussions with InterSystems developers! Join us! 😎 Hello @Eduard.Lebedyuk ! How are you? I was thinking about your idea. At least for now I dont know how the native api could help to create a ObjectScript Kernel for Jupyter, are you at community discord? If so, call me there and would be good to talk about this =) best regards Hey Developers, The next application is already in the game: ObjectScript Kernel project by @Nikita Mullin! And who's next? 🤩 Hello, @Eduard.Lebedyuk I've implemented your idea here: ObjectScript Kernel Great! Another topic for this Native API contest could be "Import-export" util of global to JSON. E.g. import JSON file and have a global inside IRIS, and having an arbitrary global inside IRIS export it to the JSON file. Hey Developers! 3 new applications joined our game: IRISGlobalsNative.Extensions project by Mark Erwin Villarina MongoDB to IRIS migration project by Oleh Dontsov OData Server for IRIS project b @Yuri Gomes Please see the full list of apps on our Contest Board. Note: Today is the last day of registration. If you have not submitted your application yet, hurry up! 🔥 Last call! Registration for the InterSystems IRIS Native API Programming Contest ends today! Hurry up to upload your application(-s) 😉 Yeah, +1 in the Contest Board! Check out the new project: CRUD-GLOBALS-IRISNATIVEAPI-JAVA project by @Muni.Ganesh Don't miss your chance to win! 🏆 Hello, @Evgeny.Shvarov. JSON import has been added to the new version of IRIS import manager Cool! Do you mean the import of any JSON file to a Global? How can I try it? To import, just insert the body of the JSON file with any structure. If it’s more convenient to upload a file, I’ll add this functionality to one of the following releases. You can read how to use it in the description of the application, and see examples of its use in this article.
Announcement
Anastasia Dyubaylo · Jul 13, 2020

Vote for the best app in the InterSystems IRIS AI Programming Contest!

Hey Developers! This week is a voting week for the InterSystems IRIS AI Programming Contest! So, it's time to give your vote to the best AI- and ML-enabled solution on InterSystems IRIS! 🔥 You decide: VOTING IS HERE 🔥 How to vote? This is easy: you will have one vote, and your vote goes either in Experts Nomination or in Community Nomination. Experts Nomination If you are InterSystems Product Manager, or DC moderator, or Global Master from Specialist level and above cast your vote in the Expert nomination. Community Nomination If you ever contributed to DC (posts or replies) and this was not considered as spam you are able to vote for the applications in the Community nomination. Voting Voting takes place on the Open Exchange Contest Page and you need to sign in to Open Exchange — you can do it with your DC account credentials. If you changed your mind, cancel the choice and give your vote to another application - you have 7 days to choose! Contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases! ➡️ Also, please check out the Judgment and Voting Rules for the Contest here. Ok! After the first day of the voting we have: Expert Nomination, Top 3 iris-ml-suite – 3 iris-facial-recognition – 3 iris-integratedml-monitor-example – 3 ➡️ The leaderboard. Community Nomination, Top 3 iris-ml-suite – 2 iris-facial-recognition – 1 iris-integratedml-monitor-example – 1 ➡️ The leaderboard. So, the voting continues. Please support the application you like with your vote! Hey Developers, Here are the results after 2 days of voting: Expert Nomination, Top 2 iris-integratedml-monitor-example – 9 iris-ml-suite – 3 ➡️ The leaderboard. Community Nomination, Top 4 iris-ml-suite – 2 iris-facial-recognition – 2 iris-integratedml-monitor-example – 2 ESKLP – 2 ➡️ The leaderboard. Participants! Improve and promote your solutions! Full speed ahead! Voting for the AI Programming Contest goes ahead! And here're the results at the moment: Expert Nomination, Top 3 iris-integratedml-monitor-example – 9 iris-ml-suite – 6 ESKLP – 3 ➡️ The leaderboard. Community Nomination, Top 3 iris-integratedml-monitor-example – 3 iris-ml-suite – 2 ESKLP – 2 ➡️ The leaderboard. And here are the current results: Expert Nomination, Top 3 iris-integratedml-monitor-example – 16 iris-ml-suite – 10 SAPPHIRE – 6 ➡️ The leaderboard. Community Nomination, Top 3 iris-integratedml-monitor-example – 4 SAPPHIRE – 4 ESKLP – 3 ➡️ The leaderboard. Keep voting!Our participants need your support! Hey Developers! And this is the last day fo Voting in our AI Programming Contest before we know the names of the winners! ✅ Please make your choice! ✅
Article
Nikolay Solovyev · Oct 9, 2020

InterSystems Package Manager ZPM 0.2.7 release

We released a new version of ZPM, with a set of great enhancements: $zpm function new arguments for search command and more! See the details below $zpm function With $zpm function you can execute ZPM commands programmatically and get the status. set sc=$zpm("install new-module") Search command Most often, ZPM works with the pm.community.intersystems.com registry. Now more than 100 applications are published in this registry, and their number is constantly increasing.We've added an argument to the search command that lets you specify the application name or part of the application name. zpm: USER>search zpmregistry https://pm.community.intersystems.com:zpm 0.2.7 Use an asterisk for any sequence of characters zpm: USER>search zpm*registry https://pm.community.intersystems.com:zpm 0.2.7zpm-registry 1.0.9zpmshow 1.0.1 We added the -d (-description) flag.When this flag is specified, a short description will be shown for each package in the list of found packages. Package authors should specify the description in the module.xml filе. Dark theme If you are using a dark theme in terminal (or VS Code) try this new feature in ZPM which will affect the output in the search command. Use config set ColorScheme dark to set dark theme, and config delete ColorScheme to reset to default @Nikolay.Soloviev $zpm function is excellent news! It allows us now to run ZMP install also remote to multiple instances of IRISusing IRIS Native API for ObjectScript ! This means to me: distributed installation without login to SMP or Studio or Terminal. Thanks for this improvement! I really like the opportunity to see which modules are installed in which namespaces. And quickly go there without leaving the shell of the ZPM. ``` zpm: USER>help zn namespace [] Alias: zn See list modules in namespace and go to the namespace Arguments name Name namespace, * or context name* Examples zn * Show all modules in all namespaces zn sql* Show all modules in namespaces by context ```
Announcement
Evgeny Shvarov · Jan 29, 2021

Technology Bonuses for Applications - Participants of InterSystems Multi-Model Contest

Hi developers! We had a set of technology bonuses for the InterSystems Multi-Model contest. And here is how projects collected it: Project Docker zpm Key-Value SQL Object Your Model Total Bonus zapm 2 2 2 2 2 10 iris-vaccine-tracker 2 2 2 2 2 10 qewd-jsdb-kit-iris 2 2 2 6 BeI-MultiModel 2 2 2 2 2 10 iris-image-index-demo 2 2 2 2 2 2 12 IRIS Publisher 2 2 2 2 8 iris-sftp-logs 2 2 2 2 2 10 iris-multimodel-suite 2 2 2 2 2 10 GeoDatas 2 2 2 6 HealthInfoQueryLayer 2 2 2 6 This table is subject to change upon project improvements or if we missed something. Fill free to claim the bonus in the comments here or on discord. Stay tuned!
Announcement
Anastasia Dyubaylo · Mar 1, 2021

InterSystems Grand Prix Contest: Vote fo the Best Apps!

Hey Developers, This week is a voting week for the InterSystems Grand Prix Contest! So, it's time to give your vote to the best solutions built with InterSystems IRIS. 🔥 You decide: VOTING IS HERE 🔥 How to vote and what's new? Any developer can vote for their application - votes will be counted in both Expert and Community nominations automatically (in accordance with the Global Masters level). All InterSystems employees can vote in both Expert and Community nominations. With the voting engine and algorithm for the Experts and Community nomination, you can select 3 projects: the 1st, the 2nd, and the 3rd place upon your decision. This is how it works for the Community leaderboard: Community Leaderboard: Place Points 1st 3 2nd 2 3rd 1 And there will be more complex math for the Experts leaderboard, where different levels of experts have more "points" power: Experts Leaderboard: Level Place 1st 2nd 3rd VIP level in GM, Moderators, Product Managers 9 6 3 Expert level in Global Masters 6 4 2 Specialist level in Global Masters 3 2 1 Experts' votes will also contribute 3-2-1 points to the Community leaderboard too. Voting 1. Sign in to Open Exchange – DC credentials will work. 2. Make any valid contribution to Developer Community – answer or ask questions, write an article, contribute applications on Open Exchange - and after 24 hours you'll be able to vote. Check this post on the options to make helpful contributions to the Developer Community. If you changed your mind, cancel the choice and give your vote to another application – you have 7 days to choose! Contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases! ➡️ Also, please check out the full voting rules for InterSystems online contest here. Hi Community, Don't forget to support the application you like! ➡️ Voting here ⬅️ Hi Developers, just to remind you that you can help each other making pull requests and report about bugs on GitHub to make applications even greater! On Global Masters we award points: 500 points for a submitted pull request + 500 bonus points if PR is merged 500 points for a bug report + 2,500 points more if the bug is fixed (closed) More info about these challenges in this article. Voting for the InterSystems Grand Prix Contest goes ahead! And here're the results at the moment: Expert Nomination, Top 3 vscode-intersystems-iris – 83 iris-rad-studio – 78 HealthInfoQueryLayer – 60 ➡️ The leaderboard. Community Nomination, Top 3 vscode-intersystems-iris – 79 iris-rad-studio – 72 HealthInfoQueryLayer –71 ➡️ The leaderboard. There were a lot of questions on how to vote: active contributing members of the Developer Community are eligible to vote - 24 hours after the first contribution. The contribution should be helpful to the community to let DC moderators faster decide on the approval. The examples of helpful contributions are listed here. Hello everyone, There is a lot of good application here, good luck to every team they deserve it! Developers! Only 1 day left before the end of voting. Please check out the Contest Board and vote for the solutions you like! 👍🏼
Announcement
Anastasia Dyubaylo · Apr 27, 2020

Voting in the 2nd InterSystems IRIS Online Programming Contest!

Hi Community! The registration phase for the second InterSystems Online Programming Contest has already ended, and now the voting week begins! We have 7 applications - so you have a set of applications to choose from! How to vote? This is easy: you will have one vote, and your vote goes either in Experts Nomination or in Community Nomination. Experts Nomination If you are InterSystems Product Manager, or DC moderator, or Global Master from Specialist level and above cast your vote in the Expert nomination. Community Nomination If you ever contributed to DC (posts or replies) and this was not considered as spam you are able to vote for the applications in the Community nomination. Voting Voting takes place on the Open Exchange Contest Page and you need to sign in to Open Exchange - you can do it with your DC account credentials. If you changed your mind, cancel the choice and give your vote to another application - you have 7 days to choose! Contest participants are allowed to fix the bugs and make improvements to their applications during the voting week, so don't miss and subscribe to application releases! Winner criteria Choose the application you like most. But the general criteria are: Idea and value - the app makes the world a better place or makes the life of a developer better at least; Functionality and usability - how well and how much the application/library does; The beauty of code - has a readable and qualitative ObjectScript code. So, developers! Give the vote to the best solution on InterSystems IRIS! You decide! Ok! After the first day of the voting we have: Expert Nomination, Top 3 Production Manager – 8 JSON-Filter – 5 EXCEL as a REST application – 3 ______________ The leaderboard. Community Nomination, Top 3 iris-history-monitor – 15 simple-spellchecker – 6 Production Manager – 2 ______________ The leaderboard. Developers! Support the applications you like! Participants! Improve and promote your solutions! The second day of voting is going on! Have you cast your vote yet? Vote for the best app in two winning nominations: 🏆 Experts Nomination - the best application that will be selected by a special jury of InterSystems Experts. 🏆 Community Nomination - the best application that will be chosen by a majority vote of all DC Contributors. So ladies and gentlemen, make your bets! Here are the results after 2 days of voting: Expert Nomination, Top 3 Production Manager – 11 JSON-Filter – 7 iris-history-monitor – 3 ➡️ The leaderboard. Community Nomination, Top 3 iris-history-monitor – 16 simple-spellchecker – 7 Production Manager – 2 ➡️ The leaderboard. So, the voting continues! Full speed ahead! So! At the moment we have the next results of the voting: Expert Nomination, Top 3 Production Manager – 14 JSON-Filter – 7 iris-history-monitor – 6 ➡️ The leaderboard. Community Nomination, Top 3 iris-history-monitor – 16 simple-spellchecker – 7 Production Manager – 2 ➡️ The leaderboard. Keep voting!Our participants need your support! Hey Developers! 3 days left before the end of voting! Please check out the Contest Board and vote for the applications you like! 👍🏼 And here are the current results: Expert Nomination, Top 3 Production Manager – 16 iris-history-monitor – 11 JSON-Filter – 7 ➡️ The leaderboard. Community Nomination, Top 3 iris-history-monitor – 16 simple-spellchecker – 7 Production Manager – 2 ➡️ The leaderboard. Support the best apps with your votes! Happy weekends!
Article
Yuri Marx · Dec 24, 2020

InterSystems IRIS BI User Portal Artifacts into Container Classes

The InterSystems IRIS has a very nice container class to allows you have your Dashboards as classes source code. It is %DeepSee.UserLibrary.Container. With this class is possible group all your dashboard and pivot table definitions. This is useful to automatically create your dashboards when you build your docker project and other automation scenarios. See: Class dc.WebsiteAnalyzer.WebsiteAnalyzerBIContainer Extends %DeepSee.UserLibrary.Container { XData Contents [ XMLNamespace = "http://www.intersystems.com/deepsee/library" ] { <items> <dashboard xmlns="http://www.intersystems.com/deepsee/library" name="WebsiteAnalyzerDashboard" folderName="dc/WebsiteAnalyzer" title="Website NLP Analysis" description="" keywords="" owner="" shared="true" public="true" locked="false" resource="" timeCreated="2020-12-24T08:29:58.107Z" createdBy="_SYSTEM" category="WebsiteAnalyzer" bookCover="" scheme="" worklistCount="2" snapTo="true" snapGrid="true" gridRows="10" gridCols="10" canResize="true" canModify="true" showTitleBar="true" titleBarOpacity="" titleBarColor="" selectedTitleBarOpacity="" selectedTitleBarColor="" titleBarTextColor="" selectedTitleBarTextColor="" titleBarFont="" companyName="" companyLogo="" companyStyle="" backgroundColor="white" backgroundImage="none" backgroundRepeat="no-repeat" backgroundSize="100% 100%" backgroundOpacity="1" widgetBorders="1px solid #F0F0F0" widgetBordersSwitch="edit" widgetBordersColor="#F0F0F0" widgetBordersStyle="solid" widgetBordersWidth="1" widgetBordersToggle="true"> <widget name="WebsiteAnalyzerTableWidget" type="pivot" subtype="pivot" subtypeClass="lineChart" title="" dataSource="TopEntities.kpi" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="0" homeColL="0" colSpanL="5" rowSpanL="5" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList=""> </widget> <widget name="WebsiteAnalyzerChartWidget" type="pivot" subtype="barChart" subtypeClass="barChart" title="" dataSource="TopEntities.kpi" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="0" homeColL="5" colSpanL="5" rowSpanL="5" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList=""> </widget> </dashboard> </items> } } So, you create your dashboards and pivot tables, connect to your instance using VSCode, go to other and get your dashboard and pivot definitions. Finally paste these definitions in your container class. Easy! See: This sample can be found in this the Open Exchange link. Nice dashboards, @Yuri.Gomes! Try with DSW too? In fact this class is maybe good for deployment, but not that perfect for source-control. You have ALL your DFI in the repo in one file. So when you have changes or will want to make changes you need to deal with this container class. You can export DFI as files (using isc.dev) and import it then with %SYSTEM.OBJ.ImportDir or ZPM. How to export DFI using isc.dev. First you setup the folder you export it into: do ##class(dev.code).workdir("/irisdev/app/src") Then when you need to export changes call in the terminal: d ##class(dev.code).export("*.DFI") Repo with DFI exported The line which imports it into container OR ZPM My next step! I agree, if you have many dashboards isc dev is good. I liked the container class, because I like to have all the work into classes, including the dashboards. And you have the option to have one class by a dashboard, to have more control.
Announcement
Anastasia Dyubaylo · Dec 16, 2020

New Video: Embedded Python in InterSystems IRIS: Sneak Peek

Hi Developers, Get a preview of the upcoming Embedded Python feature of InterSystems IRIS: ⏯ Embedded Python in InterSystems IRIS: Sneak Peek Subscribe to InterSystems Developers YouTube and stay tuned! The "Trying embedded Python was great", Can't wait to try it out Nigel
Announcement
Anastasia Dyubaylo · May 13, 2020

Webinar: InterSystems IRIS Native API Contest Kick-Off

Hi Community! We are glad to invite all the developers to the upcoming InterSystems IRIS Native API Contest Kick-Off Webinar! The topic of this webinar is dedicated to the 3rd IRIS Programming Contest. Date & Time: Monday, May 18 — 9:00 AM EDT Speakers: @Robert.Kuszewski, InterSystems Product Manager@Evgeny.Shvarov, InterSystems Developer Ecosystem Manager What awaits you? Please check the agenda below: 1. The topic – InterSystems IRIS Native API Description Demo 2. Technology bonus: Docker container 3. Programming contest general terms: Who can participate Nominations Judgment How to submit the app 4. Questions and Open Conversation We will be happy to talk to you at our webinar! ➡️ REGISTER TODAY! Hey Developers! The webinar will start in a few hours. You still have a time to REGISTER TODAY!
Announcement
Anastasia Dyubaylo · Feb 3, 2021

New Video: Using the InterSystems iKnow Engine in Python

Hi Community, Find out how you can use the open-source iKnow engine in Python within InterSystems IRIS. ⏯ Using the InterSystems iKnow Engine in Python Subscribe to InterSystems Developers YouTube and stay tuned!
Announcement
Jeff Fried · Mar 26, 2021

Maintenance releases are Generally Available for Caché, Ensemble, and InterSystems IRIS

Three new sets of maintenance releases are now available: Caché 2018.1.5, Ensemble 2018.1.5, and HSAP 2018.1.5 InterSystems IRIS 2019.1.2, IRIS for Health 2019.1.2, and HealthShare Health Connect 2019.1.2 InterSystems IRIS 2020.1.1, IRIS for Health 2020.1.1, and HealthShare Health Connect 2020.1.1 Installation kits and containers can be downloaded from the WRC Software Distribution site. These are maintenance releases with many updates across a wide variety of areas. For information about the corrections in these releases, refer to the documentation for that version, which includes a Release Notes and Upgrade Checklist, and a Release Changes list, as well as the Class Reference and a full set of guides, references, tutorials, and articles. All documentation can be reached via docs.intersystems.com. New platform support has also been added to these releases. In particular, Ubuntu 20.04 LTS support has been added to all releases, IBM AIX 7.1 and 7.2 for System p-64 support has been added to 2019.1.2 (and was already in 2020.1), and ARM64 support for Linux was added to 2020.1.1. For details, see the Supported Platforms document for each release. Build numbers for these releases are shown in the table below: Version Product Build number 2018.1.5 Caché and Ensemble 2018.1.5.659.0 2018.1.5 Caché Evaluation 2018.1.5.659.0su 2018.1.5 HealthShare Health Connect (HSAP) 2018.1.5HS.9056.0 2019.1.2 InterSystems IRIS 2019.1.2.718.0 2019.1.2 IRIS for Health 2019.1.2.718.0 2019.1.2 HealthShare Health Connect 2019.1.2.718.0 2020.1.1 InterSystems IRIS 2020.1.1.408.0 2020.1.1 IRIS for Health 2020.1.1.408.0 2020.1.1 HealthShare Health Connect 2020.1.1.408.0 2020.1.1 InterSystems IRIS Community 2020.1.1.408.0 2020.1.1 IRIS for Health Community 2020.1.1.408.0 2020.1.1 IRIS Studio 2020.1.1.408.0 Very exciting!! Congratulations to all involved in getting these out the door :)